feat(kpi): 归集侧接作废/撤单标记过滤(voucher_void_marks)

- kpi_value_collector: 所有消费 voucher_details 的归集路径统一排除已作废凭证
  (NOT EXISTS voucher_void_marks, entity_id+voucher_no+voucher_date+revoked_at IS NULL),
  与 DB 视图 v_voucher_details_active 定义一致;标记表不存在时自动跳过(兼容旧库)
- 禁硬编码:凭证号不出现在代码/配置,撤单只需写标记表
- verify_cashflow_direct_caliber: 2026-08 从已知差异放行改为硬断言(8 期逐期一致)
- tests/test_void_marker_filter_20260914.py: 标记表在/不在 两分支 3 例
This commit is contained in:
Hermes CI Fix
2026-09-14 18:44:39 +08:00
parent 4d918f5786
commit a8a82ff837
3 changed files with 234 additions and 3 deletions
@@ -5,7 +5,8 @@
判据(全部只读,write_kpi=False):
1. 生产同一代码路径试算 2026-01..08,与现网 zxt-sync 权威值对账(容差 0.001)
—— 2026-08 因上游已撤单凭证仍在库内(智享通快照不含)按已知差异放行(WARN,不算 FAIL)
—— 2026-08 差异已随「作废/撤单标记过滤」接入归集器(2026-09-14)消除:
归集侧统一按 cma.voucher_void_marks 排除已作废凭证,8 期逐期一致(无放行期)
2. 恒等式: 经营净额 + 筹资净额 + 投资净额 = 现金总净额(每期 |Δ| ≤ 0.001)
3. 负例对照: 若按「凭证级整单分类」(错误做法),2026-06 应为 453,697.63 元
(行级 = 434,997.63 元,差 +18,700 = 凭证 31226 同单内的银行手续费)→ 证明必须行级拆分
@@ -25,7 +26,7 @@ from scripts.kpi_value_collector import collect_for_mapping
ENTITY = 1
PERIODS = ["2026-0%d" % i for i in range(1, 9)]
TOL = 0.001
KNOWN_DIFF_PERIODS = {"2026-08"} # 上游已撤单凭证未标记 → 已知差异(挂账,非回归)
KNOWN_DIFF_PERIODS = set() # 2026-09-14 起为空集:作废标记过滤已接入归集器,8 期逐期硬断言
RULE = {
"calc": "cashflow_direct", "measure": "net", "version": 1, "bucket": "operating",
"cash_subjects": ["1001%", "1002%", "1012%"],