Add POST payoff endpoint
This commit is contained in:
parent
49ef7997a2
commit
35314f4f8b
73
app/resources/payoff.py
Normal file
73
app/resources/payoff.py
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
"""Pay-off endpoints."""
|
||||||
|
from datetime import date
|
||||||
|
from decimal import Decimal
|
||||||
|
from enum import Enum
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
from fastapi import APIRouter
|
||||||
|
from pydantic import BaseModel, Field, validator
|
||||||
|
|
||||||
|
from app.logging import get_logger
|
||||||
|
|
||||||
|
router = APIRouter()
|
||||||
|
logger = get_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class PayoffStatus(str, Enum):
|
||||||
|
"""Enum for payoff status values."""
|
||||||
|
PROCESSED = "processed"
|
||||||
|
PENDING = "pending"
|
||||||
|
FAILED = "failed"
|
||||||
|
CANCELLED = "cancelled"
|
||||||
|
|
||||||
|
|
||||||
|
class PayoffRequest(BaseModel):
|
||||||
|
"""Request model for loan payoff."""
|
||||||
|
loan_id: str = Field(..., description="Loan identifier", min_length=1, max_length=50)
|
||||||
|
payoff_amount: Decimal = Field(..., description="Payoff amount", gt=0, decimal_places=2)
|
||||||
|
payoff_date: date = Field(..., description="Payoff date")
|
||||||
|
borrower_name: Optional[str] = Field(None, description="Borrower name", max_length=100)
|
||||||
|
payment_method: str = Field(..., description="Payment method", regex="^(check|wire|ach|cash)$")
|
||||||
|
notes: Optional[str] = Field(None, description="Additional notes", max_length=500)
|
||||||
|
|
||||||
|
@validator('payoff_date')
|
||||||
|
def validate_payoff_date(cls, v):
|
||||||
|
"""Validate payoff date is not in the future."""
|
||||||
|
from datetime import date
|
||||||
|
if v > date.today():
|
||||||
|
raise ValueError('Payoff date cannot be in the future')
|
||||||
|
return v
|
||||||
|
|
||||||
|
|
||||||
|
class PayoffResponse(BaseModel):
|
||||||
|
"""Response model for loan payoff."""
|
||||||
|
status: PayoffStatus
|
||||||
|
loan_id: str
|
||||||
|
payoff_amount: Decimal
|
||||||
|
payoff_date: date
|
||||||
|
transaction_id: str
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/payoff", response_model=PayoffResponse)
|
||||||
|
async def create_payoff(payoff_request: PayoffRequest) -> PayoffResponse:
|
||||||
|
"""Create a loan payoff record."""
|
||||||
|
|
||||||
|
logger.info(f"Processing payoff for loan {payoff_request.loan_id}")
|
||||||
|
|
||||||
|
# TODO: Add database logic to process payoff
|
||||||
|
# For now, return a mock response
|
||||||
|
|
||||||
|
import uuid
|
||||||
|
transaction_id = str(uuid.uuid4())
|
||||||
|
|
||||||
|
response = PayoffResponse(
|
||||||
|
status=PayoffStatus.PROCESSED,
|
||||||
|
loan_id=payoff_request.loan_id,
|
||||||
|
payoff_amount=payoff_request.payoff_amount,
|
||||||
|
payoff_date=payoff_request.payoff_date,
|
||||||
|
transaction_id=transaction_id
|
||||||
|
)
|
||||||
|
|
||||||
|
logger.info(f"Payoff processed successfully for loan {payoff_request.loan_id}, transaction {transaction_id}")
|
||||||
|
|
||||||
|
return response
|
||||||
3
main.py
3
main.py
@ -9,7 +9,7 @@ from sentry_sdk.integrations.fastapi import FastApiIntegration
|
|||||||
from app.config import settings
|
from app.config import settings
|
||||||
from app.logging import configure_logging, get_logger
|
from app.logging import configure_logging, get_logger
|
||||||
from app.middleware import logging_middleware
|
from app.middleware import logging_middleware
|
||||||
from app.resources import health
|
from app.resources import health, payoff
|
||||||
|
|
||||||
|
|
||||||
def create_app() -> FastAPI:
|
def create_app() -> FastAPI:
|
||||||
@ -43,6 +43,7 @@ def create_app() -> FastAPI:
|
|||||||
|
|
||||||
# Include all endpoint routers
|
# Include all endpoint routers
|
||||||
app.include_router(health.router, tags=["health"])
|
app.include_router(health.router, tags=["health"])
|
||||||
|
app.include_router(payoff.router, tags=["payoff"])
|
||||||
|
|
||||||
return app
|
return app
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user