Spaces:
Running
Running
| from fastapi import APIRouter, Depends, HTTPException | |
| from typing import List, Dict, Any | |
| from app.models.goal_models import ( | |
| ClientProfile, InvestmentGoal, GoalsDashboard, | |
| SIPCalculationRequest, SIPCalculationResponse, | |
| RequiredSIPRequest, RequiredSIPResponse, GoalsDashboardRequest | |
| ) | |
| from app.services.sip_calculator import SIPCalculator | |
| router = APIRouter() | |
| async def get_goals_dashboard(request: GoalsDashboardRequest): | |
| """ | |
| Calculate goals dashboard metrics including total required SIP, shortfall/surplus | |
| """ | |
| try: | |
| total_required_sip = sum(goal.required_sip for goal in request.goals) | |
| shortfall = max(0, total_required_sip - request.monthly_savings) | |
| surplus = max(0, request.monthly_savings - total_required_sip) | |
| return GoalsDashboard( | |
| goals=request.goals, | |
| total_required_sip=total_required_sip, | |
| monthly_savings=request.monthly_savings, | |
| shortfall=shortfall, | |
| surplus=surplus | |
| ) | |
| except Exception as e: | |
| raise HTTPException(status_code=500, detail=f"Error calculating goals dashboard: {str(e)}") | |
| async def calculate_sip( | |
| request: SIPCalculationRequest, | |
| include_yearly_breakdown: bool = False | |
| ): | |
| """ | |
| Calculate SIP maturity amount based on monthly investment, expected return, and time period | |
| """ | |
| try: | |
| calculator = SIPCalculator() | |
| result = calculator.get_sip_calculation(request, include_yearly_breakdown) | |
| return result | |
| except Exception as e: | |
| raise HTTPException(status_code=500, detail=f"Error calculating SIP: {str(e)}") | |
| async def calculate_required_sip(request: RequiredSIPRequest): | |
| """ | |
| Calculate required SIP amount to reach a target amount | |
| """ | |
| try: | |
| calculator = SIPCalculator() | |
| result = calculator.get_required_sip(request) | |
| return result | |
| except Exception as e: | |
| raise HTTPException(status_code=500, detail=f"Error calculating required SIP: {str(e)}") | |
| async def calculate_inflation_adjusted_amount( | |
| target_amount: float, | |
| years: int, | |
| expected_inflation: float | |
| ): | |
| """ | |
| Calculate inflation-adjusted target amount for a goal | |
| """ | |
| try: | |
| inflation_adjusted_amount = target_amount * ((1 + expected_inflation/100) ** years) | |
| calculator = SIPCalculator() | |
| required_sip = calculator.calculate_required_sip(inflation_adjusted_amount, years, 12) | |
| return { | |
| "original_amount": target_amount, | |
| "inflation_adjusted_amount": inflation_adjusted_amount, | |
| "required_sip": required_sip, | |
| "years": years, | |
| "expected_inflation": expected_inflation | |
| } | |
| except Exception as e: | |
| raise HTTPException(status_code=500, detail=f"Error calculating inflation-adjusted amount: {str(e)}") |