""" 凭证模型 存储生成的会计凭证 """ from datetime import datetime from typing import Optional from sqlalchemy import ForeignKey, Integer, String, Float, DateTime, JSON, Text from sqlalchemy.orm import Mapped, mapped_column, relationship from app.models.base import BaseModel class VoucherStatus: """凭证状态""" DRAFT = "DRAFT" CONFIRMED = "CONFIRMED" EXPORTED = "EXPORTED" class Voucher(BaseModel): """ 会计凭证模型 Attributes: company_id: 企业ID task_id: 对账任务ID voucher_number: 凭证编号 voucher_date: 凭证日期 period: 会计期间 summary: 摘要 entries: 凭证分录(JSON) total_debit: 借方合计 total_credit: 贷方合计 status: 状态 confirmed_by: 确认人 confirmed_at: 确认时间 """ __tablename__ = "vouchers" company_id: Mapped[int] = mapped_column(Integer, ForeignKey("companies.id"), nullable=False, index=True) task_id: Mapped[int] = mapped_column(Integer, ForeignKey("reconciliation_tasks.id"), nullable=False, index=True) voucher_number: Mapped[str] = mapped_column(String(50), nullable=False, index=True, comment="凭证编号") voucher_date: Mapped[str] = mapped_column(String(20), nullable=False, comment="凭证日期 YYYY-MM-DD") period: Mapped[str] = mapped_column(String(20), nullable=False, index=True, comment="会计期间 YYYY-MM") summary: Mapped[str] = mapped_column(String(500), nullable=False, comment="摘要") entries: Mapped[dict] = mapped_column(JSON, nullable=False, comment="凭证分录列表") total_debit: Mapped[float] = mapped_column(Float, nullable=False, default=0.0, comment="借方合计") total_credit: Mapped[float] = mapped_column(Float, nullable=False, default=0.0, comment="贷方合计") status: Mapped[str] = mapped_column(String(20), nullable=False, default=VoucherStatus.DRAFT, index=True, comment="状态") confirmed_by: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("users.id"), nullable=True) confirmed_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True) # 关系 company = relationship("Company", backref="vouchers") task = relationship("ReconciliationTask", backref="vouchers") confirmer = relationship("User", foreign_keys=[confirmed_by]) def __repr__(self) -> str: return f""