app.models packageΒΆ

SubmodulesΒΆ

Module contentsΒΆ

Import all models so SQLAlchemy can discover them for metadata.create_all().

class app.models.BankStatement(**kwargs)[source]ΒΆ

Bases: UUIDPrimaryKeyMixin, Base

Statement-level metadata extracted from a CSV bank statement.

account_holder: Mapped[str | None]ΒΆ
account_number: Mapped[str | None]ΒΆ
bank_name: Mapped[str | None]ΒΆ
closing_balance: Mapped[Decimal | None]ΒΆ
currency: Mapped[str | None]ΒΆ
detected_delimiter: Mapped[str | None]ΒΆ
detected_encoding: Mapped[str | None]ΒΆ
detected_format: Mapped[str | None]ΒΆ
document: Mapped[Document]ΒΆ
document_id: Mapped[UUID]ΒΆ
extracted_at: Mapped[datetime]ΒΆ
idΒΆ
opening_balance: Mapped[Decimal | None]ΒΆ
processing_job: Mapped[ProcessingJob]ΒΆ
processing_job_id: Mapped[UUID]ΒΆ
raw_headers: Mapped[dict[str, Any] | None]ΒΆ
statement_from: Mapped[date | None]ΒΆ
statement_to: Mapped[date | None]ΒΆ
total_rows_parsed: Mapped[int | None]ΒΆ
total_rows_skipped: Mapped[int | None]ΒΆ
transactions: Mapped[list[BankTransaction]]ΒΆ
updated_at: Mapped[datetime]ΒΆ
class app.models.BankTransaction(**kwargs)[source]ΒΆ

Bases: UUIDPrimaryKeyMixin, Base

Individual transaction row from a bank statement CSV.

amount: Mapped[Decimal]ΒΆ
balance_after: Mapped[Decimal | None]ΒΆ
bank_statement: Mapped[BankStatement]ΒΆ
bank_statement_id: Mapped[UUID]ΒΆ
created_at: Mapped[datetime]ΒΆ
currency: Mapped[str | None]ΒΆ
description: Mapped[str | None]ΒΆ
direction: Mapped[str]ΒΆ
id: Mapped[UUID]ΒΆ
parse_warnings: Mapped[list[str] | None]ΒΆ
raw_description: Mapped[str | None]ΒΆ
reference_number: Mapped[str | None]ΒΆ
row_index: Mapped[int]ΒΆ
transaction_date: Mapped[date]ΒΆ
transaction_type: Mapped[TransactionType]ΒΆ
value_date: Mapped[date | None]ΒΆ
class app.models.Base(**kwargs: Any)[source]ΒΆ

Bases: DeclarativeBase

metadata: ClassVar[MetaData] = MetaData()ΒΆ

Refers to the _schema.MetaData collection that will be used for new _schema.Table objects.

See also

orm_declarative_metadata

registry: ClassVar[registry] = <sqlalchemy.orm.decl_api.registry object>ΒΆ

Refers to the _orm.registry in use where new _orm.Mapper objects will be associated.

class app.models.Document(**kwargs)[source]ΒΆ

Bases: UUIDPrimaryKeyMixin, TimestampMixin, Base

Immutable record of every uploaded file. Acts as the root entity β€” everything else hangs off this.

checksum_sha256: Mapped[str]ΒΆ
created_atΒΆ
deleted_at: Mapped[datetime | None]ΒΆ
document_type: Mapped[DocumentType]ΒΆ
file_size_bytes: Mapped[int]ΒΆ
file_type: Mapped[str]ΒΆ
filename: Mapped[str]ΒΆ
idΒΆ
is_deleted: Mapped[bool]ΒΆ
original_name: Mapped[str]ΒΆ
processing_jobs: Mapped[list[ProcessingJob]]ΒΆ
storage_path: Mapped[str]ΒΆ
updated_atΒΆ
uploaded_at: Mapped[datetime]ΒΆ
uploaded_by: Mapped[str]ΒΆ
class app.models.DocumentType(*values)[source]ΒΆ

Bases: str, Enum

BANK_STATEMENT = 'bank_statement'ΒΆ
INVOICE = 'invoice'ΒΆ
class app.models.Invoice(**kwargs)[source]ΒΆ

Bases: UUIDPrimaryKeyMixin, Base

Extracted Invoice Data.

confidence: Mapped[Decimal | None]ΒΆ
currency: Mapped[str | None]ΒΆ
discount_amount: Mapped[Decimal | None]ΒΆ
document: Mapped[Document]ΒΆ
document_id: Mapped[UUID]ΒΆ
due_date: Mapped[date | None]ΒΆ
extracted_at: Mapped[datetime]ΒΆ
idΒΆ
invoice_date: Mapped[date | None]ΒΆ
invoice_index: Mapped[int]ΒΆ
invoice_number: Mapped[str | None]ΒΆ
line_items: Mapped[list[InvoiceLineItem]]ΒΆ
notes: Mapped[str | None]ΒΆ
page_range_end: Mapped[int | None]ΒΆ
page_range_start: Mapped[int | None]ΒΆ
processing_job: Mapped[ProcessingJob]ΒΆ
processing_job_id: Mapped[UUID]ΒΆ
raw_date_text: Mapped[str | None]ΒΆ
raw_total_text: Mapped[str | None]ΒΆ
raw_vendor_name: Mapped[str | None]ΒΆ
subtotal: Mapped[Decimal | None]ΒΆ
tax_amount: Mapped[Decimal | None]ΒΆ
total_amount: Mapped[Decimal | None]ΒΆ
updated_at: Mapped[datetime]ΒΆ
vendor: Mapped[Vendor | None]ΒΆ
vendor_id: Mapped[UUID | None]ΒΆ
class app.models.InvoiceLineItem(**kwargs)[source]ΒΆ

Bases: UUIDPrimaryKeyMixin, Base

Individual line items within an invoice.

created_at: Mapped[datetime]ΒΆ
description: Mapped[str | None]ΒΆ
id: Mapped[UUID]ΒΆ
invoice: Mapped[Invoice]ΒΆ
invoice_id: Mapped[UUID]ΒΆ
line_number: Mapped[int]ΒΆ
line_total: Mapped[Decimal | None]ΒΆ
quantity: Mapped[Decimal | None]ΒΆ
sku: Mapped[str | None]ΒΆ
tax_amount: Mapped[Decimal | None]ΒΆ
tax_rate: Mapped[Decimal | None]ΒΆ
unit_of_measure: Mapped[str | None]ΒΆ
unit_price: Mapped[Decimal | None]ΒΆ
class app.models.JobStatus(*values)[source]ΒΆ

Bases: str, Enum

COMPLETED = 'completed'ΒΆ
FAILED = 'failed'ΒΆ
PARTIAL = 'partial'ΒΆ
PENDING = 'pending'ΒΆ
PROCESSING = 'processing'ΒΆ
class app.models.ProcessingJob(**kwargs)[source]ΒΆ

Bases: UUIDPrimaryKeyMixin, Base

bank_statement: Mapped[BankStatement | None]ΒΆ
completed_at: Mapped[datetime | None]ΒΆ
created_at: Mapped[datetime]ΒΆ
document: Mapped[Document]ΒΆ
document_id: Mapped[UUID]ΒΆ
error_detail: Mapped[dict[str, Any] | None]ΒΆ
error_message: Mapped[str | None]ΒΆ
idΒΆ
invoice: Mapped[Invoice | None]ΒΆ
is_reprocess: Mapped[bool]ΒΆ
max_retries: Mapped[int]ΒΆ
ocr_confidence_avg: Mapped[float | None]ΒΆ
ocr_engine: Mapped[str | None]ΒΆ
ocr_used: Mapped[bool]ΒΆ
parser_version: Mapped[str | None]ΒΆ
pdf_encryption_type: Mapped[str | None]ΒΆ
pdf_password_used: Mapped[bool]ΒΆ
retry_count: Mapped[int]ΒΆ
scanned_pages: Mapped[list[int] | None]ΒΆ
started_at: Mapped[datetime | None]ΒΆ
status: Mapped[JobStatus]ΒΆ
updated_at: Mapped[datetime]ΒΆ
warnings: Mapped[list[dict] | None]ΒΆ
class app.models.TransactionType(*values)[source]ΒΆ

Bases: str, Enum

CREDIT = 'credit'ΒΆ
DEBIT = 'debit'ΒΆ
FEE = 'fee'ΒΆ
INTEREST = 'interest'ΒΆ
TRANSFER = 'transfer'ΒΆ
UNKNOWN = 'unknown'ΒΆ
class app.models.Vendor(**kwargs)[source]ΒΆ

Bases: UUIDPrimaryKeyMixin, Base

Normalized vendor registry.

canonical_name: Mapped[str]ΒΆ
country: Mapped[str | None]ΒΆ
created_at: Mapped[datetime]ΒΆ
id: Mapped[UUID]ΒΆ
invoices: Mapped[list[Invoice]]ΒΆ
raw_names: Mapped[list[str]]ΒΆ
tax_id: Mapped[str | None]ΒΆ
updated_at: Mapped[datetime]ΒΆ