“Simplificar é a forma mais sofisticada de resolver problemas.”
Este repositório traz um pacote completo (DDL, cargas, funções e exemplos) para resolver o cClassTrib de forma automática na emissão de documentos fiscais (NF-e, NFC-e e correlatos), tomando como base a Lei Complementar nº 214/2025 e seus Anexos/Artigos.
A solução está orientada a dados: você carrega as tabelas e usa a procedure RESOLVE_CCLASSTRIB para obter, de forma hierárquica, o código correto conforme tipo de operação, produto, Regra RTC (Anexo/Artigo), vigência e modelo de documento.
-
Crie o esquema (tabelas + funções/procedures):
Arquivo:tabelas.sql(incluiCCLASSTRIB_OFICIAL,TOP,PARTICIPANTE,PRODUTO,TOP_PRODUTO,NCM_NBS_CCLASSTRIB,VALIDA_VIGENCIA,VALIDA_MODELO,VALIDA_CCLASSTRIB,RESOLVE_CCLASSTRIBeCCLASSTRIB_POR_NCM). -
Carregue a tabela oficial de códigos e descrições:
Arquivo:CCLASSTRIB_OFICIAL.sql(espelho de códigos oficiais: descrição, CST, percentuais, vigência, indicadores por modelo). -
Carregue o mapeamento NCM ⇄ Regra RTC ⇄ cClassTrib:
Arquivo:ncm_cclasstrib.sql(somenteINSERTs). Regras de composição deREGRA_RTC:ANEXO_{n}quando há apenas uma possibilidade para o NCM;ANEXO_{n}_ART_{xxx}quando o mesmo NCM aparece em múltiplos anexos/artigos;ANEXO_{n}_ART_{xxx}_{CCLASSTRIB}quando, dentro do mesmo (anexo, artigo), há mais de um cClassTrib com aplicações distintas (preserva todas as hipóteses);- Exceções por artigo (sem anexo) incluem, por exemplo,
('96190000','ART_147','200013').
-
Cargas de exemplo (TOP/PRODUTO/TOP_PRODUTO) e consultas de teste:
Arquivos:dados-exemplo.sqlecomandos.sql. Estes populam casos didáticos (pão — Anexo I; fertilizantes — Anexo IX; saúde menstrual — Art. 147; etc.) e trazem queries prontas para explorar a solução.
CCLASSTRIB_OFICIAL: tabela oficial com descrição, CST, percentuais (PREDIBS/PREDCBS), vigência e flags por modelo (NFe/NFCe).TOP: tipo de operação (venda, devolução, bonificação, transferência…). Pode conter cClassTrib fixo (se preenchido, tem prioridade).TOP_PRODUTO: exceção por operação+produto (ex.: benefício para produtor rural em operação específica).PRODUTO: amarra o NCM aoREGRA_RTCdo item (ex.:ANEXO_1,ANEXO_9,ART_147), permite informar um cClasstrib em caso de exceções.PARTICIPANTE: tipo de participante da operação (pessoa física, pessoa jurídica, órgão público, etc).NCM_NBS_CCLASSTRIB: fallback: mapeia (NCM_NBS, REGRA_RTC) paraCCLASSTRIB(com colunas ANEXO e ARTIGO para busca). Mantém todas as aplicações distintas usando a convenção textual deREGRA_RTCdescrita acima.
A procedure RESOLVE_CCLASSTRIB recebe (ID_TOP, ID_PRODUTO, DATA_EMISSAO, MODELO_DF, ID_PARTICIPANTE) e retorna:
R_CCLASSTRIB,R_CST,R_FONTE(TOP / TOP_PRODUTO / PRODUTO / NCM / NCM_PARTICIPANTE, NBS / NBS_PARTICIPANTE),R_PREDIBS,R_PREDCBS.
Ordem de prioridade:
- TOP: se o
TOP.CCLASSTRIBvier preenchido, ele vence. - TOP_PRODUTO: senão, tenta a exceção por operação+produto.
- PRODUTO: senão, tenta a exceção do produto.
- NCM__NBS_CCLASSTRIB: busca por
(PRODUTO.NCM, PRODUTO.REGRA_RTC, ID_PARTICIPANTE). - NCM__NBS_CCLASSTRIB: por fim, busca pelo par
(PRODUTO.NCM, PRODUTO.REGRA_RTC)no fallback.
Em cada candidato, a procedure valida vigência (VALIDA_VIGENCIA) e modelo (VALIDA_MODELO). Se não houver nenhum válido, retorna NULL e o app pode aplicar 000001 (integral) ou tratar a exceção.
Exemplos (vide
comandos.sql):SELECT * FROM RESOLVE_CCLASSTRIB(1, 101, DATE '2026-02-01', 'NFe', 0); -- pão (Anexo I) SELECT * FROM RESOLVE_CCLASSTRIB(1, 201, DATE '2026-02-01', 'NFe', 0); -- fertilizante (Anexo IX) SELECT * FROM RESOLVE_CCLASSTRIB(2, 201, DATE '2026-02-01', 'NFe', 0); -- produtor rural (TOP_PRODUTO) SELECT * FROM RESOLVE_CCLASSTRIB(1, 401, DATE '2026-02-01', 'NFe', 0); -- saúde menstrual (ART_147)
REGRA_RTCtextual com granularidade suficiente- Evitamos perder aplicações diferentes em um mesmo NCM:
ANEXO_11_ART_142_200043≠ANEXO_11_ART_142_200044(caso segurança/soberania nacional, comprador e requisitos societários distintos).
- Para NCM único em um único anexo, mantemos
ANEXO_nsimples, sem inflar com artigo.
- Evitamos perder aplicações diferentes em um mesmo NCM:
- Colunas
ANEXOeARTIGO(INTEGER)- Facilitam buscas e reporting sem “parsear” a string.
- Exemplos de queries:
- Por anexo:
WHERE ANEXO = 9ouREGRA_RTC LIKE 'ANEXO_9%' - Por artigo:
WHERE ARTIGO = 147ouREGRA_RTC LIKE '%_ART_147%'
- Por anexo:
- Tabela Oficial (
CCLASSTRIB_OFICIAL)- Centraliza vigência, CST e percentuais. Toda resolução consulta essa tabela.
Estes exemplos estão prontos para execução após as cargas de
dados-exemplo.sqlecomandos.sql.
-
Pão (Anexo I):
SELECT * FROM RESOLVE_CCLASSTRIB(1, 101, DATE '2026-02-01', 'NFe', null);
→ fonte: NCM (fallback), retorna200003(redução 100%). -
Fertilizante (Anexo IX) — venda comum vs. produtor rural:
- Comum:
RESOLVE_CCLASSTRIB(1, 201, ...)→ NCM (Anexo IX). - Produtor rural:
RESOLVE_CCLASSTRIB(2, 201, ...)→ TOP_PRODUTO (exceção515001).
- Comum:
-
Saúde menstrual (Art. 147):
SELECT * FROM RESOLVE_CCLASSTRIB(1, 401, DATE '2026-02-01', 'NFe', null);
→ ART_147 (NCM96190000) com200013(alíquota zero). -
Consulta por NCM:
SELECT * FROM CCLASSTRIB_POR_NCM('94029090', null);
→ Lista todas as aplicações mapeadas para o NCM (útil para auditoria).
tabelas.sql— DDL completo do esquema + funções/procedures.CCLASSTRIB_OFICIAL.sql— carga do catálogo oficial (códigos, descrições, vigência, flags).ncm_cclasstrib.sql— carga deNCM_NBS_CCLASSTRIB(apenasINSERTs).dados-exemplo.sql— dados de exemplo paraTOP,PRODUTO,TOP_PRODUTO.comandos.sql— consultas de demonstração (how-to) para explorar a solução.
- Zero decisão manual no momento da emissão: tudo orientado por dados.
- Priorização clara: TOP → TOP_PRODUTO → NCM_NBS_CCLASSTRIB.
- Compatibilidade legal: vigência e modelo verificados a cada candidato.
- Flexível e audível: todas as hipóteses ficam mapeadas (inclusive múltiplas aplicações por NCM).
- Portável: implementado em Firebird, mas adaptável a qualquer SGBD relacional.
Este conteúdo é fornecido “como está”, com foco didático e para acelerar implementações. Ajustes e evoluções são bem-vindos via pull requests.