From 828b57350ab1b5c43e552a1611f66b1de6fe7146 Mon Sep 17 00:00:00 2001 From: liuwenxin <1009266660@qq.com> Date: Mon, 19 Oct 2026 12:06:07 +0800 Subject: [PATCH] =?UTF-8?q?test(settlement):=20#12=20=E8=81=9A=E5=90=88?= =?UTF-8?q?=E5=9F=BA=E6=95=B0=E5=BC=80=E5=85=B3=E7=94=A8=E4=BE=8B=E2=80=94?= =?UTF-8?q?=E2=80=94=E7=BB=8F=E7=90=86=E4=B8=AA=E4=BA=BA=E6=88=B7=E8=AE=A1?= =?UTF-8?q?=E5=85=A5=E5=8F=AF=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 默认 0 时聚合 6.84 不变;开关 1 时个人户行按 personnel_id 归经理本人 (不走 manager_id 上溯)、基数 139.11 → 聚合 24.34,两档金标准锁定 Co-Authored-By: Claude Code --- backend/tests/integration/test_settlements.py | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/backend/tests/integration/test_settlements.py b/backend/tests/integration/test_settlements.py index 4349582..51f586b 100644 --- a/backend/tests/integration/test_settlements.py +++ b/backend/tests/integration/test_settlements.py @@ -10,6 +10,8 @@ """ import uuid +from datetime import date +from decimal import Decimal import pytest from fastapi.testclient import TestClient @@ -514,6 +516,69 @@ class TestManagerAggregate: assert row.rate_text == "聚合:20%+5%" assert str(row.receipt_date) == "2026-10-31" + def test_聚合基数开关_经理个人户计入可配置(self, client: TestClient, admin: dict) -> None: + """#12 答复(2026-10-19)参数化:manager.personal.included=1 时个人户业绩并入基数。 + + 直插一行经理个人户台账(绩效 100,模拟该类业务经单笔侧计提后的 + 结果)——默认 0 时聚合 6.84 不变;开关 1 后基数 39.11+100=139.11。 + """ + manager, _receipt = self._scene(client, admin["headers"]) + factory = get_session_factory() + with factory() as session: + session.add( + PerformanceLedger( + receipt_id=None, + calc_version=1, + calc_type=1, + business_id=0, + business_no="t_个人户", + personnel_id=manager["id"], + personnel_name=manager["personnel_name"], + role_code="sales_manager", + customer_type="manager_personal", + product_category="mixed", + receipt_date=date(2026, 10, 15), + rate_text="0", + performance_amount=Decimal("100.00"), + barter_applied=0, + payable_amount=Decimal("0"), + settlement_month="2026-10", + is_probation=0, + ) + ) + session.commit() + + def _manager_share() -> str: + resp = client.post( + f"{_SETTLEMENTS}/generate", json={"month": "2026-10"}, headers=admin["headers"] + ) + assert resp.status_code == 200, resp.text + items = [i for i in resp.json()["data"]["items"] if i["calc_type"] == 2] + assert len(items) == 1 + return items[0]["performance_sum"] + + # 默认(开关 0=不计入):基数 39.11 → 6.84(与既有金标准一致) + assert _manager_share() == "6.84" + + # 开关 1(立即生效,月末 2026-10-31 取参命中):139.11×12.5% + ×5% = 24.34425 + resp = client.post( + "/api/v1/system/params/changes", + json={ + "change_type": 1, + "remark": "用例:#12 开关计入", + "items": [ + { + "param_code": "manager.personal.included", + "dimension_value": "", + "value": "1", + } + ], + }, + headers=admin["headers"], + ) + assert resp.status_code == 200, resp.text + assert _manager_share() == "24.34" + class TestAdjustment: """调整单:已锁定月份补发/扣减的唯一通道。""" @@ -538,6 +603,24 @@ class TestAdjustment: out = resp.json()["data"] assert out["status"] == 2 # 已生效 + def test_金额恒正校验(self, client: TestClient, admin: dict) -> None: + """守金额无校验缺陷:负数会反转补发/扣减语义,非数值直落库 500。""" + _set_switch(client, admin["headers"], "approval.adjustment.enabled", "0") + person = _person(client, admin["headers"]) + base = { + "settlement_month": "2026-10", + "personnel_id": person["id"], + "direction": 1, + "reason": "金额校验用例", + } + for bad in ("-500.00", "0", "0.00", "abc", "1e3"): + resp = client.post( + f"{_SETTLEMENTS}/adjustments", + json={**base, "amount": bad}, + headers=admin["headers"], + ) + assert resp.status_code == 400, f"amount={bad!r} 应 400:{resp.text}" + class TestLockInterception: """锁定后源数据写路径全量拦截(回款编辑/删除、发货增改删、核算/重算)。"""