from decimal import Decimal from fastapi import APIRouter, Depends from pydantic import BaseModel, Field from app.api.deps import get_current_telegram_user from app.models.user import User from app.services.loans import generate_annuity_schedule, loan_summary from app.services.record_parser import ParsedRecord, parse_record_text router = APIRouter(tags=["parser"]) class ParseRecordRequest(BaseModel): text: str = Field(min_length=1, max_length=4000) class LoanCalculateRequest(BaseModel): principal: Decimal = Field(gt=0) term_months: int = Field(gt=0, le=600) annual_interest_rate: Decimal = Field(ge=0) @router.post("/parse/record", response_model=ParsedRecord) async def parse_record( payload: ParseRecordRequest, current_user: User = Depends(get_current_telegram_user), ) -> ParsedRecord: return parse_record_text(payload.text) @router.post("/loans/calculate") async def calculate_loan( payload: LoanCalculateRequest, current_user: User = Depends(get_current_telegram_user), ) -> dict: summary = loan_summary(payload.principal, payload.term_months, payload.annual_interest_rate) schedule = generate_annuity_schedule( principal=payload.principal, months=payload.term_months, annual_rate=payload.annual_interest_rate, ) return { **summary, "schedule": [ { "number": row.number, "payment": row.payment, "principal": row.principal, "interest": row.interest, "remaining_principal": row.remaining_principal, } for row in schedule ], }