56 lines
1.6 KiB
Python
56 lines
1.6 KiB
Python
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
|
|
],
|
|
}
|