"""样本各期应缴合计 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)