Respondido

Identificar CPF ou CNPJ


Gostaria de saber se tem como eu indentifacar se o que o cliente digitou foi o cnpj ou cpf, e depois ir buscar na minha api,


Por gentiliza, me infome o seu CPF ou CNPJ

(somente números)


e com a respostar ele ir ate a api.

icon

Melhor resposta por GabrielPetrone 18 May 2021, 13:59

Veja o original

9 comentários

Reputação 7
Crachá +1

Bom, é só você validar na Condição de Saídas conforme os regex. Veja um exemplo que eu uso aqui:


Ou seja:



SE resposta do usuário CORRESPONDE À REGEX ^\d{14}$ ou

^\d{2}.?\d{3}.?\d{3}\/?\d{4}-?\d{2}$ então É CNPJ



Daí se for CPF você não precisa por uma validação, mas caso queira é simplesmente:



SE resposta do usuário CORRESPONDE À REGEX ^\d{11}$ ou

^\d{3}.?\d{3}.?\d{3}-?\d{2}$ então É CPF


Reputação 5
Crachá +1

Olá, sua API possui rotas especificas para CPF e CNPJ ou você consultar ambos pela mesma rota?


Não sei se vai ajudar, mas eu faço a validação de ambos em um único script pois minha API faz a consulta de CPF e CNPJ na mesma rota.


function run(cpfCnpj) {

const isCNPJ = (cpfCnpj = null) => {
cpfCnpj = cpfCnpj.replace(/\D/g, '')
if (cpfCnpj.length !== 14) {
return false
}
if (
cpfCnpj === '00000000000000' ||
cpfCnpj === '11111111111111' ||
cpfCnpj === '22222222222222' ||
cpfCnpj === '33333333333333' ||
cpfCnpj === '44444444444444' ||
cpfCnpj === '55555555555555' ||
cpfCnpj === '66666666666666' ||
cpfCnpj === '77777777777777' ||
cpfCnpj === '88888888888888' ||
cpfCnpj === '99999999999999'
) {
return false
}
// Valida DVs
var tamanho = cpfCnpj.length - 2
var numeros = cpfCnpj.substring(0, tamanho)
var digitos = cpfCnpj.substring(tamanho)
var soma = 0
var pos = tamanho - 7
for (var i = tamanho; i >= 1; i--) {
soma += numeros.charAt(tamanho - i) * pos--
if (pos < 2) {
pos = 9
}
}
var resultado = soma % 11 < 2 ? 0 : 11 - (soma % 11)
if (resultado !== parseInt(digitos.charAt(0), 10)) {
return false
}
tamanho = tamanho + 1
numeros = cpfCnpj.substring(0, tamanho)
soma = 0
pos = tamanho - 7
for (var il = tamanho; il >= 1; il--) {
soma += numeros.charAt(tamanho - il) * pos--
if (pos < 2) {
pos = 9
}
}
resultado = soma % 11 < 2 ? 0 : 11 - (soma % 11)
if (resultado !== parseInt(digitos.charAt(1), 10)) {
return false
}
return true
}
const isCPF = (cpf) => {
if (!cpf) return cpf
cpf = cpf.replace(/\D/g, '')
if (cpf === '') return false
if (
cpf.length !== 11 ||
cpf === '00000000000' ||
cpf === '11111111111' ||
cpf === '22222222222' ||
cpf === '33333333333' ||
cpf === '44444444444' ||
cpf === '55555555555' ||
cpf === '66666666666' ||
cpf === '77777777777' ||
cpf === '88888888888' ||
cpf === '99999999999'
)
return false
var add = 0
for (var i = 0; i < 9; i++) add += parseInt(cpf.charAt(i)) * (10 - i)
var rev = 11 - (add % 11)
if (rev === 10 || rev === 11) rev = 0
if (rev !== parseInt(cpf.charAt(9))) return false
add = 0
for (i = 0; i < 10; i++) add += parseInt(cpf.charAt(i)) * (11 - i)
rev = 11 - (add % 11)
if (rev === 10 || rev === 11) rev = 0
if (rev !== parseInt(cpf.charAt(10))) return false
return true
}

const validaCPFeCNPJ = (cpfCnpj = null) => {
if (!cpfCnpj) return false
cpfCnpj = cpfCnpj.replace(/\D/g, '')
return cpfCnpj.length === 14
? isCNPJ(cpfCnpj)
: cpfCnpj.length === 11
? isCPF(cpfCnpj)
: false
}

return JSON.stringify(validaCPFeCNPJ(cpfCnpj));
}

Mas acho que a solução do @GabrielPetrone é mais prática 😂

Reputação 7
Crachá +1

Obrigado por compartilhar conosco @Adriano_tsi , muito bom seu script!


De qualquer forma, se vai usar a resposta do usuário via API, vai ser preciso rodar algum script mesmo, né? No mínimo pra remover os caracteres especiais do CNPJ ou CPF, caso o cliente digite.


Então seguem aí duas soluções pra te ajudar @Five_Senses_Administ !

Minha api possui rotas especificas para busca por CPF e CNPJ, na verdade é uma API de um sistema, inclusive para fazer a busca precisa que não tenha pontos, não da para alterar a API, a forma do @GabrielPetrone é bem valida entretanto tem a questão da puntuação, se eu mandar assim a api não reconhece.

Reputação 7
Crachá +1

Sim, foi o que comentei, o mesmo acontece comigo, não aceita pontuação.


Mas isso é fácil de tratar, nas Ações de saída você roda um script simples dando replace:


function run (cpfCnpj) {
if (cpfCnpj.includes("/") {
return cpfCnpj.replace(".","").replace(".","").replace("/","").replace("-","");
} else if (cpfCnpj.includes("-") {
return cpfCnpj.replace(".","").replace(".","").replace("-","");
} else {
return cpfCnpj;
}
}

ACHO que vai funcionar esse código, fiz de cabeça aqui mas tá muito próximo, caso não funcione.

Reputação 5
Crachá +1

Ah eu faço algo parecido mas eu passo apenas esse Regex no replace


function run(cpfCnpj) {
cpfCnpj = cpfCnpj.replace(/\D/g, '')

return cpfCnpj;
}
Reputação 7
Crachá +1

Já até salvei esse seu replace. Tá doido! hahaha eu tava dando uma volta tão grande pra fazer algo tão simples, né?

Obrigado por compartilhar!

Reputação 7

Ei @Five_Senses_Administ, tudo certinho?


Espero que o @GabrielPetrone e o @Adriano_tsi tenham conseguido te ajudar, Conseguiu resolver por aí?

Comente