Conceitos
Componentes e alíquotas
CBS, IBS_UF e IBS_MUN, valores decimais em string e os três estados de cálculo de uma alternativa.
Cada alternativa de enquadramento traz o resultado por componente do tributo, em components, e o estado do cálculo, em calculation.
Um par CST/cClassTrib, três componentes#
A regra fiscal produz um par (CST, cClassTrib). O GetTax aplica esse par aos três componentes:
| Componente | Tributo |
|---|---|
CBS | Contribuição sobre Bens e Serviços (federal) |
IBS_UF | Imposto sobre Bens e Serviços, parcela estadual |
IBS_MUN | Imposto sobre Bens e Serviços, parcela municipal |
CST e cClassTrib são os mesmos nos três componentes. O que varia é a alíquota e, entre CBS e IBS, a redução: a tabela oficial de cClassTrib traz uma redução para a CBS (reductionPctCbs) e outra para o IBS (reductionPctIbs, aplicada a IBS_UF e IBS_MUN).
Trate a lista de componentes como aberta: o Imposto Seletivo, por exemplo, está previsto para 2027. Seu sistema não deve quebrar ao receber um componente novo.
Valores decimais#
Alíquotas e reduções são strings com fração decimal e 6 casas. Nunca percentuais inteiros, nunca números de ponto flutuante.
| Valor | Significa |
|---|---|
"0.009000" | 0,9% |
"0.001000" | 0,1% |
"0.600000" | 60% |
"1.000000" | 100% |
A alíquota efetiva segue sempre a mesma fórmula:
effectiveRate = standardRate × (1 − reductionPct)Com CBS de 0,9% e redução de 60%: 0.009000 × (1 − 0.600000) = 0.003600, ou seja, 0,36%.
Converta as strings direto para um tipo decimal exato (decimal em C# e SQL, BigDecimal em Java, Decimal em Python, bcmath em PHP) e guarde como texto ou decimal. Não passe por float ou double. Ver Boas práticas.
Estado do cálculo#
calculation.status diz se a alternativa tem números e de que tipo. Ele deriva do calculationMode da linha de cClassTrib:
calculationMode (tabela) | calculation.status | components |
|---|---|---|
STANDARD | CALCULATED | Três componentes STANDARD, com standardRate, reductionPct e effectiveRate. |
NOT_DUE | NOT_DUE | Três componentes NOT_DUE, sem alíquota nem redução. |
UNSUPPORTED | UNAVAILABLE com CALCULATION_UNSUPPORTED | null |
UNAVAILABLE também aparece quando falta algo para calcular. O motivo vem em calculation.reason:
reason | Significa |
|---|---|
TAX_CLASSIFICATION_MISSING | Não há linha vigente de cClassTrib para o código produzido pela regra. taxClassification vem null. |
CST_MISMATCH | O CST da regra diverge do CST do código na tabela oficial. |
RATE_MISSING | Falta alíquota vigente para algum componente. |
CALCULATION_UNSUPPORTED | O código tem mecânica que o motor ainda não calcula, como diferimento e monofasia. |
Uma alternativa UNAVAILABLE continua na resposta, com o motivo. Ela não é descartada nem recebe uma alíquota obtida por analogia, e deixa o status da consulta em IN_REVIEW com INCOMPLETE_CLASSIFICATION.
Trecho de classifications com duas alternativas para o mesmo produto: uma calculada, com reduções diferentes para CBS e IBS, e uma de diferimento, sem cálculo (valores ilustrativos):
[ { "stage": "PRODUCT", "rule": { "id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d", "version": 1, "effectiveFrom": "2026-01-01", "effectiveTo": null, "ncm": "10062010", "gtin": null, "sector": null }, "cst": "200", "cClassTrib": "200038", "applicability": "Insumo agropecuário, destinatário fora das hipóteses do art. 138 §2º.", "observation": null, "legalBasis": "LC 214/2025, Art. 138", "taxClassification": { "id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e", "sourceVersion": "CCLASSTRIB-2026", "effectiveFrom": "2026-01-01", "effectiveTo": null, "cst": "200", "cClassTrib": "200038", "reductionPctIbs": "0.600000", "reductionPctCbs": "0.300000", "gTribRegular": false, "isApplicable": true, "calculationMode": "STANDARD", "legalBasis": "LC 214/2025, Art. 138" }, "rates": [ { "id": "0b1c2d3e-4f50-4a61-8b72-c3d4e5f60718", "sourceVersion": "ALIQUOTAS-2026", "effectiveFrom": "2026-01-01", "effectiveTo": null, "component": "CBS", "rate": "0.009000" }, { "id": "1c2d3e4f-5061-4b72-9c83-d4e5f6071829", "sourceVersion": "ALIQUOTAS-2026", "effectiveFrom": "2026-01-01", "effectiveTo": null, "component": "IBS_UF", "rate": "0.001000" }, { "id": "2d3e4f50-6172-4c83-ad94-e5f60718293a", "sourceVersion": "ALIQUOTAS-2026", "effectiveFrom": "2026-01-01", "effectiveTo": null, "component": "IBS_MUN", "rate": "0.000000" } ], "components": [ { "component": "CBS", "cst": "200", "cClassTrib": "200038", "status": "STANDARD", "standardRate": "0.009000", "reductionPct": "0.300000", "effectiveRate": "0.006300" }, { "component": "IBS_UF", "cst": "200", "cClassTrib": "200038", "status": "STANDARD", "standardRate": "0.001000", "reductionPct": "0.600000", "effectiveRate": "0.000400" }, { "component": "IBS_MUN", "cst": "200", "cClassTrib": "200038", "status": "STANDARD", "standardRate": "0.000000", "reductionPct": "0.600000", "effectiveRate": "0.000000" } ], "calculation": { "status": "CALCULATED" } }, { "stage": "PRODUCT", "rule": { "id": "c3d4e5f6-a7b8-4c9d-8e0f-1a2b3c4d5e6f", "version": 1, "effectiveFrom": "2026-01-01", "effectiveTo": null, "ncm": "10062010", "gtin": null, "sector": null }, "cst": "515", "cClassTrib": "515001", "applicability": "Insumo agropecuário com destinatário do regime regular nas hipóteses do art. 138 §2º.", "observation": "Depende do regime do destinatário, que a requisição não carrega.", "legalBasis": "LC 214/2025, Art. 138, § 2º", "taxClassification": { "id": "d4e5f6a7-b8c9-4d0e-9f1a-2b3c4d5e6f7a", "sourceVersion": "CCLASSTRIB-2026", "effectiveFrom": "2026-01-01", "effectiveTo": null, "cst": "515", "cClassTrib": "515001", "reductionPctIbs": "0.600000", "reductionPctCbs": "0.600000", "gTribRegular": false, "isApplicable": true, "calculationMode": "UNSUPPORTED", "legalBasis": "LC 214/2025, Art. 138, § 2º" }, "rates": [ { "id": "0b1c2d3e-4f50-4a61-8b72-c3d4e5f60718", "sourceVersion": "ALIQUOTAS-2026", "effectiveFrom": "2026-01-01", "effectiveTo": null, "component": "CBS", "rate": "0.009000" }, { "id": "1c2d3e4f-5061-4b72-9c83-d4e5f6071829", "sourceVersion": "ALIQUOTAS-2026", "effectiveFrom": "2026-01-01", "effectiveTo": null, "component": "IBS_UF", "rate": "0.001000" }, { "id": "2d3e4f50-6172-4c83-ad94-e5f60718293a", "sourceVersion": "ALIQUOTAS-2026", "effectiveFrom": "2026-01-01", "effectiveTo": null, "component": "IBS_MUN", "rate": "0.000000" } ], "components": null, "calculation": { "status": "UNAVAILABLE", "reason": "CALCULATION_UNSUPPORTED" } }]A primeira alternativa tem CBS efetiva de 0,63% (redução de 30%) e IBS-UF efetiva de 0,04% (redução de 60%). A segunda depende do regime do destinatário, como diz observation, e não tem número. A consulta inteira volta IN_REVIEW.
Não incidência não é redução de 100%#
São situações fiscais diferentes, com CSTs diferentes, e o GetTax as representa de formas diferentes:
- Redução de 100%: o tributo é devido, com base reduzida a zero. Componentes
STANDARD, comreductionPct"1.000000"eeffectiveRate"0.000000". - Não incidência, imunidade: não há tributo a apresentar.
calculation.statuséNOT_DUEe os componentes vêm comstatus: "NOT_DUE", sem alíquota nem redução.
Não converta um no outro. Em NOT_DUE, não preencha alíquotas zeradas por conta própria.
Alternativa NOT_DUE, de uma transferência entre estabelecimentos do mesmo titular (CFOP 5152, etapa OPERATION):
{ "stage": "OPERATION", "rule": { "id": "e5f6a7b8-c9d0-4e1f-a2b3-c4d5e6f7a8b9", "version": 1, "effectiveFrom": "2026-01-01", "effectiveTo": null, "ncm": null, "gtin": null, "sector": null }, "cst": "410", "cClassTrib": "410002", "applicability": "Transferência entre estabelecimentos do mesmo titular.", "observation": null, "legalBasis": "LC 214/2025, Art. 6º, II", "taxClassification": { "id": "f6a7b8c9-d0e1-4f2a-b3c4-d5e6f7a8b9c0", "sourceVersion": "CCLASSTRIB-2026", "effectiveFrom": "2026-01-01", "effectiveTo": null, "cst": "410", "cClassTrib": "410002", "reductionPctIbs": "0.000000", "reductionPctCbs": "0.000000", "gTribRegular": false, "isApplicable": true, "calculationMode": "NOT_DUE", "legalBasis": "LC 214/2025, Art. 6º, II" }, "rates": [ { "id": "0b1c2d3e-4f50-4a61-8b72-c3d4e5f60718", "sourceVersion": "ALIQUOTAS-2026", "effectiveFrom": "2026-01-01", "effectiveTo": null, "component": "CBS", "rate": "0.009000" }, { "id": "1c2d3e4f-5061-4b72-9c83-d4e5f6071829", "sourceVersion": "ALIQUOTAS-2026", "effectiveFrom": "2026-01-01", "effectiveTo": null, "component": "IBS_UF", "rate": "0.001000" }, { "id": "2d3e4f50-6172-4c83-ad94-e5f60718293a", "sourceVersion": "ALIQUOTAS-2026", "effectiveFrom": "2026-01-01", "effectiveTo": null, "component": "IBS_MUN", "rate": "0.000000" } ], "components": [ { "component": "CBS", "cst": "410", "cClassTrib": "410002", "status": "NOT_DUE" }, { "component": "IBS_UF", "cst": "410", "cClassTrib": "410002", "status": "NOT_DUE" }, { "component": "IBS_MUN", "cst": "410", "cClassTrib": "410002", "status": "NOT_DUE" } ], "calculation": { "status": "NOT_DUE" }}Tabelas por trás do cálculo#
taxClassificationé a linha da tabela oficial de cClassTrib usada: CST, reduções de CBS e IBS, modo de cálculo e fundamento legal do código, comsourceVersione vigência.rates[]são as alíquotas padrão vigentes na data de referência, uma por componente, também comsourceVersione vigência. Elas vêm mesmo quando a alternativa não tem cálculo.- O
legalBasisque vale para a alternativa é o dela, não o detaxClassification: a curadoria pode cadastrar um fundamento próprio para a regra.
