"""Missão 6 / Bloco A.2: Inventário dos 9 datasets existentes no Hub e migração para o Reference Data Registry. Datasets catalogados: 1. NCM (Siscomex) 2. TIPI_IPI (Receita Federal) 3. CEST (CONFAZ) 4. BA_ST_MVA (SEFAZ-BA) 5. NFE_MOC_TABLES (Receita Federal / ENCAT) 6. CFOP (Portal Nacional NF-e) 7. FCP (Portal Nacional NF-e) 8. ANP (Portal Nacional NF-e) 9. NCM_UTRIB (Portal Nacional NF-e) """ from __future__ import annotations from dataclasses import dataclass from typing import Optional from sqlalchemy import select, update from sqlalchemy.orm import Session from ..models import Dataset @dataclass(frozen=True) class DatasetInventoryItem: kind: str name: str provider: str source_url: str version_label: str expected_rows_approx: int act: str validity_info: str coverage: str licence_terms: str raw_file_name: Optional[str] = None DATASET_INVENTORY_9: tuple[DatasetInventoryItem, ...] = ( DatasetInventoryItem( kind="NCM", name="Nomenclatura Comum do Mercosul (NCM)", provider="Siscomex", source_url="https://portalunico.siscomex.gov.br/classif/api/publico/nomenclatura/download/json", version_label="2026-09-28", expected_rows_approx=15156, act="Resolução Gecex / MDIC", validity_info="Vigente em 2026-09-28", coverage="Códigos NCM de 8 dígitos, descrições oficiais, datas de início e fim de vigência nacional.", licence_terms="Dado público oficial (Governo Federal / Siscomex); sem termos de uso restritivos conhecidos.", raw_file_name="ncm_vigente_20260928.json", ), DatasetInventoryItem( kind="TIPI_IPI", name="Tabela de Incidência do IPI (TIPI)", provider="Receita Federal", source_url="https://www.gov.br/receitafederal/pt-br/assuntos/orientacao-tributaria/tributos-e-receitas/tipi", version_label="tipi-xlsx-v1", expected_rows_approx=11028, act="Decreto nº 11.158/2022 e alterações até ADE 001-2026", validity_info="Vigente desde 2022 com atualizações até 2026", coverage="Alíquotas de IPI (percentuais ou NT) por NCM de 8 dígitos e código de exceção EX.", licence_terms="Dado público oficial (Receita Federal do Brasil); dados abertos governamentais.", raw_file_name="1 TIPI 2022 - Atualizada ADE 001-2026.xlsx", ), DatasetInventoryItem( kind="CEST", name="Código Especificador da Substituição Tributária (CEST)", provider="CONFAZ", source_url="https://www.confaz.fazenda.gov.br/legislacao/convenios/2018/CV142_18", version_label="CV142_18", expected_rows_approx=1096, act="Convênio ICMS 142/18", validity_info="Vigente com modificações sucessivas", coverage="Relação de CEST (7 dígitos), segmentos (Anexos II a XXVI) e códigos NCM aplicáveis à ST.", licence_terms="Dado público oficial (Conselho Nacional de Política Fazendária - CONFAZ).", raw_file_name="CV142_18.html", ), DatasetInventoryItem( kind="BA_ST_MVA", name="Pauta Fiscal e Margens de Valor Agregado ST da Bahia", provider="SEFAZ-BA", source_url="http://www.sefaz.ba.gov.br/legislacao/ricms/anexo1.pdf", version_label="ba-st-mva-pdf-v1", expected_rows_approx=757, act="RICMS/BA Anexo 1 (Decreto nº 13.780/2012)", validity_info="Vigente em 2026 na Bahia", coverage="Produtos sujeitos a ICMS-ST no Estado da Bahia, NCM/SH, CEST e percentuais de MVA original/ajustada.", licence_terms="Legislação tributária pública estadual (SEFAZ-BA).", raw_file_name="decreto_2012_13780_ricms_anexo_1_vigente_2026.pdf", ), DatasetInventoryItem( kind="NFE_MOC_TABLES", name="Tabelas de Domínios do MOC da NF-e / NFC-e", provider="Receita Federal / ENCAT", source_url="http://www.nfe.fazenda.gov.br/portal/principal.aspx", version_label="moc7-tables-v1", expected_rows_approx=104, act="MOC 7.0 Anexo I (Visão Geral de Leiaute e Regras de Validação)", validity_info="Vigente nacionalmente", coverage="Domínios oficiais de ORIGEM_MERCADORIA (9), CST_ICMS (14), CSOSN (10), CST_PIS (36) e CST_COFINS (36).", licence_terms="Documento técnico público oficial (ENCAT / Portal Nacional NF-e).", raw_file_name="moc7-anexo-i-leiaute-e-rv.pdf", ), DatasetInventoryItem( kind="CFOP", name="Tabela de Códigos Fiscais de Operações e Prestações (CFOP)", provider="Portal Nacional NF-e", source_url="https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=Iy/5QolvUsQ=", version_label="cfop-xlsx-v1", expected_rows_approx=593, act="Informe Técnico 2023.002 v2.10", validity_info="Vigente desde 2023", coverage="CFOP de 4 dígitos, vigências, indicadores operacionais (devolução, anulação, remessa, combustível) e descrições.", licence_terms="Dado público oficial (Portal Nacional da NF-e).", raw_file_name="IT_2023_002_v2_10_Tabela_CFOP_Descrição.xlsx", ), DatasetInventoryItem( kind="FCP", name="Tabela de Alíquotas de FCP por UF", provider="Portal Nacional NF-e", source_url="https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=Iy/5QolvUsQ=", version_label="fcp-xlsx-v1", expected_rows_approx=27, act="Tabela de Alíquotas FCP por UF", validity_info="Vigente (fevereiro/2025)", coverage="Alíquotas adicionais do Fundo de Combate à Pobreza para os 26 estados e Distrito Federal.", licence_terms="Dado público oficial (Portal Nacional da NF-e).", raw_file_name="Tabela_Alíquotas_FCP_por_UF_2025-02_07.xlsx", ), DatasetInventoryItem( kind="ANP", name="Tabela de Códigos de Produto ANP", provider="Portal Nacional NF-e", source_url="https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=Iy/5QolvUsQ=", version_label="anp-xlsx-v1", expected_rows_approx=184, act="Tabela de Código de Produto ANP", validity_info="Vigente (novembro/2024)", coverage="Códigos cProdANP e descrições oficiais de combustíveis e derivados de petróleo regulados pela ANP.", licence_terms="Dado público oficial (ANP / Portal Nacional da NF-e).", raw_file_name="Tabela_Codigo_Produto_ANP-20241118.xlsx", ), DatasetInventoryItem( kind="NCM_UTRIB", name="Tabela de Correlação NCM x Unidade Tributável", provider="Portal Nacional NF-e", source_url="https://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=Iy/5QolvUsQ=", version_label="ncm-utrib-xlsx-v1", expected_rows_approx=10374, act="Informe Técnico 2024.001 - NCM x uTrib", validity_info="Vigente a partir de 01.10.2026 / 2024", coverage="Mapeamento de cada NCM de 8 dígitos para a respectiva Unidade Tributável (uTrib) padrão nacional.", licence_terms="Dado público oficial (Portal Nacional da NF-e).", raw_file_name="IT2024.001v2.40 - Tabela NCM 2022 com Utrib_Comércio Exterior_vigência 01.10.26.xlsx", ), ) def sync_inventory_to_registry(session: Session) -> dict[str, int]: """Sincroniza os datasets existentes com as metainformações do Reference Data Registry. Garante que os datasets já ativos no Hub (ACTIVE ou VIGENTE) possuam: - licence_terms preenchidos - act oficial correto - raw_file_path preenchido quando disponível - visibilidade no Registry sem criar segunda fonte ou duplicar linhas. """ inventory_map = {item.kind: item for item in DATASET_INVENTORY_9} updated = 0 active_datasets = session.scalars(select(Dataset).where(Dataset.status.in_(("ACTIVE", "VIGENTE")))).all() for ds in active_datasets: inv = inventory_map.get(ds.kind) if inv: changed = False if not ds.licence_terms: ds.licence_terms = inv.licence_terms changed = True if not ds.act: ds.act = inv.act changed = True if inv.raw_file_name and not ds.raw_file_path: ds.raw_file_path = f"sources/raw/bootstrap_v1/{inv.raw_file_name}" changed = True if changed: updated += 1 session.commit() return {"active_found": len(active_datasets), "updated": updated}