from datetime import date from central.app import rtc_reference_data as ref from central.app.cclasstrib_resolver import (ANNEX_DEFAULT_CLASS, annex_matches, compare_catalogs, local_catalog_hash, resolve_cclasstrib, verify_annex_class_map) TODAY = date(2026, 9, 24) NORMAL, SIMPLES = {"crt": "3"}, {"crt": "1"} ON = {"rtc_enabled": True, "local_catalog_valid": True} def local_from_official(skip=(), tweak=None): rows = {} for r in ref.OFFICIAL_CCLASSTRIB: if r["code"] in skip: continue rows[r["code"]] = {"cst": r["cst"], "tipo_aliquota": r["tipo_aliquota"], "p_red_ibs": r["p_red_ibs"], "p_red_cbs": r["p_red_cbs"], "ind_nfe": r["ind_nfe"], "ind_nfce": r["ind_nfce"], "start": r["start"], "end": r["end"]} for code, change in (tweak or {}).items(): rows[code] = {**rows[code], **change} return rows def product(ncm, valid=True, code="1"): return {"CODIGO": code, "CLASSIFICACAO_FISCAL": ncm, "ncm_valid": valid} def resolve(ncm, company=NORMAL, ctx=ON, local=None, valid=True): return resolve_cclasstrib(product(ncm, valid), company, ctx, local if local is not None else local_from_official(), today=TODAY) def test_annex_default_class_map_is_verified_against_the_official_table(): assert verify_annex_class_map() == {annex: [] for annex in ANNEX_DEFAULT_CLASS} def test_reference_data_carries_provenance_and_the_expected_shape(): assert len(ref.OFFICIAL_CCLASSTRIB) == 164 and ref.OFFICIAL_CATALOG["sha256"] and ref.LC214_SOURCE["sha256"] and ref.LC214_SOURCE["accessed_at"] assert {"I", "VII", "VIII", "IX", "XV"} <= set(ref.LC214_ANNEXES) and ref.LC214_ANNEXES["XIV"]["revoked"] is True assert len(ref.LC214_ANNEXES["I"]["items"]) == 26 and len(ref.LC214_ANNEXES["XV"]["items"]) == 6 def test_rtc_off_is_not_applicable_and_never_a_candidate(): r = resolve("10063021", ctx={"rtc_enabled": False, "local_catalog_valid": True}) assert r.status == "NOT_APPLICABLE" and r.rule_id == "RTC-R0" and not r.auto_apply_candidate def test_simples_is_insufficient_until_the_official_orientation_exists(): r = resolve("10063021", company=SIMPLES) assert r.status == "INSUFFICIENT_EVIDENCE" and r.rule_id == "RTC-R1" and not r.auto_apply_candidate and r.source_references[-1]["document"].startswith("NT 2025.002") assert resolve("10063021", company={"crt": None}).reason == "COMPANY_REGIME_UNKNOWN" def test_invalid_or_unconfirmed_ncm_is_insufficient(): assert resolve("1234", valid=True).reason == "NO_VALID_NCM" assert resolve("10063021", valid=False).reason == "NO_VALID_NCM" def test_clean_annex_item_resolves_to_the_annex_default_class_with_evidence(): r = resolve("10063021") # rice: Anexo I item 1 (subposicao 1006.30) assert r.status == "RESOLVED_WITH_EXPLICIT_RULE" and r.resolved_cclasstrib == "200003" and r.resolved_cst_ibscbs == "200" and r.rule_id == "RTC-R3" and r.auto_apply_candidate assert r.evidence[0]["annex"] == "I" and r.evidence[0]["clean"] is True and r.confidence_type == "ANNEX_TEXT_MATCH" assert r.source_references[0]["sha256"] == ref.LC214_SOURCE["sha256"] and r.inputs_used["ncm"] == "10063021" def test_conditional_annex_item_is_ambiguous_not_guessed(): milk = next(i for i in ref.LC214_ANNEXES["I"]["items"] if not i["clean"] and i["prefixes"]) ncm = milk["prefixes"][0].ljust(8, "0") r = resolve(ncm) assert r.status == "AMBIGUOUS" and r.rule_id == "RTC-A1" and not r.auto_apply_candidate and r.evidence[0]["clean"] is False def test_annex_without_a_unique_default_class_is_ambiguous(): item = next(i for i in ref.LC214_ANNEXES["IV"]["items"] if i["clean"]) # medical devices: 60% class vs zero-rated public-buyer class r = resolve(item["prefixes"][0].ljust(8, "1")) assert r.status == "AMBIGUOUS" and "NEEDS_OPERATION_OR_CONDITION" in r.reason def test_revoked_annex_only_is_ambiguous(): prefix = next(p for i in ref.LC214_ANNEXES["XIV"]["items"] for p in i["prefixes"] if len(p) == 8 and not annex_matches_other_than_xiv(p)) assert resolve(prefix).rule_id == "RTC-A1" and resolve(prefix).reason == "LISTED_ONLY_IN_REVOKED_ANNEX" def annex_matches_other_than_xiv(prefix): return [h for h in annex_matches(prefix) if h["annex"] != "XIV"] def test_nature_based_chapters_are_ambiguous(): for ncm in ("03028990", "30049099", "27101259", "49019900", "87032100", "90183100"): r = resolve(ncm) assert r.status == "AMBIGUOUS" and r.rule_id in ("RTC-A3", "RTC-A1", "RTC-A2"), ncm def test_residual_ncm_outside_every_annex_and_sensitive_chapter_is_integral_taxation(): r = resolve("39235000") # plastic closures: no annex, no nature-based regime assert r.status == "RESOLVED_WITH_EXPLICIT_RULE" and r.resolved_cclasstrib == "000001" and r.resolved_cst_ibscbs == "000" and r.rule_id == "RTC-R4" and r.confidence_type == "EXCLUSION_OF_ALL_SPECIAL_REGIMES" assert r.auto_apply_candidate and annex_matches("39235000") == [] def test_a_class_missing_or_different_in_the_local_catalog_is_never_proposed(): r = resolve("39235000", local=local_from_official(skip=("000001",))) assert r.status == "INSUFFICIENT_EVIDENCE" and r.reason == "CLASS_NOT_IN_LOCAL_CATALOG" and not r.auto_apply_candidate r2 = resolve("39235000", local=local_from_official(tweak={"000001": {"cst": "010"}})) assert r2.reason == "LOCAL_OFFICIAL_MISMATCH" and not r2.auto_apply_candidate r3 = resolve("10063021", local=local_from_official(tweak={"200003": {"ind_nfe": False, "ind_nfce": False}})) assert r3.reason == "LOCAL_OFFICIAL_MISMATCH" def test_invalid_local_catalog_blocks_every_proposal(): assert resolve("39235000", ctx={"rtc_enabled": True, "local_catalog_valid": False}).reason == "LOCAL_RTC_CATALOG_INVALID" def test_catalog_comparison_classifies_every_code_and_flags_material_problems(): full = compare_catalogs(local_from_official(), TODAY) assert full["counts"]["MATCH"] == 161 and full["counts"]["EXPIRED"] == 3 and full["compatibility"] == "PARTIAL_LOCAL_OUTDATED" # 220001-3 ended on 2026-01-01 assert compare_catalogs(local_from_official(skip=("220001", "220002", "220003")), TODAY)["compatibility"] == "FULL" outdated = compare_catalogs(local_from_official(skip=("000005", "200053")), TODAY) assert outdated["counts"]["OFFICIAL_ONLY"] == 2 and outdated["compatibility"] == "PARTIAL_LOCAL_OUTDATED" and outdated["counts"]["MISMATCH"] == 0 local = local_from_official(tweak={"200003": {"p_red_ibs": "60"}}) local["999999"] = {"cst": "000", "p_red_ibs": "0", "p_red_cbs": "0", "ind_nfe": True, "ind_nfce": True} bad = compare_catalogs(local, TODAY) assert bad["per_code"]["200003"] == "MISMATCH" and bad["per_code"]["999999"] == "LOCAL_ONLY" and bad["compatibility"] == "MATERIAL_MISMATCH" def test_local_catalog_hash_is_stable_and_sensitive(): a, b = local_from_official(), local_from_official(tweak={"200003": {"p_red_ibs": "60"}}) assert local_catalog_hash(a) == local_catalog_hash(local_from_official()) and local_catalog_hash(a) != local_catalog_hash(b) def test_resolution_is_deterministic_and_auditable(): a, b = resolve("10063021"), resolve("10063021") assert a.as_dict() == b.as_dict() and {"rule_id", "inputs_used", "source_references", "evidence", "reason"} <= set(a.as_dict())