""" Loan domain models """ from enum import Enum from typing import Optional from datetime import datetime from .base import BaseModel, Metadata class LoanStatus(str, Enum): """Loan status enumeration""" PENDING = "PENDING" APPROVED = "APPROVED" REJECTED = "REJECTED" DISBURSED = "DISBURSED" COMPLETED = "COMPLETED" DEFAULTED = "DEFAULTED" class LoanApplicationRequest(BaseModel): """Canonical loan application request""" user_id: str amount: float purpose: str term_days: Optional[int] = None platform: str trace_id: str idempotency_key: Optional[str] = None metadata: Optional[dict] = None class LoanApplicationResponse(BaseModel): """Canonical loan application response""" loan_id: str status: LoanStatus amount: float approved_amount: Optional[float] = None message: str trace_id: str created_at: datetime n_score: Optional[float] = None rejection_reason: Optional[str] = None class Config: json_encoders = { datetime: lambda v: v.isoformat() if v else None }