Complete CarPass product flows

This commit is contained in:
VPN SaaS Dev
2026-05-14 21:19:37 +09:00
parent a83f55c646
commit c0014ab4ea
28 changed files with 3006 additions and 159 deletions

55
app/api/parser.py Normal file
View 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
],
}