|
|
@@ -0,0 +1,84 @@
|
|
|
+"""样本缴费进度:状态码与已缴/待缴汇总"""
|
|
|
+
|
|
|
+from decimal import Decimal
|
|
|
+import unittest
|
|
|
+
|
|
|
+from app.services.sample_payment_progress import (
|
|
|
+ compute_sample_payment_progress,
|
|
|
+)
|
|
|
+
|
|
|
+
|
|
|
+class TestSamplePaymentProgress(unittest.TestCase):
|
|
|
+ def test_pending_when_no_transfers(self):
|
|
|
+ r = compute_sample_payment_progress(
|
|
|
+ schedules=[
|
|
|
+ {"scheduleStatus": "open", "dueAmount": Decimal("1000")},
|
|
|
+ ],
|
|
|
+ transfers=[],
|
|
|
+ )
|
|
|
+ self.assertEqual(r["progressStatus"], "dfj")
|
|
|
+ self.assertEqual(r["paidAmount"], Decimal("0"))
|
|
|
+ self.assertEqual(r["dueRemainAmount"], Decimal("1000"))
|
|
|
+ self.assertEqual(r["clearedScheduleCount"], 0)
|
|
|
+ self.assertEqual(r["activeScheduleCount"], 1)
|
|
|
+ self.assertTrue(r["canConfirm"])
|
|
|
+
|
|
|
+ def test_confirming_wins_over_partial(self):
|
|
|
+ r = compute_sample_payment_progress(
|
|
|
+ schedules=[
|
|
|
+ {"id": "s1", "scheduleStatus": "open", "dueAmount": Decimal("1000")},
|
|
|
+ ],
|
|
|
+ transfers=[
|
|
|
+ {"scheduleId": "s1", "payStatus": "yjf", "transferAmount": Decimal("200")},
|
|
|
+ {"scheduleId": "s1", "payStatus": "jfqrz", "transferAmount": Decimal("100")},
|
|
|
+ ],
|
|
|
+ )
|
|
|
+ self.assertEqual(r["progressStatus"], "jfqrz")
|
|
|
+ self.assertEqual(r["paidAmount"], Decimal("200"))
|
|
|
+ self.assertFalse(r["canConfirm"])
|
|
|
+
|
|
|
+ def test_partial_paid(self):
|
|
|
+ r = compute_sample_payment_progress(
|
|
|
+ schedules=[
|
|
|
+ {"id": "s1", "scheduleStatus": "cleared", "dueAmount": Decimal("500")},
|
|
|
+ {"id": "s2", "scheduleStatus": "open", "dueAmount": Decimal("500")},
|
|
|
+ ],
|
|
|
+ transfers=[
|
|
|
+ {"scheduleId": "s1", "payStatus": "yjf", "transferAmount": Decimal("500")},
|
|
|
+ ],
|
|
|
+ )
|
|
|
+ self.assertEqual(r["progressStatus"], "bfyj")
|
|
|
+ self.assertEqual(r["clearedScheduleCount"], 1)
|
|
|
+ self.assertEqual(r["activeScheduleCount"], 2)
|
|
|
+ self.assertTrue(r["canConfirm"])
|
|
|
+
|
|
|
+ def test_all_cleared(self):
|
|
|
+ r = compute_sample_payment_progress(
|
|
|
+ schedules=[
|
|
|
+ {"id": "s1", "scheduleStatus": "cleared", "dueAmount": Decimal("500")},
|
|
|
+ {"id": "s2", "scheduleStatus": "void", "dueAmount": Decimal("500")},
|
|
|
+ ],
|
|
|
+ transfers=[
|
|
|
+ {"scheduleId": "s1", "payStatus": "yjf", "transferAmount": Decimal("500")},
|
|
|
+ ],
|
|
|
+ )
|
|
|
+ self.assertEqual(r["progressStatus"], "yjq")
|
|
|
+ self.assertEqual(r["activeScheduleCount"], 1)
|
|
|
+ self.assertEqual(r["clearedScheduleCount"], 1)
|
|
|
+ self.assertFalse(r["canConfirm"])
|
|
|
+ self.assertEqual(r["dueRemainAmount"], Decimal("0"))
|
|
|
+
|
|
|
+ def test_void_schedules_ignored(self):
|
|
|
+ r = compute_sample_payment_progress(
|
|
|
+ schedules=[
|
|
|
+ {"scheduleStatus": "void", "dueAmount": Decimal("9999")},
|
|
|
+ {"scheduleStatus": "open", "dueAmount": Decimal("100")},
|
|
|
+ ],
|
|
|
+ transfers=[],
|
|
|
+ )
|
|
|
+ self.assertEqual(r["activeScheduleCount"], 1)
|
|
|
+ self.assertEqual(r["dueRemainAmount"], Decimal("100"))
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == "__main__":
|
|
|
+ unittest.main()
|