- 月结锁定拦截补全:原仅新增回款一处,现覆盖回款编辑(原月+新月,防跨月 搬数)/删除、发货新增(按发货日)/编辑(原月+新月)/删除、核算与重算 (已审定月份金额只走调整单);拦截先于「被引用/已核算」判定 - 台账 settlement_id 回填落地:generate 在 replace_items 后回填纳入行、 重生成前先解绑(clear_ledger_settlement_id)——不回填/不解绑会让 「未入结」判据失效:重生成漏算整月或把已固化行反复计入 - 经理聚合行落库:原只进内存参与 items 汇总,台账表永远无 calc_type=2 行、报表下钻落空;重生成先作废旧聚合行(deactivate_month_aggregates), _confirm_scope 限定计算类型避免聚合行混入单笔池 - 月结取参锚定所属月月末(_month_end):原用 date.today(),补生成历史 月份时分成/月工资口径随生成日漂移;聚合行 receipt_date 同步为月末 - generate/submit 出参固化前置到 commit 之前(commit 后 SELECT 失败会把 已生成的月结记成失败审计,与库中事实相反) - V9 迁移:business_secondary_allocations 唯一键条件式补齐(幂等裸 SQL, 临时库验证「无键→补」「有键→跳过」两分支),修复旧 V6 升级库拿不到 V6 就地加入的约束;V8 迁移 revision 声明补类型注解(原格式漂移使 schema 同步测试的 head 推断静默漏检 V8);init-dev 版本号推进至 V9 - V7 留存 SQL 约束/索引名单数改复数(与 alembic op.f 与 init-dev 对齐, 消除 SHOW CREATE TABLE 双轨漂移) - 测试:显式控制审批开关(不依赖 V8 翻转后的种子默认值);新增回归 8 例 (回填落库/聚合不重复/月末取参/月末纯函数 5 例/锁定拦截回款与发货与 核算);全量 773 passed Co-Authored-By: Claude Code <noreply@anthropic.com>
30 lines
1.0 KiB
Python
30 lines
1.0 KiB
Python
"""月结取参锚点测试。
|
|
|
|
守的是:月结参数快照按**所属月月末**解析,而不是生成日 —— 用 date.today()
|
|
取参会让补生成/重新生成历史月份的经理分成与月工资随操作日期漂移,
|
|
同一月份两次生成金额不同(违背「参数按生效日期时点化」红线)。
|
|
"""
|
|
|
|
from datetime import date
|
|
|
|
from app.services.settlement_service import _month_end
|
|
|
|
|
|
class TestMonthEnd:
|
|
"""YYYY-MM → 所属月最后一天(含大小月与闰年)。"""
|
|
|
|
def test_大月31日(self) -> None:
|
|
assert _month_end("2026-10") == date(2026, 10, 31)
|
|
|
|
def test_小月30日(self) -> None:
|
|
assert _month_end("2026-09") == date(2026, 9, 30)
|
|
|
|
def test_二月平年28日(self) -> None:
|
|
assert _month_end("2026-02") == date(2026, 2, 28)
|
|
|
|
def test_二月闰年29日(self) -> None:
|
|
assert _month_end("2028-02") == date(2028, 2, 29)
|
|
|
|
def test_跨年十二月(self) -> None:
|
|
assert _month_end("2026-12") == date(2026, 12, 31)
|