GetTax, powered by SAC Fiscal

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:

ComponenteTributo
CBSContribuição sobre Bens e Serviços (federal)
IBS_UFImposto sobre Bens e Serviços, parcela estadual
IBS_MUNImposto 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.

ValorSignifica
"0.009000"0,9%
"0.001000"0,1%
"0.600000"60%
"1.000000"100%

A alíquota efetiva segue sempre a mesma fórmula:

http
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.statuscomponents
STANDARDCALCULATEDTrês componentes STANDARD, com standardRate, reductionPct e effectiveRate.
NOT_DUENOT_DUETrês componentes NOT_DUE, sem alíquota nem redução.
UNSUPPORTEDUNAVAILABLE com CALCULATION_UNSUPPORTEDnull

UNAVAILABLE também aparece quando falta algo para calcular. O motivo vem em calculation.reason:

reasonSignifica
TAX_CLASSIFICATION_MISSINGNão há linha vigente de cClassTrib para o código produzido pela regra. taxClassification vem null.
CST_MISMATCHO CST da regra diverge do CST do código na tabela oficial.
RATE_MISSINGFalta alíquota vigente para algum componente.
CALCULATION_UNSUPPORTEDO 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):

json
[
{
"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, com reductionPct "1.000000" e effectiveRate "0.000000".
  • Não incidência, imunidade: não há tributo a apresentar. calculation.status é NOT_DUE e os componentes vêm com status: "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):

json
{
"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, com sourceVersion e vigência.
  • rates[] são as alíquotas padrão vigentes na data de referência, uma por componente, também com sourceVersion e vigência. Elas vêm mesmo quando a alternativa não tem cálculo.
  • O legalBasis que vale para a alternativa é o dela, não o de taxClassification: a curadoria pode cadastrar um fundamento próprio para a regra.