汇总近期业务改动:催缴菜单与后端、样本信息快捷登记与进度、运费关联、客户档案扩展、协议优惠/期次与押金划转,并同步 SQL 迁移与管理端页面收敛。 Co-authored-by: Cursor <cursoragent@cursor.com>
104 lines
3.0 KiB
Python
104 lines
3.0 KiB
Python
"""催缴纳入规则与金额口径"""
|
|
|
|
from datetime import date
|
|
from decimal import Decimal
|
|
import unittest
|
|
|
|
from app.services.payment_chase import (
|
|
chase_period_money,
|
|
is_chase_candidate,
|
|
parse_due_date_ymd,
|
|
)
|
|
|
|
|
|
class TestChase(unittest.TestCase):
|
|
def test_chase_paid_includes_dfj_jfqrz_yjf(self):
|
|
"""与缴费信息期次一致:已缴 = dfj + jfqrz + yjf"""
|
|
paid, arrears = chase_period_money(
|
|
due_amount=Decimal("1000"),
|
|
transfers=[
|
|
{
|
|
"transferAmount": Decimal("300"),
|
|
"payStatus": "dfj",
|
|
"transferTime": "2026-04-01 10:00:00",
|
|
},
|
|
{
|
|
"transferAmount": Decimal("200"),
|
|
"payStatus": "jfqrz",
|
|
"transferTime": "2026-04-02 10:00:00",
|
|
},
|
|
{
|
|
"transferAmount": Decimal("100"),
|
|
"payStatus": "yjf",
|
|
"transferTime": "2026-04-03 10:00:00",
|
|
},
|
|
],
|
|
)
|
|
self.assertEqual(paid, Decimal("600"))
|
|
self.assertEqual(arrears, Decimal("400"))
|
|
|
|
def test_chase_full_display_paid_not_candidate(self):
|
|
paid, arrears = chase_period_money(
|
|
due_amount=Decimal("500"),
|
|
transfers=[
|
|
{
|
|
"transferAmount": Decimal("500"),
|
|
"payStatus": "dfj",
|
|
"transferTime": "2026-04-01 10:00:00",
|
|
}
|
|
],
|
|
)
|
|
self.assertEqual(paid, Decimal("500"))
|
|
self.assertEqual(arrears, Decimal("0"))
|
|
self.assertFalse(
|
|
is_chase_candidate(
|
|
due_date=date(2026, 9, 1),
|
|
today=date(2026, 10, 9),
|
|
arrears=arrears,
|
|
)
|
|
)
|
|
|
|
def test_overdue(self):
|
|
self.assertTrue(
|
|
is_chase_candidate(
|
|
due_date=date(2026, 9, 1),
|
|
today=date(2026, 10, 9),
|
|
arrears=Decimal("100"),
|
|
)
|
|
)
|
|
|
|
def test_within_30(self):
|
|
self.assertTrue(
|
|
is_chase_candidate(
|
|
due_date=date(2026, 11, 1),
|
|
today=date(2026, 10, 9),
|
|
arrears=Decimal("100"),
|
|
)
|
|
)
|
|
|
|
def test_beyond_30(self):
|
|
self.assertFalse(
|
|
is_chase_candidate(
|
|
due_date=date(2026, 11, 10),
|
|
today=date(2026, 10, 9),
|
|
arrears=Decimal("100"),
|
|
)
|
|
)
|
|
|
|
def test_zero_arrears(self):
|
|
self.assertFalse(
|
|
is_chase_candidate(
|
|
due_date=date(2026, 9, 1),
|
|
today=date(2026, 10, 9),
|
|
arrears=Decimal("0"),
|
|
)
|
|
)
|
|
|
|
def test_parse_due_date(self):
|
|
self.assertEqual(parse_due_date_ymd("20261009"), date(2026, 10, 9))
|
|
self.assertEqual(parse_due_date_ymd("2026-10-09"), date(2026, 10, 9))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|