fix(profit-caliber): 博海口径 §4-1/§4-2/§4-5 落地 —— 固定成本仅借方 + 6403 进变动 + 财务收益单列 + 批次备注
ci/woodpecker/push/main Pipeline was successful
ci/woodpecker/push/main Pipeline was successful
ASK-20261014-04(任总 2026-10-14 11:20「放行4」)批后口径: - §4-1 博海固定成本弃净额:6601/6602/6603 仅借方(133.98 万,2026-01..09);2026-03 单月由 -9.02 万转正; 6603 贷方(现金折扣收益 64.40 万)改 finance_income_terms 单列备查,不进固定成本/末行/勾稽。 - §4-2 博海变动成本追加 6403 营业税金及附加(530.17 万)。 - §4-3/§4-4 维持现行(酣客收入/边际贡献基数不动)。 - §4-5 管理利润表页加「数据批次/导入时刻」纯展示备注(import_logs)。 - 口径唯一源仍为 bep_caliber.ENTITY_CALIBERS;报表/卡面/派生器一律经 fixed_cost_spec() 解析(读口写口一致)。
This commit is contained in:
@@ -63,18 +63,20 @@ def seed_e1(db: Session, period: str = PERIOD):
|
||||
|
||||
|
||||
def seed_e2(db: Session, period: str = PERIOD):
|
||||
"""博海口径真账行:
|
||||
收入 6001 贷 1,000,000;变动 = 6401借 800,000;
|
||||
固定 = 6601借 60,000 + (6602借 30,000 − 贷 5,000) + (6603借 8,000 − 贷 20,000) = 73,000(净额口径)。
|
||||
"""博海口径真账行(**ASK-20261014-04 §4-1/§4-2 批后口径**):
|
||||
收入 6001 贷 1,000,000;变动 = 6401借 800,000 + 6403借 20,000 = 820,000;
|
||||
固定(**仅借方**)= 6601借 60,000 + 6602借 30,000 + 6603借 8,000 = 98,000;
|
||||
财务收益(单列,不进固定)= 6603 贷 20,000。
|
||||
+ 一条 summary='结转期间损溢' 的结转腿(e2 账套 carry_forward 恒 0,必须按 summary 显式剔除)。
|
||||
"""
|
||||
_row(db, 2, 1, "6001", credit=1_000_000.0, period=period)
|
||||
_row(db, 2, 2, "6401", debit=800_000.0, period=period)
|
||||
_row(db, 2, 2, "6403", debit=20_000.0, period=period) # §4-2 追加营业税金及附加
|
||||
_row(db, 2, 3, "6601", debit=60_000.0, period=period)
|
||||
_row(db, 2, 4, "6602", debit=30_000.0, period=period)
|
||||
_row(db, 2, 5, "6602", credit=5_000.0, period=period)
|
||||
_row(db, 2, 5, "6602", credit=5_000.0, period=period) # §4-1 后不进固定(仅借方)
|
||||
_row(db, 2, 6, "6603", debit=8_000.0, period=period)
|
||||
_row(db, 2, 7, "6603", credit=20_000.0, period=period)
|
||||
_row(db, 2, 7, "6603", credit=20_000.0, period=period) # §4-1 现金折扣收益 ⇒ 单列财务收益
|
||||
_row(db, 2, 8, "6602", debit=999_999.0, summary="结转期间损溢", period=period)
|
||||
db.commit()
|
||||
|
||||
@@ -122,14 +124,20 @@ class TestLinesFromRealSubjects:
|
||||
assert r["available"] is True
|
||||
v = r["values"]
|
||||
assert v["revenue"] == 100.00, v
|
||||
assert v["variable_cost"] == 80.00, v
|
||||
assert v["contribution"] == 20.00, v
|
||||
assert v["fixed_cost"] == 7.30, v # 60,000 + 25,000 − 12,000 = 73,000 元
|
||||
assert v["result"] == 12.70, v
|
||||
assert v["variable_cost"] == 82.00, v # 6401 800,000 + 6403 20,000(§4-2)
|
||||
assert v["contribution"] == 18.00, v
|
||||
assert v["fixed_cost"] == 9.80, v # §4-1 仅借方:60,000 + 30,000 + 8,000 = 98,000 元
|
||||
assert v["result"] == 8.20, v
|
||||
# §4-1:6603 贷方现金折扣收益**不进固定成本**,改为单列财务收益(2.00 万)
|
||||
assert r["finance_income"]["value"] == 2.00, r["finance_income"]
|
||||
assert r["raw_yuan"]["fixed_cost"] == 98_000.0, r["raw_yuan"]
|
||||
# 结转腿(summary 含「结转」)不得计入 6602
|
||||
fparts = {p["code"]: p for p in r["rows"]["fixed_cost"]["parts"]}
|
||||
assert fparts["6602%"]["total_yuan"] == 25_000.0, fparts["6602%"]
|
||||
assert fparts["6602"]["total_yuan"] == 30_000.0, fparts["6602"]
|
||||
assert fparts["6602"]["field"] == "debit" and fparts["6602"]["match"] == "eq"
|
||||
assert r["caliber"]["exclude_closing"] is True
|
||||
assert r["caliber"]["fixed_mode"] == "fixed_terms"
|
||||
assert r["caliber"]["finance_income_terms"] == [["+", "6603", "credit"]]
|
||||
|
||||
|
||||
# ── L3 按 entity 隔离 ──────────────────────────────────────────────────────
|
||||
@@ -145,15 +153,20 @@ class TestEntityIsolation:
|
||||
assert r1["raw_yuan"]["revenue"] == 2_634_900.0
|
||||
assert r2["raw_yuan"]["revenue"] == 1_000_000.0
|
||||
|
||||
# 变动成本科目集不同:e1 含 5401+5403+571103−530103;e2 只有 6401
|
||||
# 变动成本科目集不同:e1 含 5401+5403+571103−530103;e2 含 6401+6403(§4-2)
|
||||
assert {p["code"] for p in r1["rows"]["variable_cost"]["parts"]} == {"5401", "5403", "571103", "530103"}
|
||||
assert {p["code"] for p in r2["rows"]["variable_cost"]["parts"]} == {"6401"}
|
||||
assert {p["code"] for p in r2["rows"]["variable_cost"]["parts"]} == {"6401", "6403"}
|
||||
# e2 的 6401 不得被算进 e1
|
||||
assert r1["rows"]["variable_cost"]["parts"][0]["by_subject"] == {"5401": 2_000_000.0}
|
||||
|
||||
# 固定成本科目集不同:e1=5601/5602/5603;e2=6601/6602/6603
|
||||
# 固定成本科目集不同:e1=5601%/5602%/5603%(净额前缀);e2=6601/6602/6603(§4-1 仅借方带号项)
|
||||
assert {p["code"] for p in r1["rows"]["fixed_cost"]["parts"]} == {"5601%", "5602%", "5603%"}
|
||||
assert {p["code"] for p in r2["rows"]["fixed_cost"]["parts"]} == {"6601%", "6602%", "6603%"}
|
||||
assert {p["code"] for p in r2["rows"]["fixed_cost"]["parts"]} == {"6601", "6602", "6603"}
|
||||
assert r1["caliber"]["fixed_mode"] == "fixed_filters(net)"
|
||||
assert r2["caliber"]["fixed_mode"] == "fixed_terms"
|
||||
# 财务收益单列项只有 e2 有(e1 无 6603 贷方项)
|
||||
assert r1["finance_income"]["value"] == 0.0
|
||||
assert r2["finance_income"]["value"] == 2.00
|
||||
|
||||
# 口径快照不同(digest 异:口径表按账套而异)
|
||||
assert r1["caliber"]["digest"] != r2["caliber"]["digest"]
|
||||
@@ -384,7 +397,7 @@ class TestEndpoint:
|
||||
seed_e1(db)
|
||||
seed_e2(db)
|
||||
r2 = PL.compute_lines(db, 2, PERIOD, PERIOD)
|
||||
assert r2["values"]["revenue"] == 100.00 and r2["values"]["fixed_cost"] == 7.30
|
||||
assert r2["values"]["revenue"] == 100.00 and r2["values"]["fixed_cost"] == 9.80
|
||||
# entity1 的 token ⇒ entity1 账套(e2 行不进入)
|
||||
d = client.get(f"{BASE}?period={PERIOD}", headers=auth_header(token)).json()
|
||||
assert d["entity_id"] == 1
|
||||
|
||||
Reference in New Issue
Block a user