AutoRpa/rpa_contract/tests/test_group.py

96 lines
3.1 KiB
Python

from datetime import date
from decimal import Decimal
from group import (
draft_from_group,
group_by_supplier,
is_claimable,
missing_mdm_reason,
money4,
)
from repo import PurchaseContractRow
def _row(**overrides) -> PurchaseContractRow:
data = dict(
fid=1,
oms_id=2026100501,
supplier_id="SUP001",
supplier_name="示例供应商",
contract_sign_date=date(2026, 10, 1),
contract_start_date=date(2026, 10, 2),
contract_end_date=date(2027, 9, 30),
payment_term=90,
goods_id="G0001",
goods_name="阿莫西林胶囊",
reg_no="国药准字H20201234",
spec="0.25g*24粒",
unit="盒",
qty=Decimal("10.0000"),
unit_price=Decimal("100.0000"),
purchaser_id="P001",
purchaser_name="张三",
planner_id="PL001",
planner_name="李四",
contract_entry_status=None,
contract_no=None,
process_status=0,
org_code="901",
goods_mdm_code="QX0100167583",
supplier_mdm_code="DW0100046361",
)
data.update(overrides)
return PurchaseContractRow(**data)
def test_protocol_rerun_is_not_claimable():
row = _row(contract_entry_status=0, contract_no="HT-OLD")
assert is_claimable(row) is False
def test_blank_contract_no_is_still_claimable():
assert is_claimable(_row(contract_entry_status=0, contract_no=" ")) is True
assert is_claimable(_row(contract_entry_status=0, contract_no="")) is True
assert is_claimable(_row(contract_entry_status=0, contract_no=None)) is True
def test_processing_or_done_is_not_claimable():
assert is_claimable(_row(process_status=3)) is False
assert is_claimable(_row(process_status=1)) is False
def test_group_by_supplier_keeps_fid_order_and_first_header():
rows = [
_row(fid=2, supplier_id="B", payment_term=30, supplier_mdm_code="MDM-B"),
_row(fid=1, supplier_id="A", payment_term=90, supplier_mdm_code="MDM-A"),
_row(fid=3, supplier_id="A", payment_term=60, oms_id=2026100502, goods_id="G0002"),
]
groups = group_by_supplier(rows)
assert [g[0].supplier_id for g in groups] == ["A", "B"]
assert [r.fid for r in groups[0]] == [1, 3]
draft = draft_from_group(groups[0])
assert draft.customer_code == "MDM-A"
assert draft.payment_days == "90"
assert draft.order_date == "2026-10-01"
assert draft.contract_sign_date == "2026-10-01"
assert draft.contract_start_date == "2026-10-02"
assert draft.contract_end_date == "2027-09-30"
assert draft.amount == "2000.0000"
assert draft.source_type == ""
assert draft.is_prepayment == "否"
assert len(draft.goods_lines) == 2
assert draft.goods_lines[0].goods_code == "G0001"
assert draft.goods_lines[0].operation_code == "G0001"
assert draft.goods_lines[0].unit_price == "100.0000"
assert draft.belong_year == "2026"
def test_missing_mdm_reason():
rows = [_row(supplier_mdm_code="")]
assert missing_mdm_reason(rows) == "缺少供应商MDM码"
assert missing_mdm_reason([_row()]) is None
def test_money4():
assert money4(Decimal("10.5")) == "10.5000"