NF-e Entrada — Manifestação do Destinatário
Visão Geral
A tela de NF-e Entrada permite ao restaurante consultar e manifestar NF-es emitidas por fornecedores contra o seu CNPJ. Ao confirmar uma NF-e, o sistema automaticamente:
- Registra a entrada de estoque para cada item da nota
- Cria uma Conta a Pagar na data de competência correta (para o DRE)
- Dispara o recálculo das Fichas Técnicas (BOM) dos pratos que usam os insumos da nota
Localização
frontend-react/src/features/inbound-nfe/index.tsx
Rota: /t/:slug/admin/inbound-nfe
Funcionalidades
- Sincronização de NF-es recebidas via provider (PlugNotas, Arquivei ou SEFAZ direto)
- Listagem com filtro por status e período
- Manifestação de cada NF-e individualmente (4 eventos possíveis)
- Gestão de Contas a Pagar vinculadas às NF-es
Status das NF-es
| Status | Código SEFAZ | Descrição |
|---|---|---|
pending | — | Baixada mas ainda não manifestada |
ciencia | 210210 | Ciência da Operação — confirma recebimento |
confirmada | 210200 | Confirmação da Operação — estoque processado |
desconhecida | 210220 | Desconhecimento da Operação (com justificativa) |
nao_realizada | 210240 | Operação Não Realizada (com justificativa) |
Eventos de Manifestação
| Evento | Quando usar | Justificativa |
|---|---|---|
| Ciência | Para tomar conhecimento sem confirmar ainda | Não obrigatória |
| Confirmação | Mercadoria recebida e confere com a nota | Não obrigatória |
| Desconhecimento | Não reconhece a operação | Obrigatória (mín. 15 chars) |
| Não Realizada | Mercadoria recusada ou devolvida | Obrigatória (mín. 15 chars) |
Somente a Confirmação dispara o processamento de estoque e criação de Contas a Pagar.
Fluxo Automático pós-Confirmação
POST /inbound-nfe/:id/manifest { eventType: 'confirmacao' }
↓
Para cada item da NF-e:
→ Busca InventoryItem por supplierCode (cProd) ou nome
→ Cria InventoryMovement { type: 'entry', reason: 'purchase' }
→ Atualiza InventoryItem.costPrice e physicalQuantity
↓
Cria AccountsPayable {
amount: nfe.total,
dueDate: issueDate + 30 dias,
competenceDate: nfe.issueDate ← usado pelo DRE
}
↓
BomService.recalculateAllForIngredients(affectedItemIds)
→ Novo BomCostSnapshot para cada prato afetadoProviders de NF-e
Configurado via variável de ambiente INBOUND_NFE_PROVIDER:
| Provider | Valor | Descrição |
|---|---|---|
| PlugNotas | plugnotas | Integração via API PlugNotas (padrão) |
| Arquivei | arquivei | Integração via API Arquivei |
| SEFAZ Direto | sefaz_direct | Consulta direta ao SEFAZ (nfeDistDFe) |
Provider SEFAZ Direto
Usa a infraestrutura de certificado A1 já existente:
- Consulta:
nfeDistDFe— serviço nacional, NSU incremental por CNPJ - Manifestação:
RecepcaoEvento4— mesmo endpoint do cancelamento outbound - NSU: Persiste
lastNfeDfNsuno tenant para polling incremental
Requer: certificado A1 configurado + fiscalConfig.cnpj + fiscalConfig.uf no tenant.
Componentes Frontend
| Componente | Descrição |
|---|---|
InboundNfeTable | Tabela com badge de status colorido + action menu |
ManifestModal | Radio de eventType + textarea de justificativa (obrigatória para desconhecimento/nao_realizada) |
AccountsPayableTable | Fornecedor, vencimento, competência, status, botão Pagar |
MarkPaidModal | Input de valor pago + data de pagamento |
Backend
backend/src/inbound-nfe/inbound-nfe.module.tsbackend/src/inbound-nfe/inbound-nfe.service.tsbackend/src/inbound-nfe/inbound-nfe.controller.tsbackend/src/inbound-nfe/schemas/inbound-nfe.schema.tsbackend/src/inbound-nfe/schemas/accounts-payable.schema.tsbackend/src/inbound-nfe/providers/sefaz-inbound.provider.ts
Variáveis de Ambiente
env
INBOUND_NFE_PROVIDER=sefaz_direct # plugnotas | arquivei | sefaz_direct
PLUGNOTAS_TOKEN=... # obrigatório se provider=plugnotas
ARQUIVEI_CLIENT_ID=... # obrigatório se provider=arquivei
ARQUIVEI_API_KEY=... # obrigatório se provider=arquivei