# 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.

Versão HTML: https://kind-coast-062131010.2.azurestaticapps.net/guias/componentes-e-aliquotas/

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:

```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](https://kind-coast-062131010.2.azurestaticapps.net/guias/boas-praticas.md#valores-fiscais-como-decimal).

## 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):

```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.
