test(settlement): #12 聚合基数开关用例——经理个人户计入可配置
默认 0 时聚合 6.84 不变;开关 1 时个人户行按 personnel_id 归经理本人 (不走 manager_id 上溯)、基数 139.11 → 聚合 24.34,两档金标准锁定 Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
parent
76ded6d5ec
commit
828b57350a
@ -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:
|
||||
"""锁定后源数据写路径全量拦截(回款编辑/删除、发货增改删、核算/重算)。"""
|
||||
|
||||
Loading…
Reference in New Issue
Block a user