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
| Arquivo | Linhas | Papel |
|---|---|---|
source/MNF001/UMNF001.pas | ~7.000 | Form 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
| Campo | Tipo | Descrição |
|---|---|---|
| CD_EMPRESA | INTEGER | Empresa (PK) |
| NR_LANCAMENTO | INTEGER | Lançamento sequencial (PK) |
| CD_SERIE | VARCHAR(4) | Série da NF (PK) |
| TP_NOTA | CHAR(1) | 'S'=Saída, 'E'=Entrada, 'D'=Devolução, 'T'=Transferência (PK) |
| NR_NOTAFISCAL | INTEGER | Número sequencial da NF por série |
| ST_NOTA | CHAR(1) | 'V'=Válida, 'N'=Não Emitida (rascunho), 'P'=Pendente transmissão, 'C'=Cancelada, 'E'=Excluída |
| NR_CHAVENFE | VARCHAR(44) | Chave de acesso NF-e (44 dígitos) |
| DT_EMISSAO | TIMESTAMP | Data/hora de emissão |
| DT_TRANSMISSAO | TIMESTAMP | Data/hora da transmissão à SEFAZ |
| DT_REGISTRO | TIMESTAMP | Data/hora do registro no sistema |
| CD_PESSOA | INTEGER | Cliente/Fornecedor (FK → PESSOA) |
| CD_ENDERECO | INTEGER | Endereço de entrega (FK → ENDERECOPESSOA) |
| CD_CONDPAGTO | INTEGER | Condição de pagamento |
| CD_FORMAPAGTO | VARCHAR(2) | Forma de pagamento |
| CD_TRANSPORTADOR | INTEGER | Transportadora (FK → PESSOA) |
| VL_NOTAFISCAL | NUMERIC(15,2) | Valor total da NF |
| VL_DESCONTO | NUMERIC(15,2) | Desconto total |
| VL_FRETE | NUMERIC(15,2) | Valor do frete |
| VL_DESPESA | NUMERIC(15,2) | Outras despesas |
| VL_SUBSTITUICAO | NUMERIC(15,2) | Valor de ST (substituição tributária) |
| VL_JUROVENDA | NUMERIC(15,2) | Juros de venda |
| TP_PAGTOFRETE | CHAR(1) | '0'=Emitente, '1'=Destinatário, '9'=Sem frete |
| ST_ENVIADOXML | CHAR(1) | 'S'=XML enviado por email |
| ST_RECALCULAIMPOSTO | CHAR(1) | Indica necessidade de recálculo |
| ST_CONFERIDA | CHAR(1) | NF conferida/revisada |
| DS_OBSNOTA | BLOB TEXT | Observações (texto livre) |
| DS_OBSFISCAL | BLOB TEXT | Observações fiscais |
NFE — Controle Eletrônico (paralela a NOTA)
DDL: docs/schema/tables/NFE.sql
| Campo | Tipo | Descrição |
|---|---|---|
| TPAMB | SMALLINT | 1=Produção, 2=Homologação |
| TPEMISS | SMALLINT | 1=Normal, 2=Contingência EPEC, 6=SVC-RS, 9=SVC-AN |
| CSTAT | INTEGER | Código de status SEFAZ |
| NR_RECIBO | VARCHAR(20) | Recibo do lote (transmissão assíncrona) |
| NR_PROTOCOLOAUT | VARCHAR(30) | Protocolo de autorização (29 dígitos) |
| NR_PROTOCOLOCANC | VARCHAR(30) | Protocolo de cancelamento |
| DT_TRANSMISSAO | TIMESTAMP | Data/hora da transmissão |
| ST_LOTE | SMALLINT | 1=Processado, 2=Em processamento, 3=Erro |
| DS_URLQRCODE | VARCHAR(500) | URL do QR Code para DANFE |
| DS_NOTIFICACAOEMAIL | CHAR(1) | Email enviado ao destinatário |
| BI_ARQUIVOXML | BLOB | XML assinado e protocolado (arquivo .prot) |
Códigos CSTAT
| CSTAT | Significado |
|---|---|
| 100 | Autorizado (aceito pela SEFAZ) |
| 110 | Inutilizado |
| 150 | Pendente de autorização |
| 301 | Cancelado |
| 302 | Pré-autorizado (SAT) |
| 900 | Erro na transmissão |
| 999 | Serviço indisponível na SEFAZ |
ITEMNOTA — Itens da NF
DDL: docs/schema/tables/ITEMNOTA.sql
| Campo | Tipo | Descrição |
|---|---|---|
| CD_EMPRESA | INTEGER | Empresa (PK) |
| NR_LANCAMENTO | INTEGER | Lançamento da NF (PK) |
| TP_NOTA | CHAR(1) | Tipo da NF (PK) |
| CD_SERIE | VARCHAR(4) | Série (PK) |
| CD_ITEM | INTEGER | Produto (PK, FK → ITEM) |
| NR_SEQXML | INTEGER | Sequência no XML (obrigatório) |
| CD_CFO | VARCHAR(4) | CFOP — Código Fiscal de Operação (FK → CFO) |
| CD_CST | VARCHAR(3) | CST ICMS — Código de Situação Tributária (FK → CST) |
| CD_CSOSN | VARCHAR(3) | CSOSN (Simples Nacional) |
| CD_ORIGEM | CHAR(1) | '0'=Nacional, '1'=Importação, '2'=Exterior |
| CD_MOVIMENTACAO | INTEGER | Tipo de movimentação de estoque |
| QT_ITEMNOTA | NUMERIC(15,3) | Quantidade |
| VL_UNITARIO | NUMERIC(15,4) | Preço unitário |
| VL_TOTAL | NUMERIC(15,2) | Valor total do item |
| VL_DESCONTO | NUMERIC(15,2) | Desconto |
| PC_ICMS | NUMERIC(5,2) | Alíquota ICMS (%) |
| PC_IPI | NUMERIC(5,2) | Alíquota IPI (%) |
| VL_IMPOSTO | NUMERIC(15,2) | Valor total de impostos |
| VL_SUBSTRIB | NUMERIC(15,2) | ICMS substituição tributária |
| VL_BASESUBST | NUMERIC(15,2) | Base de cálculo da ST |
| VL_CUSTO | NUMERIC(15,4) | Custo do item (para cálculo de margem) |
| VL_COMISSAO | NUMERIC(15,2) | Valor de comissão do item |
| PC_COMISSAO | NUMERIC(3,2) | % de comissão |
| ST_ENTREGA | CHAR(1) | 'A'=Aguardando, 'P'=Parcial, 'E'=Entregue, 'C'=Cancelado |
| PS_LIQUIDO | NUMERIC(15,3) | Peso líquido |
| PS_TOTAL | NUMERIC(15,3) | Peso bruto |
| VL_SEGURO | NUMERIC(15,2) | Seguro |
| VL_TAXABOLETO | NUMERIC(15,2) | Taxa de boleto |
PARMNOTA — Parâmetros por Série de NF
DDL: docs/schema/tables/PARMNOTA.sql
| Campo | Tipo | Efeito |
|---|---|---|
| CD_ESPECIE | VARCHAR(4) | 'NFE'=NF-e mod 55, 'NFCE'=NFC-e mod 65, 'CTE'=CT-e, 'SAT'=SAT-CFe |
| ST_CUPOMFISCAL | CHAR(1) | 'S' = série para cupom fiscal (ECF) |
| ST_IMPOSTO | CHAR(1) | 'S' = calcula imposto automaticamente nesta série |
| ST_GERABOLETO | CHAR(1) | 'S' = gera boleto ao emitir NF nesta série |
| ST_PERMITENOTAZERADA | CHAR(1) | 'S' = permite NF com valor zero |
| ST_DATABLOQUEADA | CHAR(1) | 'S' = bloqueia emissão retroativa |
| TP_PRODUTO | CHAR(1) | 'T'=Todos, 'P'=Produtos, 'S'=Serviços |
| NR_ITENS | INTEGER | Mínimo de itens por NF |
CONFIGNFE — Configuração Eletrônica
DDL: docs/schema/tables/CONFIGNFE.sql
| Campo | Tipo | Descrição |
|---|---|---|
| TPAMB | CHAR(1) | '1'=Produção, '2'=Homologação |
| TPEMIS | CHAR(1) | '1'=Normal, '2'=EPEC, '6'=SVC-RS, '9'=SVC-AN |
| DS_SENHACERT | VARCHAR(100) | Senha do certificado digital |
| TPCERTIFICADO | CHAR(1) | 'A'=Arquivo A1, 'S'=SmartCard A3 |
| NRSERIALCERT | VARCHAR(20) | Número de série do certificado |
| NRVERSAO | VARCHAR(5) | Versão do leiaute XML (ex: 4.00) |
| TPENVIO | CHAR(1) | 'I'=Síncrono (resposta imediata), 'A'=Assíncrono (retorno por recibo) |
| STEMAILAUTOMATICO | CHAR(1) | 'S' = envia DANFE por email ao autorizar |
| DS_MOTIVOCONTINGENCIA | VARCHAR(256) | Motivo da contingência ativa |
| DT_EMISSAOCONT | TIMESTAMP | Início da contingência |
Tabelas de Classificação Fiscal
| Tabela | DDL | Papel |
|---|---|---|
| CFO | docs/schema/tables/CFO.sql | CFOP — natureza da operação fiscal |
| CST | docs/schema/tables/CST.sql | Situação tributária ICMS (00, 10, 20, 30, 40, 41...) |
| NCM | docs/schema/tables/NCM.sql | Nomenclatura Comum do Mercosul (8 dígitos) + alíquotas |
| IMPOSTO | docs/schema/tables/IMPOSTO.sql | Matriz de configuração de impostos por empresa/UF |
| ORIGEM | docs/schema/tables/ORIGEM.sql | Origem do produto (nacional, importação) |
| PESSOASERIENF | docs/schema/tables/PESSOASERIENF.sql | Sé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:
- Seleciona regra de imposto por: empresa × item × CFOP × UF origem × UF destino
- Valida substituição tributária (ST) e calcula base ST com MVA
- Calcula FCP (Fundo de Combate à Pobreza) por UF destino
- Calcula partilha ICMS DIFAL (operações interestaduais para não contribuintes)
- 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:
- Valida
ST_NOTA = 'V'(só cancela nota válida) - Verifica prazo de cancelamento (180 dias — regra SEFAZ)
- Reverte estoque via MOVIMENTACAO (INSERT negativo)
- Estorna contas a receber em CONTAS (DELETE ou anulação)
- Cancela CT-e/MDF-e vinculados se existirem
- Grava histórico:
CD_USUARIOCANC,DT_CANCELAMENTO,DS_MOTIVOCANC - Seta
ST_NOTA = 'C'
Outras Procedures
| Procedure | Script | Ação |
|---|---|---|
CALCULA_VALORITEMNOTA | Scripts/ | Calcula VL_TOTAL do item (QT × VL_UNIT − DESC + FRETE + DESP) |
CALCULA_VALORADICIONALNOTA | Scripts/ | Distribui frete/seguro/despesa proporcionalmente entre itens |
ATUALIZA_DADOSIMPNOTA | Scripts/ | Atualiza campos de imposto em NOTA após cálculo |
ATUALIZA_IMPOSTONOTADEVOL | Scripts/ | Ajusta impostos em devolução parcial |
ATUALIZA_PEDIDONOTA | Scripts/ | Marca pedidos como faturados (PEDIDONOTA) |
Parâmetros (PARMFATUR)
Campos de PARMFATUR relevantes para NF-e:
| Parâmetro | Tipo | Efeito quando ativo |
|---|---|---|
ST_NUMERONOTA | S/N | 'S' = numeração automática por série |
ST_BLOQUEIONF | S/N | 'S' = bloqueia emissão de novas NFs |
ST_ALTERANOTA | S/N | 'S' = permite editar NF após emissão (antes de transmitir) |
ST_ALTERAICMS | S/N | 'S' = permite alterar ICMS manualmente no item |
ST_DIFALIQUOTAXML | S/N | 'S' = usa alíquota DIFAL do XML do fornecedor (entrada) |
ST_RECALCULAIMPOSTO | S/N | 'S' = recalcula impostos ao reabrir NF |
CD_MOVSAIDA | INTEGER | Movimentação de estoque padrão para saída de NF |
CD_MOVENTRADA | INTEGER | Movimentação de estoque padrão para entrada |
CD_MOVSERVICO | INTEGER | Movimentação para serviços |
CD_CONDPAGTO | INTEGER | Condição de pagamento padrão da NF |
CD_TABPRECO | INTEGER | Tabela 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)
| TPEMIS | Modo | Quando Usar |
|---|---|---|
| 1 | Normal | SEFAZ online |
| 2 | EPEC (Evento Prévio de Emissão em Contingência) | Queda total de internet |
| 6 | SVC-RS (Serviço de Contingência RS) | SEFAZ UF indisponível |
| 9 | SVC-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_NOTAPEDIDOpopula PEDIDONOTA — rastreamento item/NFPEDIDO.DT_FATURADOpreenchido 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
CONTASPEDIDOliga título ao pedido de origem
→ Estoque e Movimentação
- Autorização da NF de saída gera
INSERT MOVESTOQUE(saída) CD_MOVIMENTACAOdo 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