protocol_transfer_status.py 1.2 KB

1234567891011121314151617181920212223242526272829303132333435
  1. """转账笔缴费状态规则(正式样本缴费 / 预签约意向金共用)"""
  2. from __future__ import annotations
  3. from decimal import Decimal
  4. from typing import Iterable, Optional, Tuple, Union
  5. def can_submit_receipt(pay_status: Optional[str]) -> bool:
  6. return (pay_status or "").strip() == "dfj"
  7. def can_confirm_receipt(pay_status: Optional[str]) -> bool:
  8. return (pay_status or "").strip() == "jfqrz"
  9. def can_withdraw_receipt(pay_status: Optional[str]) -> bool:
  10. """仅付款确认中可撤回为已付款。"""
  11. return (pay_status or "").strip() == "jfqrz"
  12. def can_edit_transfer(pay_status: Optional[str]) -> bool:
  13. """财务确认收款(yjf)前可编辑:已付款 / 付款确认中。"""
  14. return (pay_status or "").strip() in ("dfj", "jfqrz")
  15. def schedule_paid_and_arrears(
  16. *,
  17. due: Union[Decimal, float, int, str, None],
  18. confirmed_transfers: Iterable[Union[Decimal, float, int, str, None]],
  19. ) -> Tuple[Decimal, Decimal]:
  20. """已缴 = Σ 已确认转账;欠缴 = 应缴 − 已缴(可为负表示超缴)。"""
  21. due_amt = Decimal(str(due or 0))
  22. paid = sum((Decimal(str(x or 0)) for x in confirmed_transfers), Decimal("0"))
  23. return paid, due_amt - paid