import pytest from central.app.dry_run_planner import ( build_field_proposals, execute, mva_evidence, split_by_eligibility, ) def _decision(**overrides): base = { "status": "EXACT_NCM", "cest_status": "NO_CEST_MAPPING_FOUND", "ipi_status": "NO_TIPI_MAPPING_FOUND", "ba_st_mva_status": "NO_MVA_MAPPING_FOUND", "classification": { "ncm": "07069000", "cest": [], "ipi": None, "ba_st_mva": None, "ba_st_mva_candidates": [], }, "dataset_versions": {"ncm": "n1", "cest": "c1", "tipi_ipi": "t1", "ba_st_mva": "m1"}, "engine_version": "0.1.0", "decision_version": "mvp", "request_fingerprint": "fp", } base.update(overrides) return base def test_ipi_resolved_numeric_current_unknown(): decision = _decision(ipi_status="IPI_RESOLVED", classification={**_decision()["classification"], "ipi": {"rate": "3.25", "rate_numeric": 3.25, "rate_kind": "NUMERIC", "ex": None}}) proposals = build_field_proposals("000026", decision, {}) ipi = next(p for p in proposals if p["field"] == "IPI") assert ipi["status"] == "CURRENT_UNKNOWN" assert ipi["write_eligible"] is False assert ipi["proposed_value"] == 3.25 def test_ipi_resolved_numeric_same_value(): decision = _decision(ipi_status="IPI_RESOLVED", classification={**_decision()["classification"], "ipi": {"rate": "3.25", "rate_numeric": 3.25, "rate_kind": "NUMERIC", "ex": None}}) proposals = build_field_proposals("000026", decision, {"ipi": 3.25, "ex_tipi": None}) ipi = next(p for p in proposals if p["field"] == "IPI") assert ipi["status"] == "SAME_VALUE" assert ipi["write_eligible"] is False def test_ipi_resolved_numeric_change_required(): decision = _decision(ipi_status="IPI_RESOLVED", classification={**_decision()["classification"], "ipi": {"rate": "3.25", "rate_numeric": 3.25, "rate_kind": "NUMERIC", "ex": None}}) proposals = build_field_proposals("000026", decision, {"ipi": None, "ex_tipi": None}) ipi = next(p for p in proposals if p["field"] == "IPI") assert ipi["status"] == "CHANGE_REQUIRED" assert ipi["write_eligible"] is True assert ipi["proposed_value"] == 3.25 def test_ipi_non_numeric_marker_never_proposes_a_write(): decision = _decision(ipi_status="IPI_RESOLVED", classification={**_decision()["classification"], "ipi": {"rate": "NT", "rate_numeric": None, "rate_kind": "NON_NUMERIC", "rate_classification": "NT_OR_NON_TAXED", "ex": None}}) proposals = build_field_proposals("000004", decision, {"ipi": None, "ex_tipi": None}) ipi = next(p for p in proposals if p["field"] == "IPI") assert ipi["status"] == "NON_NUMERIC_IPI_STATUS" assert ipi["proposed_value"] is None assert ipi["write_eligible"] is False assert ipi["reason_code"] == "TIPI_RATE_NT_OR_NON_TAXED" def test_ipi_resolved_without_concrete_rate_still_produces_a_row(): decision = _decision(ipi_status="IPI_RESOLVED", classification={**_decision()["classification"], "ipi": {"rate": None, "rate_numeric": None, "rate_kind": "BLANK", "rate_classification": "SOURCE_BLANK", "ex": None}}) proposals = build_field_proposals("000018", decision, {"ipi": 5, "ex_tipi": None}) ipi = next(p for p in proposals if p["field"] == "IPI") assert ipi["status"] == "SOURCE_BLANK" assert ipi["proposed_value"] is None assert ipi["write_eligible"] is False assert ipi["reason_code"] == "TIPI_RATE_SOURCE_BLANK" def test_no_ex_tipi_row_when_no_ex_candidates(): decision = _decision(ipi_status="IPI_RESOLVED", classification={**_decision()["classification"], "ipi": {"rate": "3.25", "rate_numeric": 3.25, "rate_kind": "NUMERIC", "ex": None}, "ipi_candidates": []}) proposals = build_field_proposals("000026", decision, {"ipi": None, "ex_tipi": None}) assert all(p["field"] != "EX_TIPI" for p in proposals) def test_ex_tipi_concrete_single_candidate_change_required(): decision = _decision( ipi_status="IPI_CANDIDATES", classification={**_decision()["classification"], "ipi": None, "ipi_candidates": [{"ncm": "07069000", "ex": "01", "description": "specific", "rate": "5"}]}, ) proposals = build_field_proposals("000004", decision, {"ex_tipi": None}) ex = next(p for p in proposals if p["field"] == "EX_TIPI") assert ex["status"] == "CHANGE_REQUIRED" assert ex["proposed_value"] == "01" assert ex["write_eligible"] is True def test_ex_tipi_multiple_candidates_is_candidate_not_eligible(): decision = _decision( ipi_status="IPI_CANDIDATES", classification={**_decision()["classification"], "ipi": None, "ipi_candidates": [ {"ncm": "07069000", "ex": "01", "description": "a", "rate": "5"}, {"ncm": "07069000", "ex": "02", "description": "b", "rate": "7"}, ]}, ) proposals = build_field_proposals("000004", decision, {"ex_tipi": None}) ex = next(p for p in proposals if p["field"] == "EX_TIPI") assert ex["status"] == "CANDIDATE" assert ex["proposed_value"] is None assert ex["write_eligible"] is False def test_cest_confirmed_change_required(): decision = _decision(cest_status="CEST_CONFIRMED", classification={**_decision()["classification"], "cest": ["17.087.02"]}) proposals = build_field_proposals("000018", decision, {"cest": ""}) cest = next(p for p in proposals if p["field"] == "CEST") assert cest["status"] == "CHANGE_REQUIRED" assert cest["write_eligible"] is True assert cest["proposed_value"] == "17.087.02" def test_cest_candidates_not_eligible(): decision = _decision(cest_status="CEST_CANDIDATES") proposals = build_field_proposals("000024", decision, {"cest": ""}) cest = next(p for p in proposals if p["field"] == "CEST") assert cest["status"] == "CANDIDATE" assert cest["proposed_value"] is None assert cest["write_eligible"] is False def test_cest_description_mismatch_not_eligible(): decision = _decision(cest_status="CEST_DESCRIPTION_MISMATCH") proposals = build_field_proposals("000018", decision, {"cest": ""}) cest = next(p for p in proposals if p["field"] == "CEST") assert cest["status"] == "UNRESOLVED" assert cest["reason_code"] == "CEST_DESCRIPTION_SCORE_BELOW_THRESHOLD" assert cest["write_eligible"] is False def test_legacy_ncm_review_no_invented_successor(): decision = _decision(status="LEGACY_NCM", classification={**_decision()["classification"], "ncm": "02071400"}) proposals = build_field_proposals("000016", decision, {"ipi": "3.25", "cest": ""}) assert len(proposals) == 1 row = proposals[0] assert row["field"] == "CLASSIFICACAO_FISCAL" assert row["status"] == "LEGACY_NCM_REVIEW" assert row["proposed_value"] is None assert row["write_eligible"] is False def test_mva_never_produces_a_write_proposal(): decision = _decision(ba_st_mva_status="MVA_CANDIDATES", classification={**_decision()["classification"], "ba_st_mva_candidates": [{"item": "1"}]}) proposals = build_field_proposals("000024", decision, {"cest": ""}) assert all(p["field"] != "BA_ST_MVA" for p in proposals) evidence = mva_evidence("000024", decision) assert evidence["status"] == "MVA_CANDIDATES" assert evidence["candidates"] def test_split_by_eligibility(): decision = _decision(ipi_status="IPI_RESOLVED", classification={**_decision()["classification"], "ipi": {"rate": "3.25", "rate_numeric": 3.25, "rate_kind": "NUMERIC", "ex": None}}) proposals = build_field_proposals("000026", decision, {}) split = split_by_eligibility(proposals) assert split["blocked"] == proposals assert split["eligible"] == [] def test_execute_refuses_non_eligible_proposal(): decision = _decision(ipi_status="IPI_RESOLVED", classification={**_decision()["classification"], "ipi": {"rate": "3.25", "rate_numeric": 3.25, "rate_kind": "NUMERIC", "ex": None}}) proposals = build_field_proposals("000026", decision, {}) with pytest.raises(PermissionError): execute(proposals) def test_execute_never_writes_even_when_eligible(): decision = _decision(ipi_status="IPI_RESOLVED", classification={**_decision()["classification"], "ipi": {"rate": "3.25", "rate_numeric": 3.25, "rate_kind": "NUMERIC", "ex": None}}) proposals = build_field_proposals("000026", decision, {"ipi": "0"}) eligible_only = split_by_eligibility(proposals)["eligible"] assert eligible_only with pytest.raises(NotImplementedError): execute(eligible_only)