101 lines
2.5 KiB
Python
101 lines
2.5 KiB
Python
from pydantic import BaseModel
|
|
from datetime import datetime
|
|
from typing import List, Optional
|
|
|
|
class ReceiptRequest(BaseModel):
|
|
id: str
|
|
file_name: str
|
|
upload_date: datetime
|
|
receipt_date: datetime
|
|
amount: float
|
|
tax: float
|
|
vendor: str
|
|
category: str
|
|
|
|
class TransactionRequest(BaseModel):
|
|
id: str
|
|
transaction_date: datetime
|
|
amount: float
|
|
vendor: str
|
|
notes: str
|
|
|
|
# New: QuickBooks specific models
|
|
class QuickBooksTransaction(BaseModel):
|
|
"""Raw QuickBooks transaction data"""
|
|
id: str
|
|
txn_date: str # QuickBooks date format
|
|
amount: float
|
|
payee_name: str # QuickBooks vendor field
|
|
memo: Optional[str] = None
|
|
account_name: Optional[str] = None
|
|
txn_type: Optional[str] = None
|
|
|
|
class QuickBooksImportRequest(BaseModel):
|
|
"""Request to import QuickBooks transactions"""
|
|
transactions: List[QuickBooksTransaction]
|
|
date_range: Optional[dict] = None
|
|
account_filter: Optional[str] = None
|
|
|
|
class QuickBooksImportResponse(BaseModel):
|
|
"""Response from QuickBooks import"""
|
|
imported_count: int
|
|
converted_transactions: List[TransactionRequest]
|
|
errors: List[str] = []
|
|
|
|
class MatchResponse(BaseModel):
|
|
receipt_id: str
|
|
transaction_id: str
|
|
confidence_score: float
|
|
match_reason: str
|
|
receipt_vendor: str
|
|
receipt_amount: float
|
|
transaction_vendor: str
|
|
transaction_amount: float
|
|
|
|
class MatchingRequest(BaseModel):
|
|
receipts: List[ReceiptRequest]
|
|
transactions: List[TransactionRequest]
|
|
|
|
class MatchingResponse(BaseModel):
|
|
matches: List[MatchResponse]
|
|
stats: dict
|
|
|
|
class ApprovalRequest(BaseModel):
|
|
match_id: str
|
|
user_id: str
|
|
action: str # "approve" or "reject"
|
|
reason: Optional[str] = None
|
|
|
|
class RuleRequest(BaseModel):
|
|
name: str
|
|
condition: str
|
|
action: str
|
|
source: str = "user"
|
|
|
|
class DocumentUploadResponse(BaseModel):
|
|
file_id: str
|
|
filename: str
|
|
file_type: str
|
|
upload_date: datetime
|
|
status: str
|
|
|
|
class DocumentProcessResponse(BaseModel):
|
|
file_id: str
|
|
extraction_success: bool
|
|
vendor: 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
|
|
|
|
class DriveSyncRequest(BaseModel):
|
|
folder_id: Optional[str] = None
|
|
auto_process: bool = True
|
|
|
|
class DriveSyncResponse(BaseModel):
|
|
files_processed: int
|
|
successful_extractions: int
|
|
failed_extractions: int
|
|
results: List[DocumentProcessResponse] |