Pular para o conteúdo principal

Parâmetro de Bloqueio de CPF/CNPJ Duplicado no Cadastro de Pessoa

Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Ambos → Opção 1 (rótulo "Incluir Pessoa com CPF/CNPJ Iguais") Tabela: PARMFATUR.ST_CPFCNPJREPETIDO Valor padrão: S (Sim - permite CPF/CNPJ duplicado)

Telas impactadas​

MóduloCódigoDescrição
Cadastro de PessoasTFA001Cadastro de Pessoas (clientes, fornecedores, etc.)
Cadastro Simplificado de PessoasTFA083Cadastro rápido / simplificado de Pessoa

Observação: APIs REST de retaguarda (PedidoMobile/PessoaCpfDAO, VulcanoColeta/ClienteCpfDAO, JunsoftWebAPI/ParmFaturSQL) também leem este campo para replicar a regra em apps mobile e no Portal Web.

Campos envolvidos​

CampoDescrição
PESSOA.NR_CNPJCPFCPF/CNPJ da pessoa sendo cadastrada/alterada
PESSOA.ST_ATIVAIndicador de pessoa ativa (S) - validação só dispara quando está salvando pessoa ativa
PESSOA.CD_PESSOACódigo identificador da pessoa (usado para excluir o próprio registro da comparação)

Opções disponíveis​

S - Sim (Permite Cadastrar CPF/CNPJ Repetido)​

O que fazDetalhe
Valida duplicidade?NÃO - salva a pessoa mesmo que outro cadastro ativo já use o mesmo CPF/CNPJ
Exceção de CPF zeradoA regra ignora 000.000.000-00 e 00.000.000/0000-00 (nunca valida esses valores)
Telas afetadasTFA001 e TFA083 ignoram o SELECT de duplicidade
Código-fonteUdmTFA001.pas:1206 e UdmTFA083.pas:364 só entram no bloco de validação quando iST_CPFCNPJREPETIDO = 'N'

Simulação passo a passo​

  1. Vá em MFA001 → Parâmetros → Ambos → Opção 1 → "Incluir Pessoa com CPF/CNPJ Iguais" = "Sim"
  2. Salve os parâmetros (F6)
  3. Abra o Cadastro de Pessoas (TFA001)
  4. Cadastre uma pessoa "A" com CNPJ 12.345.678/0001-99 e ST_ATIVA = S, salve
  5. Inclua uma nova pessoa "B" com o mesmo CNPJ 12.345.678/0001-99
  6. Tente salvar (F6) → Salva normalmente, sem mensagem de alerta
  7. Agora teste no TFA083 com outro CPF já existente → também salva sem alertar

Resultado esperado: O sistema aceita múltiplas pessoas ativas com o mesmo CPF/CNPJ. Nenhuma validação de duplicidade é executada. Este é o valor padrão ao criar um novo registro no MFA001 (UdmMFA001.pas:487).


N - Não (Bloqueia / Avisa CPF/CNPJ Repetido)​

O que fazDetalhe
Valida duplicidade?SIM - antes de salvar, executa SELECT em PESSOA buscando outro registro ativo com o mesmo NR_CNPJCPF e CD_PESSOA diferente
Exceção de CPF zeradoIgnora 000.000.000-00 e 00.000.000/0000-00 (nunca alerta para esses valores)
Fluxo ao encontrar duplicadoExibe mensagem de confirmação oferecendo inativar a pessoa antiga; se o usuário confirmar, executa UPDATE PESSOA SET ST_ATIVA = 'N' no cadastro antigo. Se recusar, bloqueia o salvamento com exception
Mensagem em TFA001C-0000: "CPF/CNPJ já está cadastrado para a Pessoa X. Deseja inativar a pessoa Y?" (UdmTFA001.pas:1212). Se recusar: E-0000 "CNPJ/CPF já Cadastrado para a Pessoa X! Verifique!" (UdmTFA001.pas:1229)
Mensagem em TFA083C-0991 (confirmação de inativação) e W-0992 (bloqueio quando o usuário recusa inativar) (UdmTFA083.pas:368 e UdmTFA083.pas:377)
Requisito extraA validação só dispara quando a pessoa sendo salva está com ST_ATIVA = 'S' (no TFA001, via frmTFA001.cmbST_ATIVA.Value = 'S' em UdmTFA001.pas:1188)

Simulação passo a passo​

  1. MFA001 → ST_CPFCNPJREPETIDO = "Não"
  2. Salve os parâmetros (F6)
  3. Abra o TFA001 e cadastre a pessoa "A" (ativa) com CNPJ 12.345.678/0001-99
  4. Inclua uma nova pessoa "B" também ativa com o mesmo CNPJ
  5. Tente salvar (F6)
  6. Aparece confirmação: "CPF/CNPJ já está cadastrado para a Pessoa A. Deseja inativar a pessoa A?"
    • Se clicar Sim: a pessoa "A" é inativada (UPDATE PESSOA SET ST_ATIVA = 'N' WHERE CD_PESSOA = A) e a pessoa "B" é salva normalmente
    • Se clicar Não: lança exceção "CNPJ/CPF já Cadastrado para a Pessoa A! Verifique!" e cancela o salvamento
  7. Repita o teste no TFA083 → comportamento idêntico, mas usando as mensagens C-0991 e W-0992
  8. Tente agora cadastrar "B" com CPF 000.000.000-00 → salva sem alerta (valor zerado é ignorado pela regra)

Resultado esperado: Impede duplicidade de CPF/CNPJ entre pessoas ativas. O usuário tem a opção de converter o cadastro duplicado em uma inativação automática do registro antigo. CPF/CNPJ zerados continuam sendo aceitos livremente.


Tabela Comparativa Resumida​

OpçãoDescriçãoValida duplicidade?Oferece inativar antigo?Ignora CPF/CNPJ zerado?Telas afetadas
SSim (permite repetir)Não---
NNão (bloqueia/avisa)Sim (somente ST_ATIVA = 'S')Sim (C-0000 / C-0991)SimTFA001, TFA083

Observação sobre o rótulo: O label no MFA001 é "Incluir Pessoa com CPF/CNPJ Iguais" (UMFA001.dfm:2540). Portanto, "Sim" = permite incluir duplicado, "Não" = bloqueia/avisa. Esse sentido é o inverso do que a leitura isolada do nome do parâmetro poderia sugerir.


Referências no Código Fonte​

Tela de parâmetros MFA001​

ArquivoLinhaTrecho
source/MFA001/UMFA001.dfm2540Label: Caption = 'Incluir Pessoa com CPF/CNPJ Iguais'
source/MFA001/UMFA001.dfm3336ComboBox DataField = 'ST_CPFCNPJREPETIDO' com Items = ('Sim'#9'S', 'N'#227'o'#9'N')
source/MFA001/UdmMFA001.pas140Declaração tabPARMFATURST_CPFCNPJREPETIDO: TStringField
source/MFA001/UdmMFA001.pas487Valor padrão no AfterInsert: tabPARMFATURST_CPFCNPJREPETIDO.AsString := 'S'
source/MFA001/UdmMFA001.dfm55, 1160-1163, 2380, 2540, 2652, 2935Campo listado no SELECT, InsertSQL, ModifySQL e FetchRowSQL do updPARMFATUR

Validação em TFA001 - Cadastro de Pessoas​

ArquivoLinhaTrecho
source/TFA001/UdmTFA001.pas521Declaração da variável iST_CPFCNPJREPETIDO: string
source/TFA001/UTFA001.pas958Carrega o parâmetro: dmTFA001.iST_CPFCNPJREPETIDO := ExecutaConsulta(..., 'SELECT ST_CPFCNPJREPETIDO FROM PARMFATUR WHERE CD_EMPRESA = ' + IntToStr(Sessao.empresa.cd_empresa))[0]
source/TFA001/UdmTFA001.pas1188-1235Bloco de validação: só dispara se cmbST_ATIVA.Value = 'S' e NR_CNPJCPF <> ''; monta SELECT em PESSOA filtrando por NR_CNPJCPF + ST_ATIVA = 'S' + CD_PESSOA <> atual
source/TFA001/UdmTFA001.pas1206Condição: if (dmTFA001.iST_CPFCNPJREPETIDO = 'N') - entra no fluxo de confirmação/bloqueio
source/TFA001/UdmTFA001.pas1212Mensagem C-0000 perguntando se deseja inativar pessoa antiga
source/TFA001/UdmTFA001.pas1221-1222Confirmação positiva: executa UPDATE PESSOA SET ST_ATIVA = 'N' WHERE CD_PESSOA = <pessoa antiga>
source/TFA001/UdmTFA001.pas1229Recusa: levanta JException E-0000 "CNPJ/CPF já Cadastrado para a Pessoa X! Verifique!"

Validação em TFA083 - Cadastro Simplificado​

ArquivoLinhaTrecho
source/TFA083/UdmTFA083.pas167Declaração da variável iST_CPFCNPJREPETIDO: string
source/TFA083/UTFA083.pas260Carrega o parâmetro: dmTFA083.iST_CPFCNPJREPETIDO := ExecutaConsulta(..., 'SELECT ST_CPFCNPJREPETIDO FROM PARMFATUR WHERE CD_EMPRESA = ' + IntToStr(sessao.empresa.cd_empresa))[0]
source/TFA083/UdmTFA083.pas347-383Bloco de validação: executa SELECT em PESSOA (filtro por NR_CNPJCPF + ST_ATIVA = 'S' + CD_PESSOA diferente); ignora 000.000.000-00 e 00.000.000/0000-00
source/TFA083/UdmTFA083.pas364Condição: if (dmTFA083.iST_CPFCNPJREPETIDO = 'N')
source/TFA083/UdmTFA083.pas368Mensagem C-0991 perguntando se deseja inativar a pessoa antiga
source/TFA083/UdmTFA083.pas371-372Confirmação positiva: UPDATE PESSOA SET ST_ATIVA = 'N' WHERE CD_PESSOA = <pessoa antiga>
source/TFA083/UdmTFA083.pas377Recusa: levanta JException W-0992 bloqueando o salvamento

Uso em outras telas / APIs REST​

ArquivoLinhaObservação
source/CPD009/UdmCPD009.dfm272, 335, 400, 508Campo incluído no CRUD de parâmetros secundário (cópia/sincronização de PARMFATUR)
source/RCA006/UdmRCA006.dfm3021, 3084, 3149, 3257Campo incluído no CRUD de parâmetros da Recapadora
source/Server/PedidoMobile/ERPPedidoRestAS/src/main/java/br/com/junsoft/DAO/ParametroSmartDAO.java31, 162API mobile lê o parâmetro para replicar a regra no app de Pedido
source/Server/PedidoMobile/ERPPedidoRestAS/src/main/java/br/com/junsoft/DAO/PessoaCpfDAO.java25, 43API mobile valida CPF repetido usando o mesmo parâmetro
source/Server/VulcanoColeta/VulcanoColetaRestAS/src/main/java/br/com/junsoft/DAO/ParametrosDAO.java22, 79API Vulcano Coleta lê o parâmetro
source/Server/VulcanoColeta/VulcanoColetaRestAS/src/main/java/br/com/junsoft/DAO/ClienteCpfDAO.java23, 38API Vulcano Coleta valida CPF repetido
source/Server/JunsoftWebAPI/src/main/java/junsoft/erp/repository/JunsoftBuilder.java366API Web mapeia o campo para a entidade de parâmetros
source/Server/JunsoftWebAPI/src/main/java/junsoft/erp/repository/queries/ParmFaturSQL.java50Query base inclui o campo

Stored procedures: Nenhuma referência a ST_CPFCNPJREPETIDO foi encontrada em Scripts/ - toda a lógica de validação está nas telas Delphi (TFA001/TFA083) e nos DAOs Java.