120 lines
2.8 KiB
Python
120 lines
2.8 KiB
Python
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 |