test(workbook): fix margin-rate recalculation fixture and row selection
Verify / verify (pull_request) Failing after 1s
AI Review / review (pull_request) Successful in 10s
Verify / verify (push) Failing after 34s

Clear raw gross values for the current-period lookup rows, edit both matching rows instead of a baseline row, and assert recalculated detail and unchanged baseline totals.
This commit is contained in:
Jayway Liu
2026-11-01 09:54:20 +08:00
parent 3c3799910d
commit 4c84b18648
+27 -8
View File
@@ -1,3 +1,4 @@
from decimal import Decimal
from io import BytesIO from io import BytesIO
import pytest import pytest
@@ -93,14 +94,18 @@ def test_margin_rate_lookup_edit_changes_gross_via_detail_recalculation(workspac
import os import os
import shutil import shutil
from finance.models import Fact
if not (os.environ.get("SOFFICE_BIN") or shutil.which("soffice")): if not (os.environ.get("SOFFICE_BIN") or shutil.which("soffice")):
pytest.skip("set SOFFICE_BIN to run the LibreOffice recalculation check") pytest.skip("set SOFFICE_BIN to run the LibreOffice recalculation check")
ds, member, *_ = workspace ds, member, *_ = workspace
# 去掉直接毛利,使毛利全部走 lookup 毛利率 # 模拟缺失原始直接毛利的导入行,数据库毛利按原毛利率计算。
Fact.objects.filter(dataset=ds).update(gross=None) gross_index = next(col["index"] for col in ds.mapping["columns"] if col["role"] == "gross")
for fact in ds.facts.filter(
period="2026-08", dimensions__department="儿科", dimensions__product="医疗服务"
):
fact.raw[gross_index] = ""
fact.gross = fact.revenue * Decimal("0.3")
fact.save(update_fields=["raw", "gross"])
mapping = {**ds.mapping, "margin_rates": {"医疗服务": "0.3"}} mapping = {**ds.mapping, "margin_rates": {"医疗服务": "0.3"}}
ds.mapping = mapping ds.mapping = mapping
ds.save(update_fields=["mapping"]) ds.save(update_fields=["mapping"])
@@ -118,10 +123,21 @@ def test_margin_rate_lookup_edit_changes_gross_via_detail_recalculation(workspac
) )
editable = load_workbook(workbook_path) editable = load_workbook(workbook_path)
# MarginRate 列在维度列之后:G 列(期间+2维度=3 列后第 4 个保留列) details = editable["计算明细"]
header_row = [cell.value for cell in editable["计算明细"][1]] columns = {cell.value: cell.column for cell in details[1]}
rate_column = header_row.index("MarginRate") + 1 lookup_rows = [
editable["计算明细"].cell(row=2, column=rate_column).value = 0.5 row
for row in range(2, details.max_row + 1)
if details.cell(row, columns["Period"]).value == "2026-08"
and details.cell(row, columns["department"]).value == "儿科"
and details.cell(row, columns["product"]).value == "医疗服务"
]
assert len(lookup_rows) == 2
for row in lookup_rows:
assert details.cell(row, columns["GrossInput"]).value is None
assert details.cell(row, columns["GrossSource"]).value == "lookup"
assert details.cell(row, columns["MarginRate"]).value == pytest.approx(0.3)
details.cell(row, columns["MarginRate"]).value = 0.5
editable.save(workbook_path) editable.save(workbook_path)
import subprocess import subprocess
@@ -145,6 +161,8 @@ def test_margin_rate_lookup_edit_changes_gross_via_detail_recalculation(workspac
) )
assert result.returncode == 0, result.stderr or result.stdout assert result.returncode == 0, result.stderr or result.stdout
values = load_workbook(output / workbook_path.name, data_only=True) values = load_workbook(output / workbook_path.name, data_only=True)
details = values["计算明细"]
assert [details.cell(row, columns["GrossCalc"]).value for row in lookup_rows] == pytest.approx([40, 10])
summary = values["分析汇总"] summary = values["分析汇总"]
gross_row = next( gross_row = next(
row row
@@ -153,3 +171,4 @@ def test_margin_rate_lookup_edit_changes_gross_via_detail_recalculation(workspac
) )
# 2026-08 儿科收入 100,lookup 毛利率改为 0.5 后毛利应为 50 # 2026-08 儿科收入 100,lookup 毛利率改为 0.5 后毛利应为 50
assert summary.cell(gross_row, 3).value == pytest.approx(50) assert summary.cell(gross_row, 3).value == pytest.approx(50)
assert summary.cell(gross_row, 4).value == pytest.approx(90)