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)
|