Validação de Nº de Nota Fiscal já Emitida
Tela de configuração: MFA001 - Parâmetros de Faturamento
Localização: Parâmetros → Notas Fiscais → Parâmetros de Notas → "Validação Nº Nota Fiscal já Emitida"
Tabela: PARMFATUR.ST_NUMERONOTA
Valor padrão: S (Por Empresa)
O parâmetro define o escopo de verificação de duplicidade do número da nota fiscal ao emitir uma nova NF (entrada ou saída). Ele decide se o sistema procura por notas com o mesmo número apenas dentro da empresa atual ou em TODAS as empresas da base de dados (toda a base Firebird).
Telas impactadas
| Módulo | Código | Descrição | Papel |
|---|
| Nota Fiscal de Entrada | CNF001 | Cadastro/Lançamento de NF de entrada (Valida_nota_entrada_existe) | Consumidora — bloqueia duplicata de NF por fornecedor |
| Parâmetros de Faturamento | MFA001 | Cadastro/edição do próprio parâmetro | Produtora |
Telas RCA006 e CPD009 listam o campo ST_NUMERONOTA apenas no SELECT/INSERT/UPDATE de manutenção da PARMFATUR (abas de configuração que replicam MFA001), não o consomem como regra de negócio.
Procedures impactadas
| Procedure | Arquivo | Uso |
|---|
GERA_NOTAFISCAL | Scripts/GERA_NOTAFISCAL.sql (linhas 102, 257, 265, 515) | Valida duplicidade do NR_NOTAFISCAL na geração da nota. Se S → restringe WHERE à empresa atual; se N → varre todas as empresas da base. |
GERA_ESTOQUE_NOTAFISCAL | Scripts/GERA_ESTOQUE_NOTAFISCAL.sql (linhas 123, 171, 177) | Carrega o parâmetro em I_ST_NUMERONOTA a partir de PARMFATUR (mesma leitura que GERA_NOTAFISCAL). |
Campos envolvidos
| Campo | Tabela | Descrição |
|---|
ST_NUMERONOTA | PARMFATUR | Parâmetro (S=Por Empresa / N=Por Base) |
NR_NOTAFISCAL / NR_NOTAFOR | NOTA | Número da nota fiscal sendo validada |
CD_EMPRESA | NOTA / PARMFATUR | Empresa proprietária da nota |
CD_SERIE / CD_SERIEFOR | NOTA | Série fiscal da nota |
CD_ESPECIEFOR | NOTA | Espécie (fornecedor) |
NR_NOTAFOR | NOTA | Número do fornecedor (entrada) |
DT_FORNECEDOR | NOTA | Data de emissão do fornecedor |
ST_NFENTRADAMESMONUMERODTDIF | PESSOA | Parâmetro complementar por fornecedor (permite mesmo nº se a data for diferente) |
Opções disponíveis
S - Por Empresa
| O que faz | Detalhe |
|---|
| Escopo da verificação | Somente dentro da empresa (CD_EMPRESA atual) |
| Permite mesmo nº em outra empresa? | SIM |
| Filtro SQL aplicado | AND N.CD_EMPRESA = :CD_EMPRESA |
| É o valor padrão? | Sim (definido em AfterInsert de UdmMFA001.pas, linha 451) |
Simulação passo a passo
- Em MFA001 → Parâmetros → Ambos → Opção 1 → "Validação Nº Nota Fiscal já Emitida" =
Por Empresa
- Salve (F6)
- Na Empresa 1, lance uma NF de entrada do fornecedor "XPTO", série
1, espécie NFE, número 12345, data 01/04/2026 em CNF001
- Confirme o lançamento
- Troque para a Empresa 2 e lance outra NF do mesmo fornecedor com o mesmo número
12345
- O sistema aceita o lançamento (porque outra empresa é outro escopo)
- Volte para a Empresa 1 e tente lançar nova NF do mesmo fornecedor, série/espécie/número =
12345 novamente
- O sistema bloqueia com mensagem:
A Nota Fiscal ... Já está Lançada. Verifique.
Resultado esperado: Duplicidade é impedida apenas dentro da mesma empresa; bases multi-empresa podem reutilizar o mesmo nº de nota entre empresas distintas.
N - Por Base
| O que faz | Detalhe |
|---|
| Escopo da verificação | Toda a base de dados (todas as empresas) |
| Permite mesmo nº em outra empresa? | NÃO |
| Filtro SQL aplicado | Nenhum (sem AND N.CD_EMPRESA = ...) |
| Quando usar | Bases onde o numerador de NF é compartilhado entre empresas ou há exigência fiscal de unicidade global |
Simulação passo a passo
- Em MFA001 → "Validação Nº Nota Fiscal já Emitida" =
Por Base (em CADA empresa, pois o parâmetro é por CD_EMPRESA)
- Salve (F6)
- Na Empresa 1, lance NF de entrada do fornecedor "XPTO", série
1, espécie NFE, número 12345
- Confirme o lançamento
- Troque para a Empresa 2 e tente lançar outra NF do mesmo fornecedor com o mesmo número
12345
- O sistema bloqueia com a mensagem de nota já lançada
- Na emissão via
GERA_NOTAFISCAL (NF de saída), a cláusula IF (COALESCE(I_ST_NUMERONOTA,'S') = 'N') executa o SELECT em NOTA sem filtrar CD_EMPRESA, pegando qualquer duplicata na base
Resultado esperado: Qualquer tentativa de emitir/lançar nota com NR_NOTAFISCAL já existente em qualquer empresa é bloqueada.
Em CNF001.Valida_nota_entrada_existe a regra combina PARMFATUR.ST_NUMERONOTA com o parâmetro do fornecedor PESSOA.ST_NFENTRADAMESMONUMERODTDIF:
ST_NUMERONOTA | ST_NFENTRADAMESMONUMERODTDIF (PESSOA) | Comportamento |
|---|
S (Por Empresa) | N | Bloqueia se existir mesma NF para o fornecedor na empresa |
S (Por Empresa) | S | Bloqueia somente se, além do restante, a DT_FORNECEDOR também coincidir |
N (Por Base) | N | Bloqueia se existir mesma NF para o fornecedor em QUALQUER empresa |
N (Por Base) | S | Bloqueia em qualquer empresa, e apenas quando a data do fornecedor coincidir |
Tabela Comparativa Resumida
| Opção | Label DFM | Escopo | Permite duplicar entre empresas | Fallback no SQL |
|---|
S | Por Empresa | Empresa atual (CD_EMPRESA) | Sim | Valor default via COALESCE(...,'S') em GERA_NOTAFISCAL |
N | Por Base | Todas as empresas | Não | — |
Referências no Código Fonte
Delphi
| Arquivo | Linhas | Papel |
|---|
source/MFA001/UMFA001.dfm | 6016-6017 (label), 6647-6673 (combo) | ComboBox cmbST_NUMERONOTA com Items.Strings = (Por Empresa=S, Por Base=N) |
source/MFA001/UMFA001.pas | 380 | Declaração do controle cmbST_NUMERONOTA: TwwDBComboBox |
source/MFA001/UdmMFA001.pas | 79 | Campo tabPARMFATURST_NUMERONOTA: TStringField |
source/MFA001/UdmMFA001.pas | 451 | AfterInsert define valor padrão: ST_NUMERONOTA.AsString := 'S' |
source/CNF001/UCNF001.pas | 4366-4429 | Procedure Valida_nota_entrada_existe — lê PARMFATUR e monta SQL dinâmico (linhas 4388-4391 aplicam AND N.CD_EMPRESA quando 'S') |
source/RCA006/UdmRCA006.dfm | 3055-3297 | Inclui ST_NUMERONOTA em SELECT/INSERT/UPDATE da PARMFATUR (manutenção) |
source/CPD009/UdmCPD009.dfm | 306-548 | Inclui ST_NUMERONOTA em SELECT/INSERT/UPDATE da PARMFATUR (manutenção) |
SQL / Firebird
| Arquivo | Linhas | Papel |
|---|
Scripts/GERA_NOTAFISCAL.sql | 102 | declare variable I_ST_NUMERONOTA varchar(1) |
Scripts/GERA_NOTAFISCAL.sql | 257, 265 | SELECT de PARMFATUR para carregar o parâmetro |
Scripts/GERA_NOTAFISCAL.sql | 515 | IF (COALESCE(I_ST_NUMERONOTA,'S') = 'N') THEN — sem filtro de CD_EMPRESA (escopo base); ELSE — filtro CD_EMPRESA = :V_CD_EMPRESA |
Scripts/GERA_ESTOQUE_NOTAFISCAL.sql | 123 | declare variable I_ST_NUMERONOTA varchar(1) |
Scripts/GERA_ESTOQUE_NOTAFISCAL.sql | 171, 177 | SELECT de PARMFATUR para carregar o parâmetro |