- M1 时点报表口径:余额 = 期初(report_opening_balances) + 累计发生额;期初只作用于取数层
(不生成凭证/不写 voucher_details/不改 kpi_values);basis=period 不套期初;受 effective_date 约束
- M2 期初未补 → direction_check_unreliable=true:报表/底稿带"期初未补,方向判定不可信"水印,
重分类触发只进底稿诊断(diagnostic_only),不落地对外行项目
- M7 权益行科目集 = {3001,3002,3101,3103,3104,3105}(含 4001/4002/4101/4103/4104 别名):补实收资本 3001
- 1901 待处理财产损溢过渡列报「其他流动资产」以保恒等式(M6 归因文案)
- 只读验收脚本 + 幂等导入器(dry-run 默认,--commit 门控)
42 lines
2.3 KiB
Python
42 lines
2.3 KiB
Python
"""报表科目期初余额(账套建账期初层)— 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())
|