"""报表科目期初余额(账套建账期初层)— 2026-09-16 时点报表口径铁律(《CMA 资产负债表重分类规则表 v1.1》§零): 余额 = 期初余额 + Σ(借−贷)(资产) / 期初余额 + Σ(贷−借)(负债·权益) CMA 原有取数只有 `voucher_details` 累计发生额(账套最早期间 2021-03),**不含建账期初**, 使全部往来/税费类科目出现伪反向项(实测:1001 差 346,139.02、1405 差 6,133,427.20……逐月恒定)。 本表只作用于**报表取数层**: · 不生成记账凭证、不写 `voucher_details`、不改 `kpi_values`; · 期初数据来源:反解清单(status=derived,待源系统《科目余额表 2021.03》确认 → confirmed)。 """ from sqlalchemy import Column, Integer, String, Numeric, DateTime, UniqueConstraint, func from app.database import Base class ReportOpeningBalance(Base): """账套建账期初余额(一账套一科目一期初行)""" __tablename__ = "report_opening_balances" __table_args__ = ( UniqueConstraint("entity_id", "subject_code", "effective_date", name="uq_report_opening_entity_subject_effective"), ) id = Column(Integer, primary_key=True, index=True) entity_id = Column(Integer, nullable=False, index=True, comment="账套(实体)ID") subject_code = Column(String(20), nullable=False, index=True, comment="科目编码(前缀匹配)") subject_name = Column(String(100), comment="科目名称") balance_side = Column(String(10), nullable=False, comment="余额方向 debit/credit") amount = Column(Numeric(18, 2), nullable=False, default=0, comment="期初余额(正数)") effective_date = Column(String(7), nullable=False, default="2021-03", comment="生效期间 YYYY-MM(建账期);早于该期的期间不套用") source = Column(String(50), comment="来源标识,如 reverse-calc-20260916") evidence = Column(String(255), comment="取证说明") status = Column(String(20), nullable=False, default="derived", comment="derived=反解待确认 / confirmed=源系统确认") created_at = Column(DateTime, server_default=func.now()) updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now())