Pular para o conteúdo principal

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óduloCódigoDescriçãoPapel
Nota Fiscal de EntradaCNF001Cadastro/Lançamento de NF de entrada (Valida_nota_entrada_existe)Consumidora — bloqueia duplicata de NF por fornecedor
Parâmetros de FaturamentoMFA001Cadastro/edição do próprio parâmetroProdutora

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​

ProcedureArquivoUso
GERA_NOTAFISCALScripts/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_NOTAFISCALScripts/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​

CampoTabelaDescrição
ST_NUMERONOTAPARMFATURParâmetro (S=Por Empresa / N=Por Base)
NR_NOTAFISCAL / NR_NOTAFORNOTANúmero da nota fiscal sendo validada
CD_EMPRESANOTA / PARMFATUREmpresa proprietária da nota
CD_SERIE / CD_SERIEFORNOTASérie fiscal da nota
CD_ESPECIEFORNOTAEspécie (fornecedor)
NR_NOTAFORNOTANúmero do fornecedor (entrada)
DT_FORNECEDORNOTAData de emissão do fornecedor
ST_NFENTRADAMESMONUMERODTDIFPESSOAParâmetro complementar por fornecedor (permite mesmo nº se a data for diferente)

Opções disponíveis​

S - Por Empresa​

O que fazDetalhe
Escopo da verificaçãoSomente dentro da empresa (CD_EMPRESA atual)
Permite mesmo nº em outra empresa?SIM
Filtro SQL aplicadoAND N.CD_EMPRESA = :CD_EMPRESA
É o valor padrão?Sim (definido em AfterInsert de UdmMFA001.pas, linha 451)

Simulação passo a passo​

  1. Em MFA001 → Parâmetros → Ambos → Opção 1 → "Validação Nº Nota Fiscal já Emitida" = Por Empresa
  2. Salve (F6)
  3. 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
  4. Confirme o lançamento
  5. Troque para a Empresa 2 e lance outra NF do mesmo fornecedor com o mesmo número 12345
  6. O sistema aceita o lançamento (porque outra empresa é outro escopo)
  7. Volte para a Empresa 1 e tente lançar nova NF do mesmo fornecedor, série/espécie/número = 12345 novamente
  8. 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 fazDetalhe
Escopo da verificaçãoToda a base de dados (todas as empresas)
Permite mesmo nº em outra empresa?NÃO
Filtro SQL aplicadoNenhum (sem AND N.CD_EMPRESA = ...)
Quando usarBases onde o numerador de NF é compartilhado entre empresas ou há exigência fiscal de unicidade global

Simulação passo a passo​

  1. Em MFA001 → "Validação Nº Nota Fiscal já Emitida" = Por Base (em CADA empresa, pois o parâmetro é por CD_EMPRESA)
  2. Salve (F6)
  3. Na Empresa 1, lance NF de entrada do fornecedor "XPTO", série 1, espécie NFE, número 12345
  4. Confirme o lançamento
  5. Troque para a Empresa 2 e tente lançar outra NF do mesmo fornecedor com o mesmo número 12345
  6. O sistema bloqueia com a mensagem de nota já lançada
  7. 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.


Integração com PESSOA.ST_NFENTRADAMESMONUMERODTDIF​

Em CNF001.Valida_nota_entrada_existe a regra combina PARMFATUR.ST_NUMERONOTA com o parâmetro do fornecedor PESSOA.ST_NFENTRADAMESMONUMERODTDIF:

ST_NUMERONOTAST_NFENTRADAMESMONUMERODTDIF (PESSOA)Comportamento
S (Por Empresa)NBloqueia se existir mesma NF para o fornecedor na empresa
S (Por Empresa)SBloqueia somente se, além do restante, a DT_FORNECEDOR também coincidir
N (Por Base)NBloqueia se existir mesma NF para o fornecedor em QUALQUER empresa
N (Por Base)SBloqueia em qualquer empresa, e apenas quando a data do fornecedor coincidir

Tabela Comparativa Resumida​

OpçãoLabel DFMEscopoPermite duplicar entre empresasFallback no SQL
SPor EmpresaEmpresa atual (CD_EMPRESA)SimValor default via COALESCE(...,'S') em GERA_NOTAFISCAL
NPor BaseTodas as empresasNão—

Referências no Código Fonte​

Delphi​

ArquivoLinhasPapel
source/MFA001/UMFA001.dfm6016-6017 (label), 6647-6673 (combo)ComboBox cmbST_NUMERONOTA com Items.Strings = (Por Empresa=S, Por Base=N)
source/MFA001/UMFA001.pas380Declaração do controle cmbST_NUMERONOTA: TwwDBComboBox
source/MFA001/UdmMFA001.pas79Campo tabPARMFATURST_NUMERONOTA: TStringField
source/MFA001/UdmMFA001.pas451AfterInsert define valor padrão: ST_NUMERONOTA.AsString := 'S'
source/CNF001/UCNF001.pas4366-4429Procedure Valida_nota_entrada_existe — lê PARMFATUR e monta SQL dinâmico (linhas 4388-4391 aplicam AND N.CD_EMPRESA quando 'S')
source/RCA006/UdmRCA006.dfm3055-3297Inclui ST_NUMERONOTA em SELECT/INSERT/UPDATE da PARMFATUR (manutenção)
source/CPD009/UdmCPD009.dfm306-548Inclui ST_NUMERONOTA em SELECT/INSERT/UPDATE da PARMFATUR (manutenção)

SQL / Firebird​

ArquivoLinhasPapel
Scripts/GERA_NOTAFISCAL.sql102declare variable I_ST_NUMERONOTA varchar(1)
Scripts/GERA_NOTAFISCAL.sql257, 265SELECT de PARMFATUR para carregar o parâmetro
Scripts/GERA_NOTAFISCAL.sql515IF (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.sql123declare variable I_ST_NUMERONOTA varchar(1)
Scripts/GERA_ESTOQUE_NOTAFISCAL.sql171, 177SELECT de PARMFATUR para carregar o parâmetro