59 lines
1.3 KiB
Python
59 lines
1.3 KiB
Python
|
|
from dataclasses import dataclass
|
||
|
|
from datetime import datetime
|
||
|
|
from typing import Optional
|
||
|
|
|
||
|
|
@dataclass
|
||
|
|
class Address:
|
||
|
|
"""Address information for tax calculations"""
|
||
|
|
province: str
|
||
|
|
city: str
|
||
|
|
postal_code: str
|
||
|
|
country: str = "Canada"
|
||
|
|
|
||
|
|
@dataclass
|
||
|
|
class Receipt:
|
||
|
|
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[Address] = None
|
||
|
|
shipping_address: Optional[Address] = None
|
||
|
|
currency: str = "CAD"
|
||
|
|
is_meals_entertainment: bool = False
|
||
|
|
|
||
|
|
@dataclass
|
||
|
|
class Transaction:
|
||
|
|
id: str
|
||
|
|
transaction_date: datetime
|
||
|
|
amount: float
|
||
|
|
vendor: str
|
||
|
|
notes: str
|
||
|
|
# Tax rule fields
|
||
|
|
currency: str = "CAD"
|
||
|
|
fx_rate: Optional[float] = None
|
||
|
|
|
||
|
|
@dataclass
|
||
|
|
class Asset:
|
||
|
|
"""Asset for depreciation calculations"""
|
||
|
|
id: str
|
||
|
|
name: str
|
||
|
|
purchase_date: datetime
|
||
|
|
purchase_amount: float
|
||
|
|
useful_life_years: int
|
||
|
|
residual_value: float
|
||
|
|
cca_rate: float # Capital Cost Allowance rate
|
||
|
|
asset_class: str
|
||
|
|
|
||
|
|
@dataclass
|
||
|
|
class Match:
|
||
|
|
receipt: Receipt
|
||
|
|
transaction: Transaction
|
||
|
|
confidence_score: float
|
||
|
|
match_reason: str
|
||
|
|
tax_analysis: Optional[dict] = None
|