NFE Integração
A Nota Fiscal Eletrônica (NFE) é um documento fiscal obrigatório no Brasil. Esta integração permite automatizar processos relacionados à NFE, incluindo emissão, consulta, cancelamento e relatórios fiscais.
O que é NFE?
A NFE é um documento fiscal eletrônico que:
- Substitui a nota fiscal em papel
- É obrigatória para a maioria das operações comerciais
- É validada pela SEFAZ (Secretaria da Fazenda)
- Gera XML com assinatura digital
- Permite consulta online da validade
Benefícios da Automação
- Emissão automática de NFEs
- Validação em tempo real
- Integração com sistemas ERP
- Relatórios fiscais automáticos
- Compliance fiscal automático
Componentes da NFE
1. Dados do Emitente
Informações da empresa emissora:
{
"cnpj": "00.000.000/0001-00",
"razao_social": "EMPRESA EXEMPLO LTDA",
"nome_fantasia": "EMPRESA EXEMPLO",
"ie": "123.456.789",
"endereco": {
"logradouro": "Rua Exemplo",
"numero": "123",
"bairro": "Centro",
"municipio": "São Paulo",
"uf": "SP",
"cep": "01001-000"
}
}
2. Dados do Destinatário
Informações do cliente:
{
"cnpj": "11.111.111/0001-11",
"razao_social": "CLIENTE EXEMPLO LTDA",
"endereco": {
"logradouro": "Av. Cliente",
"numero": "456",
"bairro": "Bairro Cliente",
"municipio": "Rio de Janeiro",
"uf": "RJ",
"cep": "20040-007"
}
}
3. Itens da Nota
Produtos ou serviços:
{
"itens": [
{
"codigo": "001",
"descricao": "Produto Exemplo",
"ncm": "12345678",
"cfop": "5102",
"quantidade": 10,
"valor_unitario": 100.00,
"valor_total": 1000.00
}
]
}
Workflows de NFE
1. Emissão Automática
Workflow para emissão automática de NFE:
// Workflow: Emissão Automática de NFE
Webhook (Pedido) → Validação → HTTP Request (SEFAZ) → Processamento → Notificação
Configuração:
- Webhook: Recebe dados do pedido
- Validação: Valida dados obrigatórios
- HTTP Request: Envia para SEFAZ
- Processamento: Processa resposta
- Notificação: Notifica resultado
2. Consulta de Status
Workflow para consultar status de NFE:
// Workflow: Consulta de Status
Schedule Trigger → HTTP Request (Consulta) → Processamento → Relatório
Configuração:
- Schedule Trigger: Executa periodicamente
- HTTP Request: Consulta SEFAZ
- Processamento: Analisa status
- Relatório: Gera relatório de status
3. Cancelamento Automático
Workflow para cancelamento de NFE:
// Workflow: Cancelamento de NFE
Webhook (Cancelamento) → Validação → HTTP Request (Cancelamento) → Confirmação
Configuração:
- Webhook: Recebe solicitação de cancelamento
- Validação: Valida permissões e prazo
- HTTP Request: Envia cancelamento para SEFAZ
- Confirmação: Confirma cancelamento
Exemplos Práticos
Exemplo 1: Emissão Automática de NFE
Cenário: Emitir NFE automaticamente quando um pedido é aprovado.
Workflow:
Webhook (Pedido Aprovado) → Validação → HTTP Request (SEFAZ) → Processamento → Notificação
Configuração:
// Webhook - Dados do Pedido
{
"pedido_id": "12345",
"cliente": {
"cnpj": "11.111.111/0001-11",
"razao_social": "CLIENTE EXEMPLO LTDA"
},
"itens": [
{
"codigo": "001",
"descricao": "Produto A",
"quantidade": 5,
"valor_unitario": 100.00
}
]
}
// Code - Validação de Dados
const pedido = $json;
// Validar dados obrigatórios
const validacoes = {
cliente_cnpj: pedido.cliente.cnpj && pedido.cliente.cnpj.length === 18,
cliente_razao_social: pedido.cliente.razao_social && pedido.cliente.razao_social.length > 0,
itens: pedido.itens && pedido.itens.length > 0,
valores: pedido.itens.every(item => item.valor_unitario > 0)
};
const dadosValidos = Object.values(validacoes).every(v => v);
if (!dadosValidos) {
throw new Error('Dados do pedido inválidos para emissão de NFE');
}
// Preparar dados para NFE
const nfeData = {
emitente: {
cnpj: "00.000.000/0001-00",
razao_social: "EMPRESA EXEMPLO LTDA",
ie: "123.456.789"
},
destinatario: pedido.cliente,
itens: pedido.itens.map(item => ({
...item,
ncm: "12345678",
cfop: "5102",
valor_total: item.quantidade * item.valor_unitario
})),
total: pedido.itens.reduce((sum, item) => sum + (item.quantidade * item.valor_unitario), 0)
};
return { json: nfeData };
Exemplo 2: Consulta de Status de NFE
Cenário: Consultar status de NFEs emitidas.
Workflow:
Schedule Trigger → HTTP Request (Consulta) → Code (Análise) → Relatório
Configuração:
// Schedule Trigger - Execução
Cron: 0 */2 * * * // A cada 2 horas
// HTTP Request - Consulta SEFAZ
Method: POST
URL: https://api.sefaz.gov.br/nfe/consulta
Headers: {
"Content-Type": "application/json",
"Authorization": "Bearer {{ $credentials.sefaz.token }}"
}
Body: {
"cnpj_emitente": "00.000.000/0001-00",
"data_inicio": "{{ $now.minus({ days: 1 }).toFormat('yyyy-MM-dd') }}",
"data_fim": "{{ $now.toFormat('yyyy-MM-dd') }}"
}
// Code - Análise de Status
const consulta = $json;
const analise = {
total_nfes: consulta.nfes.length,
aprovadas: consulta.nfes.filter(nfe => nfe.status === "AUTORIZADA").length,
canceladas: consulta.nfes.filter(nfe => nfe.status === "CANCELADA").length,
pendentes: consulta.nfes.filter(nfe => nfe.status === "PENDENTE").length,
rejeitadas: consulta.nfes.filter(nfe => nfe.status === "REJEITADA").length
};
// Alertas para problemas
const alertas = [];
if (analise.rejeitadas > 0) {
alertas.push(`NFEs rejeitadas: ${analise.rejeitadas}`);
}
if (analise.pendentes > 5) {
alertas.push(`Muitas NFEs pendentes: ${analise.pendentes}`);
}
return {
json: {
analise: analise,
alertas: alertas,
nfes: consulta.nfes,
data_consulta: new Date().toISOString()
}
};
Exemplo 3: Cancelamento Automático de NFE
Cenário: Cancelar NFE automaticamente quando pedido é cancelado.
Workflow:
Webhook (Pedido Cancelado) → Validação → HTTP Request (Cancelamento) → Confirmação
Configuração:
// Webhook - Pedido Cancelado
{
"pedido_id": "12345",
"nfe_numero": "000001",
"motivo_cancelamento": "Solicitação do cliente"
}
// Code - Validação de Cancelamento
const cancelamento = $json;
// Verificar se NFE pode ser cancelada
const nfe = await consultarNFE(cancelamento.nfe_numero);
if (nfe.status !== "AUTORIZADA") {
throw new Error(`NFE não pode ser cancelada. Status atual: ${nfe.status}`);
}
// Verificar prazo de cancelamento (24h)
const dataEmissao = new Date(nfe.data_emissao);
const agora = new Date();
const horasDecorridas = (agora - dataEmissao) / (1000 * 60 * 60);
if (horasDecorridas > 24) {
throw new Error('Prazo para cancelamento expirado (24h)');
}
// Preparar dados para cancelamento
const cancelamentoData = {
nfe_numero: cancelamento.nfe_numero,
justificativa: cancelamento.motivo_cancelamento,
protocolo: nfe.protocolo
};
return { json: cancelamentoData };
Integração com SEFAZ
1. Autenticação
// Code - Autenticação SEFAZ
const credentials = {
cnpj: "00.000.000/0001-00",
certificado: "certificado.p12",
senha: "senha_certificado"
};
// Gerar token de acesso
const token = await gerarTokenSEFAZ(credentials);
return { json: { token: token } };
2. Emissão de NFE
// HTTP Request - Emissão NFE
Method: POST
URL: https://api.sefaz.gov.br/nfe/emissao
Headers: {
"Content-Type": "application/json",
"Authorization": "Bearer {{ $credentials.sefaz.token }}"
}
Body: {
"emitente": $json.emitente,
"destinatario": $json.destinatario,
"itens": $json.itens,
"total": $json.total,
"forma_pagamento": "01", // Dinheiro
"tipo_operacao": "0" // Saída
}
3. Consulta de Status
// HTTP Request - Consulta Status
Method: GET
URL: https://api.sefaz.gov.br/nfe/status/{{ $json.nfe_numero }}
Headers: {
"Authorization": "Bearer {{ $credentials.sefaz.token }}"
}
Tratamento de Erros
1. NFE Rejeitada
// Code - Tratamento de Rejeição
const resposta = $json;
if (resposta.status === "REJEITADA") {
const erro = {
nfe_numero: resposta.nfe_numero,
motivo: resposta.motivo_rejeicao,
codigo: resposta.codigo_rejeicao,
data_rejeicao: new Date().toISOString()
};
// Enviar para correção manual
return {
json: {
tipo: "CORRECAO_MANUAL",
erro: erro,
dados_originais: $('Webhook').json
}
};
}
2. Timeout da SEFAZ
// Code - Tratamento de Timeout
try {
const resposta = await enviarNFE($json);
return { json: resposta };
} catch (error) {
if (error.code === "TIMEOUT") {
// Retry com backoff
await new Promise(resolve => setTimeout(resolve, 5000));
const resposta = await enviarNFE($json);
return { json: resposta };
}
throw error;
}
3. Certificado Expirado
// Code - Verificação de Certificado
const certificado = await verificarCertificado();
if (certificado.expirado) {
// Notificar administrador
return {
json: {
tipo: "ALERTA_CERTIFICADO",
mensagem: "Certificado digital expirado",
data_expiracao: certificado.data_expiracao,
acao_necessaria: "Renovar certificado digital"
}
};
}
Relatórios Fiscais
1. Relatório de NFEs Emitidas
// Code - Relatório de NFEs
const nfes = $json.nfes;
const relatorio = {
periodo: {
inicio: $json.data_inicio,
fim: $json.data_fim
},
resumo: {
total_emitidas: nfes.length,
total_valor: nfes.reduce((sum, nfe) => sum + nfe.valor_total, 0),
aprovadas: nfes.filter(nfe => nfe.status === "AUTORIZADA").length,
canceladas: nfes.filter(nfe => nfe.status === "CANCELADA").length
},
por_cliente: nfes.reduce((acc, nfe) => {
const cliente = nfe.destinatario.razao_social;
if (!acc[cliente]) acc[cliente] = { total: 0, nfes: [] };
acc[cliente].total += nfe.valor_total;
acc[cliente].nfes.push(nfe);
return acc;
}, {}),
data_geracao: new Date().toISOString()
};
return { json: relatorio };
2. Dashboard Fiscal
// Code - Dashboard Fiscal
const dados = $json;
const dashboard = {
metricas: {
nfes_hoje: dados.nfes.filter(nfe =>
nfe.data_emissao.startsWith(new Date().toISOString().split('T')[0])).length,
valor_hoje: dados.nfes.filter(nfe =>
nfe.data_emissao.startsWith(new Date().toISOString().split('T')[0]))
.reduce((sum, nfe) => sum + nfe.valor_total, 0),
pendentes: dados.nfes.filter(nfe => nfe.status === "PENDENTE").length
},
tendencias: {
ultimos_7_dias: calcularTendencia(dados.nfes, 7),
ultimos_30_dias: calcularTendencia(dados.nfes, 30)
},
alertas: gerarAlertas(dados)
};
return { json: dashboard };
Boas Práticas
1. Segurança
- Use certificados digitais válidos
- Mantenha senhas seguras
- Implemente auditoria de acesso
- Configure backup de certificados
- Monitore expiração de certificados
2. Performance
- Implemente cache para consultas
- Configure timeouts adequados
- Processe em lotes quando possível
- Monitore tempo de resposta
- Configure retry com backoff
3. Compliance
- Mantenha logs de todas as operações
- Configure alertas para problemas
- Implemente validações robustas
- Documente processos fiscais
- Configure backup de dados
Troubleshooting
Problemas Comuns
NFE rejeitada
- Verifique dados obrigatórios
- Confirme formato dos dados
- Valide certificado digital
- Consulte códigos de erro
- Teste com dados de exemplo
Timeout da SEFAZ
- Configure timeouts adequados
- Implemente retry logic
- Monitore conectividade
- Verifique certificado
- Configure alertas
Certificado expirado
- Monitore data de expiração
- Configure alertas antecipados
- Mantenha backup de certificados
- Documente processo de renovação
- Configure notificações
Debug
- Use o node Debug Helper para inspecionar dados
- Configure logging detalhado
- Teste com dados de exemplo
- Monitore logs da SEFAZ
- Valide certificado digital
Próximos Passos
- HTTP Request - Fazer requisições HTTP
- Expressões n8n - Usar dados dinâmicos
- Tratamento de Erros - Lidar com falhas
- Integrações Brasileiras - Outras integrações brasileiras
- Compliance Fiscal - Conformidade fiscal