- Plugin IPI ativo (Plugin 1): o IPI aparece duas vezes no rodapé da nota/DANFE: no campo Valor do IPI (
totals.vIPI) e também no campo Desconto (totals.vDescDisplayNote), com o mesmo valor (Σ IPI dos itens). Isso destaca o IPI fiscalmente sem repassar ao cliente. O desconto comercial do vendedor fica embutido no Valor Unit. e Total de cada linha (preço líquido), sem coluna Valor Desc. por item.
- Desconto por item no pedido (valor ou % em produtos diferentes): cada item mantém só o desconto que recebeu no pedido. O sistema não rateia o total do desconto entre todos os produtos (
lastDiscountEdited: item_discount).
- Frete do pedido: ao gerar a nota a partir do pedido, o frete do pedido deve ir para o campo de frete da NF-e (
totals.vFrete).
Quando Plugin 1 está ativo, o desconto comercial do vendedor não aparece como desconto por linha na NF-e/DANFE/XML.
Ele fica embutido no preço. Portanto, em quase todas as bases de cálculo que usam “valor do produto”, o sistema deve usar o
valor líquido do item (preço já com desconto comercial), nunca o preço bruto de tabela (item.unit / item.price).
- vProdBruto = qty × preço de tabela. Ex.: 1 × 1.039,00 = 1.039,00
- vDescComercial = desconto do vendedor no item (R$ ou % do pedido). Ex.: 20,00. Visível na tela Fiscal em
fiscalAuthoritative.visibleDiscount; na linha da NF/DANFE fica 0,00.
- vProdLiquido = vProdBruto − vDescComercial. Ex.: 1.019,00. Fonte:
displayUnitPrice, displayProductTotal, dadosDoItem.valorUnitario, dadosDoItem.valorTotal.
- vIPI = valor fiscal do IPI do item. Com Plugin 1 ativo, a base de cálculo do IPI é o valor líquido (produto com desconto comercial). Sem Plugin 1, em importação costuma ser o bruto (
ipi.vBC).
- vDescRodapé (IPI como desconto) = Σ vIPI exibida no campo Desconto do rodapé. É IPI, não desconto comercial (
totals.vDescDisplayNote). Importante: com Plugin 1 ativo, Valor do IPI e Desconto no rodapé mostram o mesmo número — o IPI entra nos dois campos.
No bloco Cálculo do Imposto, o IPI total da nota aparece em dois lugares com o mesmo valor:
- VALOR DO IPI (
totals.vIPI) = Σ item.ipi.valor de todos os itens
- DESCONTO (
totals.vDescDisplayNote) = o mesmo Σ IPI (não é desconto comercial)
Efeito no total: o IPI é somado e depois abatido, então o cliente não paga IPI, mas o IPI continua visível na nota e na coluna VLR IPI de cada linha.
vNF = vProd + vFrete + vSeg + vOutro + vIPI − vDescRodapé
Como vDescRodapé = vIPI → vNF = vProd + vFrete + vSeg + vOutro
- V. TOTAL PRODUTOS (
totals.vProd) = Σ vProdLiquido de cada linha (coluna Valor Tot).
1.019,00 + 189,05 + 217,80 = 1.425,85
- BASE DE CÁLC. ICMS (
totals.vBC) = Σ base ICMS de cada linha (líquido + IPI quando plugin import.).
1.120,30 + 189,05 + 217,80 = 1.527,15
- VALOR DO ICMS (
totals.vICMS) = Σ ICMS das linhas.
44,81 + 7,56 + 8,71 = 61,08
- VALOR DO IPI = DESCONTO (rodapé) quando Plugin 1 ativo.
101,30 = 101,30
- VALOR TOTAL DA NOTA (
totals.vNF) = vProd + acrescimos − vDescRodapé (+ vIPI já cancela).
1.425,85 + 101,30 − 101,30 = 1.425,85
Conferência foto 2: todos os totais acima batem. Linhas usam preço líquido; item com IPI tem Base Cálc = líquido + IPI (1.019 + 101,30 = 1.120,30).
| DANFE / XML — Valor Unit. e Total linha | vProdLiquido | 1.019,00 |
| DANFE / XML — Valor Desc. por item | 0,00 (comercial embutido) | 0,00 |
| DANFE rodapé — Valor do IPI | Σ vIPI (destaque fiscal) | 101,30 |
| DANFE rodapé — Desconto | Σ vIPI (mesmo valor; abate do total) | 101,30 |
| DANFE rodapé — V. Total Produtos | Σ vProdLiquido | 1.425,85 (3 itens) |
| DANFE rodapé — Base de Cálc. ICMS | Σ base ICMS linha (líquido + IPI se import.) | 1.527,15 |
| DANFE rodapé — Valor Total da Nota | vProd + acresc. + vIPI − vDescRodapé | 1.425,85 |
| Fiscal item — desconto comercial (tela) | vDescComercial (só UI) | 20,00 |
| Base ICMS do item (+ IPI se plugin import.) | vProdLiquido + vIPI | 1.120,30 |
| Base PIS / COFINS do item | vProdLiquido − ICMS − DIFAL | 806,52 |
| Base cálculo IPI (Plugin 1 ativo) | vProdLiquido (produto com desconto) | 1.019,00 |
| Base cálculo IPI (sem Plugin 1, import.) | vProdBruto | 1.039,00 |
| Base Comissão (aba Outros) | vProdLiquido | 1.019,00 |
| Base Aprox. Trib. IBPT | vProdLiquido + vIPI + frete + seguro + outras | ≈ 1.120,30 |
| Base DIFAL / FCP (partilha, inf. compl.) | Base ICMS (mesma base; líquido + IPI quando import.) | 1.120,30 |
| vNF / total da nota | Σ vProdLiquido + frete + … (IPI não soma no total pago pelo cliente) | conforme nota |
- Usar
item.unit / preço bruto (1.039) onde a regra pede vProdLiquido (1.019).
- Usar base diferente de Base ICMS para DIFAL/FCP — Base DIFAL = Base FCP = Base ICMS.
- Recalcular IPI sobre o bruto quando o Plugin 1 está ativo (deve usar o líquido).
- Recalcular DIFAL/partilha no modal e sobrescrever o valor já salvo no item.
- Ratear desconto de um item para todos quando o pedido tem
item_discount por linha.
- Colocar desconto comercial na coluna Valor Desc. da DANFE com Plugin 1 ativo.
item.fiscalAuthoritative.displayUnitPrice / displayProductTotal → vProdLiquido
item.fiscalAuthoritative.visibleDiscount → vDescComercial (só tela Fiscal)
item.fiscalAuthoritative.displayBaseCalc → base ICMS com IPI quando aplicável
item.fiscalAuthoritative.ipiValue → vIPI do item
totals.ipiDiscountEnabled / globais.ipi.aplicarValorComoDescontoNota → Plugin 1
totals.vDescDisplayNote → IPI no rodapé; totals.vDesc → desconto comercial total (controle interno)
- Front:
danfe.php, fiscal.php.wrapper.in-use, js/fiscal-invoice-item-fiscal-modal.js
- Back:
api/src/services/fiscal/plugins/ipiDiscountPlugin.ts, ipiBaseImportPlugin.ts, nfeXmlBuilder.ts, nfeSingleFiscalEngine.ts, chainedTaxCalculator.ts