from datetime import datetime, date from decimal import Decimal from sqlalchemy import String, DateTime, Date, ForeignKey, Text, Numeric, JSON from sqlalchemy.orm import Mapped, mapped_column, relationship from app.db.base import Base class Layer1Candidate(Base): __tablename__ = "layer1_candidates" id: Mapped[int] = mapped_column(primary_key=True, index=True) document_id: Mapped[int] = mapped_column( ForeignKey("documents.id"), nullable=False, index=True ) receipt_id: Mapped[str | None] = mapped_column(String(100), nullable=True, index=True) beancount_date: Mapped[date | None] = mapped_column(Date, nullable=True) flag: Mapped[str] = mapped_column(String(5), default="*", nullable=False) payee: Mapped[str | None] = mapped_column(String(255), nullable=True) narration: Mapped[str | None] = mapped_column(String(255), nullable=True) tags_json: Mapped[list | None] = mapped_column(JSON, nullable=True) links_json: Mapped[list | None] = mapped_column(JSON, nullable=True) metadata_json: Mapped[dict | None] = mapped_column(JSON, nullable=True) primary_account: Mapped[str | None] = mapped_column(String(255), nullable=True) primary_amount: Mapped[Decimal | None] = mapped_column(Numeric(12, 2), nullable=True) primary_currency: Mapped[str | None] = mapped_column(String(10), nullable=True) offset_account: Mapped[str | None] = mapped_column(String(255), nullable=True) offset_amount: Mapped[Decimal | None] = mapped_column(Numeric(12, 2), nullable=True) offset_currency: Mapped[str | None] = mapped_column(String(10), nullable=True) generated_beancount: Mapped[str | None] = mapped_column(Text, nullable=True) status: Mapped[str] = mapped_column(String(50), default="draft", nullable=False) created_at: Mapped[datetime] = mapped_column( DateTime, default=datetime.utcnow, nullable=False ) updated_at: Mapped[datetime] = mapped_column( DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False ) document: Mapped["Document"] = relationship(back_populates="layer1_candidates")