feat(cma-report): 建账期初层 + 方向判定可信度 + 权益行科目集(M1/M2/M7,规则表 v1.1)

- 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 门控)
This commit is contained in:
Hermes CI Fix
2026-09-16 01:17:09 +08:00
parent db3c42f766
commit ae6f71dbc0
7 changed files with 833 additions and 29 deletions
+1
View File
@@ -8,6 +8,7 @@ from app.models.knowledge import KnowledgeEvent, KnowledgeSummary
from app.models.driver_budget import DriverFactorTemplate, DriverFactorBudget
from app.models.product_sales import ProductSales
from app.models.ext_input_ledger import TaxFilingLog, HrMonthlyLedger, LicenceLedger
from app.models.report_opening import ReportOpeningBalance
from app.models.treasury import (
TreasuryAccount, TreasuryBalance, TreasuryControlRule,
TreasuryPayment, TreasuryControlHit, TreasuryLimit,
+41
View File
@@ -0,0 +1,41 @@
"""报表科目期初余额(账套建账期初层)— 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())