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ódulo | Código | Descrição |
|---|
| Cadastro de Pessoas | TFA001 | Cadastro de Pessoas (clientes, fornecedores, etc.) |
| Cadastro Simplificado de Pessoas | TFA083 | Cadastro 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
| Campo | Descrição |
|---|
PESSOA.NR_CNPJCPF | CPF/CNPJ da pessoa sendo cadastrada/alterada |
PESSOA.ST_ATIVA | Indicador de pessoa ativa (S) - validação só dispara quando está salvando pessoa ativa |
PESSOA.CD_PESSOA | Có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 faz | Detalhe |
|---|
| Valida duplicidade? | NÃO - salva a pessoa mesmo que outro cadastro ativo já use o mesmo CPF/CNPJ |
| Exceção de CPF zerado | A regra ignora 000.000.000-00 e 00.000.000/0000-00 (nunca valida esses valores) |
| Telas afetadas | TFA001 e TFA083 ignoram o SELECT de duplicidade |
| Código-fonte | UdmTFA001.pas:1206 e UdmTFA083.pas:364 só entram no bloco de validação quando iST_CPFCNPJREPETIDO = 'N' |
Simulação passo a passo
- Vá em MFA001 → Parâmetros → Ambos → Opção 1 → "Incluir Pessoa com CPF/CNPJ Iguais" = "Sim"
- Salve os parâmetros (F6)
- Abra o Cadastro de Pessoas (TFA001)
- Cadastre uma pessoa "A" com CNPJ
12.345.678/0001-99 e ST_ATIVA = S, salve
- Inclua uma nova pessoa "B" com o mesmo CNPJ
12.345.678/0001-99
- Tente salvar (F6) → Salva normalmente, sem mensagem de alerta
- 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 faz | Detalhe |
|---|
| 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 zerado | Ignora 000.000.000-00 e 00.000.000/0000-00 (nunca alerta para esses valores) |
| Fluxo ao encontrar duplicado | Exibe 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 TFA001 | C-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 TFA083 | C-0991 (confirmação de inativação) e W-0992 (bloqueio quando o usuário recusa inativar) (UdmTFA083.pas:368 e UdmTFA083.pas:377) |
| Requisito extra | A 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
- MFA001 → ST_CPFCNPJREPETIDO = "Não"
- Salve os parâmetros (F6)
- Abra o TFA001 e cadastre a pessoa "A" (ativa) com CNPJ
12.345.678/0001-99
- Inclua uma nova pessoa "B" também ativa com o mesmo CNPJ
- Tente salvar (F6)
- 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
- Repita o teste no TFA083 → comportamento idêntico, mas usando as mensagens
C-0991 e W-0992
- 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ção | Descrição | Valida duplicidade? | Oferece inativar antigo? | Ignora CPF/CNPJ zerado? | Telas afetadas |
|---|
| S | Sim (permite repetir) | Não | - | - | - |
| N | Não (bloqueia/avisa) | Sim (somente ST_ATIVA = 'S') | Sim (C-0000 / C-0991) | Sim | TFA001, 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
| Arquivo | Linha | Trecho |
|---|
source/MFA001/UMFA001.dfm | 2540 | Label: Caption = 'Incluir Pessoa com CPF/CNPJ Iguais' |
source/MFA001/UMFA001.dfm | 3336 | ComboBox DataField = 'ST_CPFCNPJREPETIDO' com Items = ('Sim'#9'S', 'N'#227'o'#9'N') |
source/MFA001/UdmMFA001.pas | 140 | Declaração tabPARMFATURST_CPFCNPJREPETIDO: TStringField |
source/MFA001/UdmMFA001.pas | 487 | Valor padrão no AfterInsert: tabPARMFATURST_CPFCNPJREPETIDO.AsString := 'S' |
source/MFA001/UdmMFA001.dfm | 55, 1160-1163, 2380, 2540, 2652, 2935 | Campo listado no SELECT, InsertSQL, ModifySQL e FetchRowSQL do updPARMFATUR |
Validação em TFA001 - Cadastro de Pessoas
| Arquivo | Linha | Trecho |
|---|
source/TFA001/UdmTFA001.pas | 521 | Declaração da variável iST_CPFCNPJREPETIDO: string |
source/TFA001/UTFA001.pas | 958 | Carrega o parâmetro: dmTFA001.iST_CPFCNPJREPETIDO := ExecutaConsulta(..., 'SELECT ST_CPFCNPJREPETIDO FROM PARMFATUR WHERE CD_EMPRESA = ' + IntToStr(Sessao.empresa.cd_empresa))[0] |
source/TFA001/UdmTFA001.pas | 1188-1235 | Bloco 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.pas | 1206 | Condição: if (dmTFA001.iST_CPFCNPJREPETIDO = 'N') - entra no fluxo de confirmação/bloqueio |
source/TFA001/UdmTFA001.pas | 1212 | Mensagem C-0000 perguntando se deseja inativar pessoa antiga |
source/TFA001/UdmTFA001.pas | 1221-1222 | Confirmação positiva: executa UPDATE PESSOA SET ST_ATIVA = 'N' WHERE CD_PESSOA = <pessoa antiga> |
source/TFA001/UdmTFA001.pas | 1229 | Recusa: levanta JException E-0000 "CNPJ/CPF já Cadastrado para a Pessoa X! Verifique!" |
Validação em TFA083 - Cadastro Simplificado
| Arquivo | Linha | Trecho |
|---|
source/TFA083/UdmTFA083.pas | 167 | Declaração da variável iST_CPFCNPJREPETIDO: string |
source/TFA083/UTFA083.pas | 260 | Carrega o parâmetro: dmTFA083.iST_CPFCNPJREPETIDO := ExecutaConsulta(..., 'SELECT ST_CPFCNPJREPETIDO FROM PARMFATUR WHERE CD_EMPRESA = ' + IntToStr(sessao.empresa.cd_empresa))[0] |
source/TFA083/UdmTFA083.pas | 347-383 | Bloco 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.pas | 364 | Condição: if (dmTFA083.iST_CPFCNPJREPETIDO = 'N') |
source/TFA083/UdmTFA083.pas | 368 | Mensagem C-0991 perguntando se deseja inativar a pessoa antiga |
source/TFA083/UdmTFA083.pas | 371-372 | Confirmação positiva: UPDATE PESSOA SET ST_ATIVA = 'N' WHERE CD_PESSOA = <pessoa antiga> |
source/TFA083/UdmTFA083.pas | 377 | Recusa: levanta JException W-0992 bloqueando o salvamento |
Uso em outras telas / APIs REST
| Arquivo | Linha | Observação |
|---|
source/CPD009/UdmCPD009.dfm | 272, 335, 400, 508 | Campo incluído no CRUD de parâmetros secundário (cópia/sincronização de PARMFATUR) |
source/RCA006/UdmRCA006.dfm | 3021, 3084, 3149, 3257 | Campo incluído no CRUD de parâmetros da Recapadora |
source/Server/PedidoMobile/ERPPedidoRestAS/src/main/java/br/com/junsoft/DAO/ParametroSmartDAO.java | 31, 162 | API 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.java | 25, 43 | API mobile valida CPF repetido usando o mesmo parâmetro |
source/Server/VulcanoColeta/VulcanoColetaRestAS/src/main/java/br/com/junsoft/DAO/ParametrosDAO.java | 22, 79 | API Vulcano Coleta lê o parâmetro |
source/Server/VulcanoColeta/VulcanoColetaRestAS/src/main/java/br/com/junsoft/DAO/ClienteCpfDAO.java | 23, 38 | API Vulcano Coleta valida CPF repetido |
source/Server/JunsoftWebAPI/src/main/java/junsoft/erp/repository/JunsoftBuilder.java | 366 | API Web mapeia o campo para a entidade de parâmetros |
source/Server/JunsoftWebAPI/src/main/java/junsoft/erp/repository/queries/ParmFaturSQL.java | 50 | Query 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.