Complete CarPass product flows
This commit is contained in:
55
app/api/parser.py
Normal file
55
app/api/parser.py
Normal file
@@ -0,0 +1,55 @@
|
||||
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
|
||||
],
|
||||
}
|
||||
Reference in New Issue
Block a user