> ## Documentation Index
> Fetch the complete documentation index at: https://docs.engineapi.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Valor aproximado dos tributos (Lei 12.741)

> Como ligar, por emissor, o cálculo automático do vTotTrib pela tabela do IBPT: o que entra no documento, o que é recusado e o que acontece quando a tabela vence.

A Lei 12.741/2012 manda o documento fiscal informar **o valor aproximado dos
tributos federais, estaduais e municipais** que incidem sobre o preço de venda.
No leiaute da NF-e e da NFC-e esse valor é o `vTotTrib`, que aparece no item e
no total do documento.

A engineAPI resolve esse valor sozinha, pela tabela do **IBPT** ("De Olho no
Imposto"), quando você liga a opção **no cadastro da empresa**. É opcional de
propósito: **emissor que não liga a opção continua exatamente como está hoje**,
sem nenhuma mudança no documento emitido.

<Info>
  **Você não informa o valor.** O `vTotTrib` não é campo do corpo da requisição,
  nem com a opção ligada. Quem calcula é a engineAPI, a partir do NCM do item, da
  UF do emissor e da origem da mercadoria; é isso que permite citar a fonte no
  documento, como o termo de uso da tabela exige. Se você mandar o campo, a
  requisição é recusada com a mesma mensagem de sempre, e nada é ignorado em
  silêncio.
</Info>

## Como ligar

No cadastro da empresa (emissor), ligue `valorAproximadoTributosEnabled`:

```bash theme={null}
curl -X PATCH https://api.engineapi.com.br/v1/companies/{issuerId} \
  -H "Authorization: Bearer $ENGINE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "valorAproximadoTributosEnabled": true }'
```

A partir daí, **toda** NF-e e NFC-e desse emissor sai com o valor calculado.
Para voltar ao comportamento anterior, mande `false`.

## O que entra no documento

Com a opção ligada, cada nota passa a levar três coisas:

| Onde                     | O quê                                              |
| ------------------------ | -------------------------------------------------- |
| `det/imposto/vTotTrib`   | valor aproximado dos tributos **do item**          |
| `total/ICMSTot/vTotTrib` | **total** do documento (soma dos itens)            |
| `infAdic/infCpl`         | a frase com o valor total e a **citação da fonte** |

O texto acrescentado às informações complementares tem esta forma:

```
Valor aproximado dos tributos: R$ 314.50 (Fonte: IBPT/empresometro.com.br, tabela 26.2.A) - Lei 12.741/2012.
```

Ele é **acrescentado** ao que você mandou em `informacoesComplementares`: nada
do seu texto é apagado ou cortado.

## Como o valor é calculado

Para cada item:

1. A **UF do emissor** e o **NCM do item** selecionam a linha da tabela.
2. A **origem da mercadoria** (`items[].icms.origem`) decide qual percentual
   federal vale: produto nacional usa a coluna *nacional*; produto estrangeiro,
   ou nacional com conteúdo de importação acima de 40% (origens `1`, `2`, `3`,
   `6`, `7` e `8`), usa a coluna *importado*.
3. O percentual total (federal + estadual + municipal) incide sobre o **valor da
   operação do item**, o mesmo valor líquido que serve de base no resto do
   documento (produto menos desconto, mais frete/seguro/outras despesas quando
   cobrados de você).
4. O total do documento é a **soma dos valores já arredondados** de cada item, e
   por isso sempre fecha com o somatório dos itens.

O número é **aproximado por definição legal** (Decreto 8.264/2014, art. 2º, § 2º:
a apuração pode se dar por valores médios). A fonte dos percentuais é o IBPT, e é
por isso que a citação da fonte acompanha o valor: a responsabilidade pelo
cálculo é do instituto que publica a tabela.

## Quando a emissão é recusada

Todas as recusas acontecem **antes de qualquer número fiscal ser consumido**.

| `code`                    | HTTP | Quando                                                                                                                                                                   |
| ------------------------- | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `IBPT_NCM_SEM_TABELA`     | 422  | a tabela não tem linha para aquele NCM na UF do emissor **e o modo estrito está ligado**. Por padrão esse caso não recusa: veja a seção abaixo                           |
| `IBPT_NCM_AUSENTE`        | 422  | item sem NCM de 8 dígitos (o valor é resolvido por NCM)                                                                                                                  |
| `IBPT_ORIGEM_INVALIDA`    | 422  | `items[].icms.origem` fora de 0 a 8 (Tabela A do Ajuste SINIEF 15/13)                                                                                                    |
| `IBPT_INDISPONIVEL`       | 422  | não foi possível consultar a tabela agora. Tente de novo em alguns minutos                                                                                               |
| `IBPT_CITACAO_NAO_CABE`   | 422  | com a citação da fonte, `informacoesComplementares` passaria de 5.000 caracteres. A citação é obrigatória, então o valor não é escrito sem ela nem o seu texto é cortado |
| `IBPT_UF_EMISSOR_AUSENTE` | 422  | cadastro do emissor sem UF (a tabela é estadual)                                                                                                                         |

## Quando a tabela vence

A tabela do IBPT tem prazo de validade publicado pela própria fonte, e o termo de
uso **proíbe exibir o dado fora da validade**. Se a validade passar e a
engineAPI ainda não tiver renovado o espelho, o comportamento é:

* a nota **é emitida normalmente**, sem o `vTotTrib` e sem a citação;
* o time da engineAPI é avisado na hora, porque renovar a tabela é obrigação
  nossa, não sua.

Recusar a sua emissão por uma falha de operação nossa seria trocar um problema
por outro pior.

## Quando o NCM não está na tabela

A tabela do IBPT não cobre todo código da NCM. Quando ela não tem linha para o
NCM do seu item na UF do emissor, o padrão da engineAPI é o mesmo da tabela
vencida:

* a nota **é emitida normalmente**, sem o `vTotTrib` e sem a citação da fonte
  em nenhum item, nem nos que têm linha, porque o total precisa fechar com a
  soma dos itens;
* a ausência **não é silenciosa**: sai em log e num contador que o time da
  engineAPI acompanha.

Derrubar uma nota legítima por causa de um código fora da tabela seria o pior
dos dois lados, e é um estrago sem desfazer. Se a sua operação precisar do
comportamento oposto (**recusar** em vez de emitir sem o valor), fale com o
suporte: é uma chave de ambiente (`IBPT_BLOQUEAR_NCM_DESCONHECIDO`), sem mudança
de código, e aí volta o 422 `IBPT_NCM_SEM_TABELA`.

Vale notar um caso que engana: a fonte responde a alguns códigos (como
`00000000`) com uma linha genérica descrita como *"produto não especificado na
lista de NCM"*. A engineAPI **não** usa esse número: é a fonte dizendo que não
conhece o produto, e citá-la sobre um valor genérico não seria honesto. Esse
caso cai na mesma regra acima.

## No sandbox

O sandbox exercita o fluxo inteiro com uma tabela de **demonstração**: o
documento sintético sai com `vTotTrib` no item e no total, e a citação declara,
no próprio texto, que o dado é de demonstração e não tem valor fiscal. Dois NCMs
reproduzem, no sandbox, o que a fonte real faz com código que ela não conhece:
`00000000` (a linha genérica "não especificado") e qualquer código começado por
`9999` (o "não conheço" direto). Nos dois, o documento sai **sem** `vTotTrib` e
**sem** a citação. Exercite esse caminho antes de ligar a opção em produção.

## Perguntas rápidas

**Posso mandar o valor já calculado pelo meu ERP?**
Hoje não. O campo não existe no corpo da requisição, e a citação da fonte que vai
no documento só é honesta sobre um número que a engineAPI calculou.

**Vale para NFS-e?**
Não. Na NFS-e o total de tributos tem grupo próprio no leiaute nacional
(`totTrib`, com `pTotTribSN` para o Simples). Veja o guia de
[NFS-e](/guides/nfse).

**A tabela é a mesma para todas as UFs?**
Não: os percentuais mudam por UF, e a linha usada é sempre a da **UF do
emissor**.
