Pular para o conteúdo principal

Rotina: Emissão de NF-e

Ciclo completo de criação, cálculo de impostos, assinatura digital, transmissão à SEFAZ e gestão de contingência.


Módulos Delphi​

ArquivoLinhasPapel
source/MNF001/UMNF001.pas~7.000Form principal — cabeçalho e itens da NF
source/MNF001/UdmMNF001.pas—DataModule — queries, cálculo de impostos
source/MNF001/UFRETENF.pas—Frete rateado nos itens
source/MNF001/UIMPOSTONF.pas—Detalhamento por item de imposto
source/MFA001/UMFA001.pas—Parâmetros de faturamento (séries, ambiente SEFAZ)
source/jFaturamento/Nfe/jNFe.pas—Engine NF-e — geração XML, transmissão, eventos
source/jFaturamento/Nfe/jNFe.Classes.pas—Tipos de dados do XML
source/jFaturamento/PNFe/PNFe.pas—Painel de emissão (UI de transmissão)
source/jFaturamento/UdmACBr.pas—Assinatura digital via ACBrNFe

Tabelas do Banco de Dados​

NOTA — Cabeçalho da Nota Fiscal​

DDL: docs/schema/tables/NOTA.sql

CampoTipoDescrição
CD_EMPRESAINTEGEREmpresa (PK)
NR_LANCAMENTOINTEGERLançamento sequencial (PK)
CD_SERIEVARCHAR(4)Série da NF (PK)
TP_NOTACHAR(1)'S'=Saída, 'E'=Entrada, 'D'=Devolução, 'T'=Transferência (PK)
NR_NOTAFISCALINTEGERNúmero sequencial da NF por série
ST_NOTACHAR(1)'V'=Válida, 'N'=Não Emitida (rascunho), 'P'=Pendente transmissão, 'C'=Cancelada, 'E'=Excluída
NR_CHAVENFEVARCHAR(44)Chave de acesso NF-e (44 dígitos)
DT_EMISSAOTIMESTAMPData/hora de emissão
DT_TRANSMISSAOTIMESTAMPData/hora da transmissão à SEFAZ
DT_REGISTROTIMESTAMPData/hora do registro no sistema
CD_PESSOAINTEGERCliente/Fornecedor (FK → PESSOA)
CD_ENDERECOINTEGEREndereço de entrega (FK → ENDERECOPESSOA)
CD_CONDPAGTOINTEGERCondição de pagamento
CD_FORMAPAGTOVARCHAR(2)Forma de pagamento
CD_TRANSPORTADORINTEGERTransportadora (FK → PESSOA)
VL_NOTAFISCALNUMERIC(15,2)Valor total da NF
VL_DESCONTONUMERIC(15,2)Desconto total
VL_FRETENUMERIC(15,2)Valor do frete
VL_DESPESANUMERIC(15,2)Outras despesas
VL_SUBSTITUICAONUMERIC(15,2)Valor de ST (substituição tributária)
VL_JUROVENDANUMERIC(15,2)Juros de venda
TP_PAGTOFRETECHAR(1)'0'=Emitente, '1'=Destinatário, '9'=Sem frete
ST_ENVIADOXMLCHAR(1)'S'=XML enviado por email
ST_RECALCULAIMPOSTOCHAR(1)Indica necessidade de recálculo
ST_CONFERIDACHAR(1)NF conferida/revisada
DS_OBSNOTABLOB TEXTObservações (texto livre)
DS_OBSFISCALBLOB TEXTObservações fiscais

NFE — Controle Eletrônico (paralela a NOTA)​

DDL: docs/schema/tables/NFE.sql

CampoTipoDescrição
TPAMBSMALLINT1=Produção, 2=Homologação
TPEMISSSMALLINT1=Normal, 2=Contingência EPEC, 6=SVC-RS, 9=SVC-AN
CSTATINTEGERCódigo de status SEFAZ
NR_RECIBOVARCHAR(20)Recibo do lote (transmissão assíncrona)
NR_PROTOCOLOAUTVARCHAR(30)Protocolo de autorização (29 dígitos)
NR_PROTOCOLOCANCVARCHAR(30)Protocolo de cancelamento
DT_TRANSMISSAOTIMESTAMPData/hora da transmissão
ST_LOTESMALLINT1=Processado, 2=Em processamento, 3=Erro
DS_URLQRCODEVARCHAR(500)URL do QR Code para DANFE
DS_NOTIFICACAOEMAILCHAR(1)Email enviado ao destinatário
BI_ARQUIVOXMLBLOBXML assinado e protocolado (arquivo .prot)

Códigos CSTAT​

CSTATSignificado
100Autorizado (aceito pela SEFAZ)
110Inutilizado
150Pendente de autorização
301Cancelado
302Pré-autorizado (SAT)
900Erro na transmissão
999Serviço indisponível na SEFAZ

ITEMNOTA — Itens da NF​

DDL: docs/schema/tables/ITEMNOTA.sql

CampoTipoDescrição
CD_EMPRESAINTEGEREmpresa (PK)
NR_LANCAMENTOINTEGERLançamento da NF (PK)
TP_NOTACHAR(1)Tipo da NF (PK)
CD_SERIEVARCHAR(4)Série (PK)
CD_ITEMINTEGERProduto (PK, FK → ITEM)
NR_SEQXMLINTEGERSequência no XML (obrigatório)
CD_CFOVARCHAR(4)CFOP — Código Fiscal de Operação (FK → CFO)
CD_CSTVARCHAR(3)CST ICMS — Código de Situação Tributária (FK → CST)
CD_CSOSNVARCHAR(3)CSOSN (Simples Nacional)
CD_ORIGEMCHAR(1)'0'=Nacional, '1'=Importação, '2'=Exterior
CD_MOVIMENTACAOINTEGERTipo de movimentação de estoque
QT_ITEMNOTANUMERIC(15,3)Quantidade
VL_UNITARIONUMERIC(15,4)Preço unitário
VL_TOTALNUMERIC(15,2)Valor total do item
VL_DESCONTONUMERIC(15,2)Desconto
PC_ICMSNUMERIC(5,2)Alíquota ICMS (%)
PC_IPINUMERIC(5,2)Alíquota IPI (%)
VL_IMPOSTONUMERIC(15,2)Valor total de impostos
VL_SUBSTRIBNUMERIC(15,2)ICMS substituição tributária
VL_BASESUBSTNUMERIC(15,2)Base de cálculo da ST
VL_CUSTONUMERIC(15,4)Custo do item (para cálculo de margem)
VL_COMISSAONUMERIC(15,2)Valor de comissão do item
PC_COMISSAONUMERIC(3,2)% de comissão
ST_ENTREGACHAR(1)'A'=Aguardando, 'P'=Parcial, 'E'=Entregue, 'C'=Cancelado
PS_LIQUIDONUMERIC(15,3)Peso líquido
PS_TOTALNUMERIC(15,3)Peso bruto
VL_SEGURONUMERIC(15,2)Seguro
VL_TAXABOLETONUMERIC(15,2)Taxa de boleto

PARMNOTA — Parâmetros por Série de NF​

DDL: docs/schema/tables/PARMNOTA.sql

CampoTipoEfeito
CD_ESPECIEVARCHAR(4)'NFE'=NF-e mod 55, 'NFCE'=NFC-e mod 65, 'CTE'=CT-e, 'SAT'=SAT-CFe
ST_CUPOMFISCALCHAR(1)'S' = série para cupom fiscal (ECF)
ST_IMPOSTOCHAR(1)'S' = calcula imposto automaticamente nesta série
ST_GERABOLETOCHAR(1)'S' = gera boleto ao emitir NF nesta série
ST_PERMITENOTAZERADACHAR(1)'S' = permite NF com valor zero
ST_DATABLOQUEADACHAR(1)'S' = bloqueia emissão retroativa
TP_PRODUTOCHAR(1)'T'=Todos, 'P'=Produtos, 'S'=Serviços
NR_ITENSINTEGERMínimo de itens por NF

CONFIGNFE — Configuração Eletrônica​

DDL: docs/schema/tables/CONFIGNFE.sql

CampoTipoDescrição
TPAMBCHAR(1)'1'=Produção, '2'=Homologação
TPEMISCHAR(1)'1'=Normal, '2'=EPEC, '6'=SVC-RS, '9'=SVC-AN
DS_SENHACERTVARCHAR(100)Senha do certificado digital
TPCERTIFICADOCHAR(1)'A'=Arquivo A1, 'S'=SmartCard A3
NRSERIALCERTVARCHAR(20)Número de série do certificado
NRVERSAOVARCHAR(5)Versão do leiaute XML (ex: 4.00)
TPENVIOCHAR(1)'I'=Síncrono (resposta imediata), 'A'=Assíncrono (retorno por recibo)
STEMAILAUTOMATICOCHAR(1)'S' = envia DANFE por email ao autorizar
DS_MOTIVOCONTINGENCIAVARCHAR(256)Motivo da contingência ativa
DT_EMISSAOCONTTIMESTAMPInício da contingência

Tabelas de Classificação Fiscal​

TabelaDDLPapel
CFOdocs/schema/tables/CFO.sqlCFOP — natureza da operação fiscal
CSTdocs/schema/tables/CST.sqlSituação tributária ICMS (00, 10, 20, 30, 40, 41...)
NCMdocs/schema/tables/NCM.sqlNomenclatura Comum do Mercosul (8 dígitos) + alíquotas
IMPOSTOdocs/schema/tables/IMPOSTO.sqlMatriz de configuração de impostos por empresa/UF
ORIGEMdocs/schema/tables/ORIGEM.sqlOrigem do produto (nacional, importação)
PESSOASERIENFdocs/schema/tables/PESSOASERIENF.sqlSérie preferencial por cliente

Stored Procedures​

CALCULA_IMPOSTONOTA​

Scripts/CALCULA_IMPOSTONOTA.sql

Entrada:
V_CD_EMPRESA INTEGER
V_NR_LANCAMENTO INTEGER
V_CD_SERIE VARCHAR(4)
V_TP_NOTA CHAR(1)
V_CD_ITEM INTEGER
V_SG_UFEMPRESA VARCHAR(2) — UF da empresa (para DIFAL)

Saída:
CD_OBSFISCAL — observação fiscal aplicável
CD_CST — CST determinado
CD_CSOSN — CSOSN (Simples Nacional)
CD_ORIGEM — origem do produto
PC_ICMS — alíquota ICMS
PC_IPI — alíquota IPI
VL_IMPOSTO — valor total de impostos
VL_SUBSTRIB — ICMS ST
VL_BASESUBST — base de cálculo ST
VL_FCP — Fundo de Combate à Pobreza
VL_PARTILHA — partilha ICMS interestadual (DIFAL)
VL_UFDESTINO — ICMS destinado à UF de destino
NR_ALIQUOTA — número interno da regra aplicada
CD_IMPOSTO — código do imposto configurado
MENSAGEM — erro ou aviso (vazio se OK)

Lógica:

  1. Seleciona regra de imposto por: empresa × item × CFOP × UF origem × UF destino
  2. Valida substituição tributária (ST) e calcula base ST com MVA
  3. Calcula FCP (Fundo de Combate à Pobreza) por UF destino
  4. Calcula partilha ICMS DIFAL (operações interestaduais para não contribuintes)
  5. Retorna mensagem de erro se regra fiscal não encontrada

GERA_CHAVEACESSONFE​

Scripts/GERA_CHAVEACESSONFE.sql

Entrada:
I_CD_EMPRESA INTEGER
I_NR_LANCAMENTO INTEGER
I_TP_NOTA CHAR(1)
I_CD_SERIE VARCHAR(4)
I_DT_EMISSAO DATE

Saída:
O_NR_CHAVEACESSO VARCHAR(44) — chave de acesso completa
O_DS_MENSAGEM VARCHAR(1000)

Algoritmo:

CUFIBGE(2) + AAAAMM(6) + CNPJ(14) + MODELO(2) + SERIE(3) + NNF(9) + TPEMIS(1) + CNUMERO(8) + CDV(1)
  • CDV = dígito verificador módulo 11
  • Tipo de emissão = 1 (normal) ou 2/6/9 (contingência)

CANCELA_NOTAFISCAL​

Scripts/CANCELA_NOTAFISCAL.sql

Entrada:
V_CD_EMPRESA INTEGER
V_NR_LANCAMENTO INTEGER
V_CD_SERIE VARCHAR(4)
V_TP_NOTA CHAR(1)
V_CD_MOTIVO INTEGER
V_DS_MOTIVOCANC VARCHAR(1000)

Saída: mensagem de sucesso/erro

O que faz:

  1. Valida ST_NOTA = 'V' (só cancela nota válida)
  2. Verifica prazo de cancelamento (180 dias — regra SEFAZ)
  3. Reverte estoque via MOVIMENTACAO (INSERT negativo)
  4. Estorna contas a receber em CONTAS (DELETE ou anulação)
  5. Cancela CT-e/MDF-e vinculados se existirem
  6. Grava histórico: CD_USUARIOCANC, DT_CANCELAMENTO, DS_MOTIVOCANC
  7. Seta ST_NOTA = 'C'

Outras Procedures​

ProcedureScriptAção
CALCULA_VALORITEMNOTAScripts/Calcula VL_TOTAL do item (QT × VL_UNIT − DESC + FRETE + DESP)
CALCULA_VALORADICIONALNOTAScripts/Distribui frete/seguro/despesa proporcionalmente entre itens
ATUALIZA_DADOSIMPNOTAScripts/Atualiza campos de imposto em NOTA após cálculo
ATUALIZA_IMPOSTONOTADEVOLScripts/Ajusta impostos em devolução parcial
ATUALIZA_PEDIDONOTAScripts/Marca pedidos como faturados (PEDIDONOTA)

Parâmetros (PARMFATUR)​

Campos de PARMFATUR relevantes para NF-e:

ParâmetroTipoEfeito quando ativo
ST_NUMERONOTAS/N'S' = numeração automática por série
ST_BLOQUEIONFS/N'S' = bloqueia emissão de novas NFs
ST_ALTERANOTAS/N'S' = permite editar NF após emissão (antes de transmitir)
ST_ALTERAICMSS/N'S' = permite alterar ICMS manualmente no item
ST_DIFALIQUOTAXMLS/N'S' = usa alíquota DIFAL do XML do fornecedor (entrada)
ST_RECALCULAIMPOSTOS/N'S' = recalcula impostos ao reabrir NF
CD_MOVSAIDAINTEGERMovimentação de estoque padrão para saída de NF
CD_MOVENTRADAINTEGERMovimentação de estoque padrão para entrada
CD_MOVSERVICOINTEGERMovimentação para serviços
CD_CONDPAGTOINTEGERCondição de pagamento padrão da NF
CD_TABPRECOINTEGERTabela de preço padrão

Estados da NF-e​

[Nova / Rascunho]
│
▼
'N' Não Emitida
(editável, impostos calculados, sem número NF)
│
│ Usuário salva e emite
▼
Gera NR_NOTAFISCAL por série
Gera NR_CHAVENFE (44 dígitos)
│
▼
'P' Pendente
(gravada, aguardando transmissão)
│
│ PNFe — assina e transmite
▼
SEFAZ recebe
│
├─ CSTAT=100 → 'V' Válida ───► Gera DANFE, envia email
│ Baixa estoque
│ Gera títulos (CONTAS)
│
├─ CSTAT=9xx → 'P' Pendente ──► Retry / contingência
│
└─ CSTAT=301 → 'C' Cancelada ──► Estorna estoque e financeiro

Tipos de Emissão (Contingência)​

TPEMISModoQuando Usar
1NormalSEFAZ online
2EPEC (Evento Prévio de Emissão em Contingência)Queda total de internet
6SVC-RS (Serviço de Contingência RS)SEFAZ UF indisponível
9SVC-AN (Serviço de Contingência Nacional)SEFAZ RS indisponível

Fluxo em contingência:

1. CONFIGNFE.TPEMIS := '6' ou '9'
2. DT_EMISSAOCONT := NOW (marca início da contingência)
3. Emite NF com TPEMISS = contingência na chave de acesso
4. Quando SEFAZ voltar:
a. Transmite NFs emitidas em contingência
b. CONFIGNFE.TPEMIS := '1' (volta ao normal)
c. DT_EMISSAOCONT := NULL

Fluxo Completo de Emissão​

┌──────────────────────────────────────────────────┐
│ CRIAÇÃO DA NF (MNF001 ou via GERA_NOTAPEDIDO) │
│ │
│ INSERT NOTA (ST_NOTA='N', sem NR_NOTAFISCAL) │
│ Para cada item: │
│ INSERT ITEMNOTA │
│ CALCULA_IMPOSTONOTA → preenche PC_ICMS, etc. │
│ CALCULA_VALORADICIONALNOTA (frete proporcional) │
└─────────────────┬────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────┐
│ VALIDAÇÃO E NUMERAÇÃO │
│ │
│ Verifica: ST_BLOQUEIONF, PARMFATUR │
│ Verifica: ST_NOTA <> 'C' e <> 'E' │
│ GERA_CHAVEACESSONFE → NR_CHAVENFE (44 dígitos) │
│ Atribui NR_NOTAFISCAL (sequencial por série) │
│ Muda ST_NOTA = 'P' (Pendente) │
└─────────────────┬────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────┐
│ ASSINATURA E TRANSMISSÃO (PNFe / jNFe.pas) │
│ │
│ 1. LoadCertificado (A1 ou A3 via CONFIGNFE) │
│ 2. GeraXML → serializa NOTA + ITEMNOTA em XML │
│ 3. AssinaNFe → assina com certificado X.509 │
│ 4. ValidaNFe → valida schema XSD │
│ 5. Se TPENVIO='I' (Síncrono): │
│ TNfeRecepcao.executa() → retorna CSTAT+NPROT │
│ 6. Se TPENVIO='A' (Assíncrono): │
│ TNfeRecepcao.executa() → retorna NREC │
│ TMNfeRetRecepcao.executa(NREC) → pool status │
└─────────────────┬────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────┐
│ PÓS-AUTORIZAÇÃO (CSTAT=100) │
│ │
│ ST_NOTA := 'V' │
│ NFE.NR_PROTOCOLOAUT := protocolo SEFAZ │
│ NFE.BI_ARQUIVOXML := XML protocolado │
│ Gera DANFE (PDF) │
│ Se STEMAILAUTOMATICO='S': envia DANFE por email │
│ Baixa estoque via MOVIMENTACAO │
│ Gera CONTAS (títulos a receber) │
│ Atualiza PEDIDONOTA (se veio de pedido) │
└──────────────────────────────────────────────────┘

Eventos Fiscais (pós-emissão)​

Carta de Correção (CC-e)​

  • Corrige dados que não alteram valor/destinatário
  • TCTeCartaCorrecao.executa(chave, correcao)
  • Limite: 20 eventos por NF-e

Cancelamento​

  • Prazo: 24h (operação presencial) ou 168h / 720h (remoto)
  • TNfeCancelamento.executa(chave, protocolo, motivo)
  • Grava NFE.NR_PROTOCOLOCANC

Inutilização​

  • Bloqueia faixa de números não emitidos
  • TNfeInutilizacao.executa(serie, nInicial, nFinal, motivo, modelo)

Influências em Outros Módulos​

→ Pedido de Venda​

  • GERA_NOTAPEDIDO popula PEDIDONOTA — rastreamento item/NF
  • PEDIDO.DT_FATURADO preenchido na autorização
  • Faturamento parcial: uma NF pode não atender todos os itens do pedido

→ Contas a Receber​

  • NF autorizada gera títulos em CONTAS (TP_CONTAS='S')
  • Parcelas definidas pelo CONDPAGTO da NF
  • CONTASPEDIDO liga título ao pedido de origem

→ Estoque e Movimentação​

  • Autorização da NF de saída gera INSERT MOVESTOQUE (saída)
  • CD_MOVIMENTACAO do item define o tipo de movimento
  • Devolução (TP_NOTA='D') reverte o estoque

→ Fiscal​

  • Cada ITEMNOTA alimenta a escrituração fiscal (SPED EFD)
  • CFO, CST, NCM e alíquotas são registrados por item

→ Transporte — CT-e e MDF-e​

  • NF referenciada no CT-e (documentos transportados)
  • MANIFESTONFE rastreia ciência, descarga, operação

→ Banco de Dados​

  • Tabelas: NOTA, NFE, ITEMNOTA, PARMNOTA, CONFIGNFE, CFO, CST, NCM, IMPOSTO