Files
zkxw/backend/tests/test_sample_payment_schedule_validate.py
zlwuandCursor db31990ebe feat: 细胞存储缴费催缴、统一样本信息与协议支付能力增强
汇总近期业务改动:催缴菜单与后端、样本信息快捷登记与进度、运费关联、客户档案扩展、协议优惠/期次与押金划转,并同步 SQL 迁移与管理端页面收敛。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-10 21:20:37 +08:00

73 lines
2.2 KiB
Python

"""样本各期应缴合计 vs 合同金额校验"""
from decimal import Decimal
import unittest
from app.services.sample_payment_schedule_validate import (
schedule_dues_match_contract,
schedule_required_fields_ok,
)
class TestScheduleValidate(unittest.TestCase):
def test_match(self):
ok, msg = schedule_dues_match_contract(
contract_amount=Decimal("1000"),
schedules=[{"dueAmount": 600}, {"dueAmount": 400}],
)
self.assertTrue(ok)
self.assertIsNone(msg)
def test_mismatch(self):
ok, msg = schedule_dues_match_contract(
contract_amount=Decimal("1000"),
schedules=[{"dueAmount": 600}, {"dueAmount": 300}],
sample_code="S001",
)
self.assertFalse(ok)
self.assertIn("900", msg or "")
self.assertIn("1000", msg or "")
self.assertIn("S001", msg or "")
def test_skip_void(self):
ok, msg = schedule_dues_match_contract(
contract_amount=Decimal("500"),
schedules=[
{"dueAmount": 500, "scheduleStatus": "open"},
{"dueAmount": 200, "scheduleStatus": "void"},
],
)
self.assertTrue(ok)
self.assertIsNone(msg)
def test_empty_schedules_skip(self):
ok, msg = schedule_dues_match_contract(
contract_amount=Decimal("1000"),
schedules=[],
)
self.assertTrue(ok)
self.assertIsNone(msg)
def test_require_amount_and_due_date(self):
ok, msg = schedule_dues_match_contract(
contract_amount=Decimal("1000"),
schedules=[
{"dueAmount": None, "dueDate": "20261001"},
{"dueAmount": 500, "dueDate": ""},
],
sample_code="S1",
require_schedule_fields=True,
)
self.assertFalse(ok)
self.assertIn("应缴金额", msg or "")
def test_require_fields_ok(self):
ok, msg = schedule_required_fields_ok(
schedules=[
{"dueAmount": 500, "dueDate": "20261001"},
{"dueAmount": 500, "due_date": "20261101"},
]
)
self.assertTrue(ok)
self.assertIsNone(msg)