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.

3 curtidas

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

3 curtidas

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 :sweat_smile: :joy:

1 curtida

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 !

2 curtidas

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.

2 curtidas

2 curtidas

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.

2 curtidas

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

function run(cpfCnpj) {
    cpfCnpj = cpfCnpj.replace(/\D/g, '')
    
    return cpfCnpj;
}
2 curtidas

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!

2 curtidas

Ei @Five_Senses_Administ, tudo certinho?

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

2 curtidas