Pure function for per-sample list progressStatus, paid/due totals, and canConfirm. Co-authored-by: Cursor <cursoragent@cursor.com>
85 lines
3.2 KiB
Python
85 lines
3.2 KiB
Python
"""样本缴费进度:状态码与已缴/待缴汇总"""
|
|
|
|
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()
|