File size: 1,667 Bytes
24e6f5b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status, permissions
from .services import forecast_income
from .anomaly import get_anomalies
from .forecast import get_forecast
from finance.utils_mongo import get_user_db_id

class IncomeForecastView(APIView):
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request):
        try:
            days = int(request.query_params.get('days', 30))
            data = forecast_income(get_user_db_id(request.user), days)
            return Response(data)
        except Exception as e:
            return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class AnomalyListView(APIView):
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request):
        try:
            return Response(get_anomalies(get_user_db_id(request.user)))
        except Exception as e:
            return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class ForecastView(APIView):
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request):
        try:
            # Accurate AI-based forecasting (Chronos Bolt + Statistical Fallback)
            data = get_forecast(get_user_db_id(request.user))
            
            if data is None:
                 return Response({"error": "Insufficient data for AI forecast (need >5 days history)"}, status=status.HTTP_400_BAD_REQUEST)
                 
            return Response(data)
        except Exception as e:
            return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)