from pydantic import BaseModel from datetime import datetime from typing import List, Optional class AddressRequest(BaseModel): province: str city: str postal_code: str country: str = "Canada" class ReceiptRequest(BaseModel): id: str file_name: str upload_date: datetime receipt_date: datetime amount: float tax: float vendor: str category: str description: str # Tax rule fields billing_address: Optional[AddressRequest] = None shipping_address: Optional[AddressRequest] = None currency: str = "CAD" is_meals_entertainment: bool = False class TransactionRequest(BaseModel): id: str transaction_date: datetime amount: float vendor: str notes: str # Tax rule fields currency: str = "CAD" fx_rate: Optional[float] = None class AssetRequest(BaseModel): id: str name: str purchase_date: datetime purchase_amount: float useful_life_years: int residual_value: float cca_rate: float asset_class: str class MatchingRequest(BaseModel): receipt_ids: List[str] transaction_ids: List[str] class MatchResponse(BaseModel): receipt_id: str transaction_id: str confidence_score: float match_reason: str tax_analysis: Optional[dict] = None # Currency information receipt_currency: str = "CAD" transaction_currency: str = "CAD" currency_match: bool = True class MatchingResponse(BaseModel): matches: List[MatchResponse] stats: dict class ApprovalRequest(BaseModel): match_id: str approved: bool reason: Optional[str] = None class RuleRequest(BaseModel): name: str condition: str action: str source: str = "user" class DocumentUploadResponse(BaseModel): file_id: str filename: str upload_date: datetime status: str class DocumentProcessResponse(BaseModel): file_id: str extraction_success: bool vendor: Optional[str] = None description: Optional[str] = None total_amount: Optional[float] = None tax_amount: Optional[float] = None date: Optional[str] = None category: Optional[str] = None confidence: Optional[float] = None error: Optional[str] = None # New tax-related models class TaxCalculationRequest(BaseModel): receipt_id: str transaction_id: Optional[str] = None class TaxCalculationResponse(BaseModel): receipt_id: str rules_applied: List[str] sales_tax: dict fx_analysis: Optional[dict] = None meals_entertainment: dict class DepreciationRequest(BaseModel): asset: AssetRequest year: int method: str # "straight_line" or "cca" class DepreciationResponse(BaseModel): asset_id: str year: int method: str depreciation: float book_value: float total_depreciation: Optional[float] = None success: bool error: Optional[str] = None