Files
ds_quickbooks/api_models.py
T

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]