from central.app.fiscal_decision import ERP_FIELD_MAP, decide_product REFS = {"cfop_valid": {"5102"}, "csosn": {"102", "500"}, "cst_icms": {"00", "40", "60"}, "cst_pis": {"01"}, "cst_cofins": {"01"}, "origem": set("012345678"), "fcp_uf": {"BA": {"aliq_1": "Fixo:2.00"}}, "cbs_rate_2026": 0.009, "cclasstrib_count": 164} COMPANY = {"uf": "BA", "crt": "1"} def product(**kw): base = {"CODIGO": "1", "PRODUTO": "X", "CLASSIFICACAO_FISCAL": "22030000", "CFOP": "5102", "CST": "040", "CSOSN": "102", "CEST": None, "IPI": None, "EX_TIPI": None, "ORIGEM": None, "COD_SAIDA_PIS": None, "COD_SAIDA_COFINS": None, "ALIQ_PIS": None} base.update(kw) return base def decision(**kw): base = {"status": "EXACT_NCM", "ipi_status": "IPI_RESOLVED", "cest_status": "CEST_CANDIDATES", "ba_st_mva_status": "MVA_CANDIDATES", "dataset_versions": {}, "classification": {"ncm": "22030000", "ipi": {"rate_kind": "NUMERIC", "rate_numeric": 3.9}, "cest_candidates": [1, 2]}} base.update(kw) return base def test_numeric_ipi_change_is_the_only_auto_apply(): out = decide_product(product(IPI=5102.0), decision(), COMPANY, REFS) assert out["IPI"]["action_class"] == "AUTO_APPLY_SAFE" and out["IPI"]["write_eligible"] and out["IPI"]["proposed_value"] == 3.9 assert [d for d, r in out.items() if r["write_eligible"]] == ["IPI"] def test_same_ipi_is_already_correct_not_write(): out = decide_product(product(IPI=3.9), decision(), COMPANY, REFS) assert out["IPI"]["action_class"] == "ALREADY_CORRECT" and not out["IPI"]["write_eligible"] def test_non_numeric_and_blank_ipi_never_write(): d = decision(classification={"ipi": {"rate_kind": "NON_NUMERIC", "rate_classification": "NT"}}) assert not decide_product(product(), d, COMPANY, REFS)["IPI"]["write_eligible"] d = decision(classification={"ipi": {"rate_kind": "BLANK"}}) r = decide_product(product(), d, COMPANY, REFS)["IPI"] assert not r["write_eligible"] and r["status"] == "RULE_UNRESOLVED" def test_operation_dependent_fields_never_resolved_or_written(): out = decide_product(product(), decision(), COMPANY, REFS) for dom in ("CFOP", "CSOSN", "CST_ICMS", "PIS_CST", "COFINS_CST", "FCP", "RTC_CCLASSTRIB", "RTC_CBS_RATE"): assert out[dom]["status"] == "OPERATION_CONTEXT_REQUIRED" and not out[dom]["write_eligible"] assert out["CFOP"]["domain_valid"] is True and out["FCP"]["fcp_rate_available"] is True assert out["RTC_CBS_RATE"]["proposed_value"] is None and out["RTC_CBS_RATE"]["reference_rate_2026"] == 0.009 def test_ncm_legacy_is_review_and_never_write(): out = decide_product(product(), decision(status="LEGACY_NCM"), COMPANY, REFS) assert out["NCM"]["action_class"] == "REVIEW_REQUIRED" and not any(r["write_eligible"] for r in out.values()) def test_origin_only_candidate_and_unconfirmed_mapping(): out = decide_product(product(), decision(), COMPANY, REFS) assert out["ORIGEM"]["status"] == "RULE_CANDIDATE" and not out["ORIGEM"]["write_eligible"] assert {f["ERP_FIELD"] for f in ERP_FIELD_MAP if f["MAPPING"] == "MAPPING_UNCONFIRMED"} >= {"ORIGEM", "CFOP_ENTRADA", "CST_ENTRADA"} def test_mva_never_written_even_when_resolved(): d = decision(ba_st_mva_status="MVA_RESOLVED", classification={"ipi": {"rate_kind": "NUMERIC", "rate_numeric": 1}, "ba_st_mva": {"mva_original": "140%"}}) r = decide_product(product(IPI=1), d, COMPANY, REFS)["MVA"] assert r["status"] == "RULE_RESOLVED" and not r["write_eligible"] def test_single_ex_without_description_evidence_is_candidate_not_write(): cls = {"ipi": {"rate_kind": "NUMERIC", "rate_numeric": 3.9}, "ipi_candidates": [{"ex": "1", "description": "Chope"}]} out = decide_product(product(PRODUTO="CERVEJA LATA", IPI=3.9), decision(classification=cls), COMPANY, REFS) assert out["EX_TIPI"]["status"] == "RULE_CANDIDATE" and not out["EX_TIPI"]["write_eligible"] out = decide_product(product(PRODUTO="CHOPE ESCURO", IPI=3.9), decision(classification=cls), COMPANY, REFS) assert out["EX_TIPI"]["status"] == "RULE_RESOLVED" and out["EX_TIPI"]["write_eligible"]