# -*- coding: utf-8 -*- """BEP(本量利·保本点)实体口径注册表 —— **单一事实源**。 被两侧共用,避免口径漂移: · 派生落库写入面:`backend/scripts/kpi_bep_deriver.py` · 卡面读取面 :`backend/app/api/dashboard.py::/bep-card` 口径(2026-10-03 财务裁定 + 任总 18:00「统一」,任务 finance-20261003-cvp-fix-and-bohai-coverage-fullstack): | 项 | entity 1 陕西酣客 | entity 2 博海 | |---|---|---| | 变动成本(分子) | **(Σ5401借 + Σ5403借 + Σ571103借 − Σ530103贷)**〔⑤口径统一〕 | Σ6401 借方(主营业务成本) | | 收入基数(分母) | Σ5001 贷方(主营业务收入) | Σ6001 贷方(主营业务收入) | | 变动成本率 | 上式 ÷ Σ5001贷(**完整口径**,非渠补率) | Σ6401借 ÷ Σ6001贷(主营业务成本率) | | 实测渠补率(F_BEP_REBATE) | Σ571103借 ÷ Σ5001贷(**保留**为渠补单一事实源,**不再**充当变动成本率) | 无(None) | | 固定成本 | `5601%` + `5602%` + `5603%` 借−贷净额〔⑤扩容〕 | `6601+6602+6603`(销售/管理/财务费用)借−贷净额 | | 折旧剔除(现金口径) | `560213`(管理费用-折旧叶子) | `1602` 累计折旧**当期贷方发生额**(见下) | | 本期利润结转科目 | `3103` 本年利润 | `4103` 本年利润 | | 结账信号次选(落盘) | `/root/WB_WS/_data/zxt-hanke/{YYYY.MM}/check.md` | 无(只用 DB 信号) | ⑤ 口径统一依据(任总 2026-10-03 18:00 DM「统一」):完整口径唯一可勾稽至营业利润 `808.80 − 672.65 − 224.16 = −88.01 ≈ −88.00` 既定营业利润。 2026-08 锚点(YTD 月均):变动成本率 **83.17%**、边际贡献率 **16.83%**、固定月均 **28.02 万**、 保本 **166.45 万/月**、覆盖率 **60.74%**、缺口 **39.26%**、现金保本 **≈121.8 万/月**。 博海折旧口径说明:博海科目表只到 4 位一级科目(无费用类折旧叶子,**不存在** 酣客式 `560213`), 唯一含「折旧」的是资产类 `1602 累计折旧`;其**当期贷方发生额** = 当期计提折旧额(对方科目 计入 `6602 管理费用`),故取它作现金口径剔除项。实测 2026-01..07 每月 1,468.83 元, 2026-08 起无计提行 ⇒ 2026-08 剔除额为 0(已在回报件列明)。 ⚠️ 博海账套的「期间损益结转腿」(`summary='结转期间损溢'`,凭证如 `记-705/记-706`) **未**标 `carry_forward=1`(全账套 17343 行 carry_forward 恒 0)⇒ 若不显式剔除, 损益类科目「借−贷」净额在已结账月份恒为 0,会把指标静默清零 (口径见 `/srv/hermes/wisdom/_decisions/cma-expense-profit-net-caliber-20261002.md`)。 故博海口径 `exclude_closing=True`。 """ CLOSING_SUMMARY_LIKE = "%结转%" # 酣客结账信号次选来源(智享通落盘 check.md;与 app/api/data.py 的 ZXT_LANDING_DIR 同源) ZXT_LANDING_DIR_HANKE = "/root/WB_WS/_data/zxt-hanke" # 变动成本「带号科目项」记法: terms = [(sign, subject_code, field), ...] # sign='+' ⇒ 取该科目 field 的发生额相加;sign='-' ⇒ 取该科目 field 的发生额相减 # field ∈ {'debit' → debit_amount, 'credit' → credit_amount, 'net' → 借−贷} ENTITY_CALIBERS = { 1: dict( name="陕西酣客", margin_label="变动成本率", margin_desc="(Σ5401借+Σ5403借+Σ571103借−Σ530103贷) ÷ Σ5001贷", # ⑤ 口径统一(2026-10-03 任总「统一」):变动成本 = 销货成本 + 税金及附加 + 渠补 − 厂补 varcost_terms=[("+", "5401", "debit"), ("+", "5403", "debit"), ("+", "571103", "debit"), ("-", "530103", "credit")], # F_BEP_REBATE 实测渠补率专用(单一事实源保留;不再充当变动成本率) rebate_terms=[("+", "571103", "debit")], revenue_field="credit_amount", revenue_filter=("eq", "5001"), fixed_filters=[("like", "5601"), ("like", "5602"), ("like", "5603")], fixed_label="固定成本(5601+5602+5603)", dep_field="net", dep_filter=("eq", "560213"), closing_subject="3103", landing_dir=ZXT_LANDING_DIR_HANKE, exclude_closing=False, policy_pct=84.61, # 政策常量:仅对照展示,不参与计算(仅酣客有) ), 2: dict( name="博海", margin_label="变动成本率(主营业务成本率)", margin_desc="Σ6401借方 ÷ Σ6001贷方", varcost_terms=[("+", "6401", "debit")], rebate_terms=None, # 博海无渠补科目 revenue_field="credit_amount", revenue_filter=("eq", "6001"), fixed_filters=[("like", "6601"), ("like", "6602"), ("like", "6603")], fixed_label="固定成本(6601+6602+6603)", dep_field="credit_amount", dep_filter=("eq", "1602"), closing_subject="4103", landing_dir=None, exclude_closing=True, policy_pct=None, ), } def caliber_or_none(entity_id: int): """取实体口径;未注册返回 None(调用方自行决定放行/拒答)。""" return ENTITY_CALIBERS.get(entity_id) def caliber_for(entity_id: int) -> dict: """取实体口径;未注册抛 KeyError(写入面用,fail-closed)。""" cal = ENTITY_CALIBERS.get(entity_id) if cal is None: raise KeyError(f"entity={entity_id} 未注册 BEP 口径(见 app/utils/bep_caliber.py)") return cal