Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Digitos Verificadores Repetidos

Olá! Acabei testando meu próprio CPF por curiosidade e percebi que, aparentemente, a lógica implementada não tolera que esses dois dígitos sejam iguais.

A lógica inicialmente era esta mesmo? Ou deixei escapar algum detalhe de código? Vou deixar ele aqui para caso alguém tenha a mesma dúvida ou saiba se faltou algo:

function checaCPFRepetido(cpf) {
    const valoresRepetidos = [
        '00000000000',
        '11111111111',
        '22222222222',
        '33333333333',
        '44444444444',
        '55555555555',
        '66666666666',
        '77777777777',
        '88888888888',
        '99999999999'
    ];
    let cpfValido = true;

    valoresRepetidos.forEach(valor => {
        if(valor == cpf) {
            cpfValido = false;
        }
    });

    return cpfValido;
}

function checaEstruturaCPF(cpf) {
    const multiplicador = 10;

    return checaDigitoVerificador(cpf, multiplicador);
}

function checaDigitoVerificador(cpf, multiplicador) {
    if(multiplicador >= 12) {
        return true;
    }

    let multiplicadorInicial = multiplicador; // para o for abaixo não sobrescrever;
    let soma = 0; // pegando o cpf sem dígitos (de 0 até 9... 10 e 11 são os dígitos verificadores)
    const cpfSemDigitos = cpf.substr(0, multiplicador - 1).split('');
    const digitoVerificador = cpf.charAt(multiplicador - 1);
    for(let contador = 0; multiplicadorInicial > 1; multiplicadorInicial--) {
        soma = soma + cpfSemDigitos[contador] * multiplicadorInicial;
        contador++;
    }

    if(digitoVerificador == confirmaDigito(soma)) {
        return checaDigitoVerificador(cpf, multiplicador + 1);
    }

    return false;
}

function confirmaDigito(soma) {
    return 11 - (soma % 11);
}

Abraços!

1 resposta
solução!

Oi Lucas, tudo bem?

A lógica que você implementou no seu código é uma abordagem válida para a validação de CPF, mas ela tem um detalhe que pode ser aprimorado. No seu código, você criou um array chamado valoresRepetidos que contém CPFs com dígitos repetidos, e depois você verifica se o CPF fornecido é igual a algum dos CPFs nesse array. Se for igual, você considera o CPF inválido.

Aqui está o trecho do seu código que realiza essa verificação:

valoresRepetidos.forEach(valor => {
    if (valor == cpf) {
        cpfValido = false;
    }
});

Essa abordagem funciona bem para detectar CPFs que têm todos os dígitos repetidos, como '00000000000' ou '11111111111'. No entanto, ela não lida adequadamente com CPFs que têm apenas um dos dígitos repetidos, como '12345567890'. O CPF que mencionei é válido, mas o seu código o consideraria inválido, pois ele verifica apenas se o CPF inteiro está na lista de CPFs repetidos.

Uma maneira de melhorar a validação seria verificar se os dígitos verificadores do CPF estão corretos, em vez de apenas comparar o CPF completo com uma lista fixa de CPFs repetidos. Para fazer isso, você já tem uma função checaDigitoVerificador que calcula os dígitos verificadores do CPF. Você pode usá-la para verificar se os dígitos verificadores são válidos.

Aqui está um exemplo de como você pode aprimorar seu código para verificar CPFs com dígitos repetidos:

function checaCPF(cpf) {
    if (cpf.length !== 11) {
        return false; // CPF deve ter 11 dígitos
    }

    // Verifica se todos os dígitos são iguais
    if (/^(\d)\1{10}$/.test(cpf)) {
        return false;
    }

    // Calcula e verifica os dígitos verificadores
    return checaEstruturaCPF(cpf);
}

Neste código, a função checaCPF primeiro verifica se o CPF tem 11 dígitos e, em seguida, usa uma expressão regular (/^(\d)\1{10}$/) para verificar se todos os dígitos são iguais. Se todos os dígitos forem iguais, o CPF é considerado inválido. Caso contrário, ele chama a função checaEstruturaCPF para verificar os dígitos verificadores, mantendo a lógica que você já possui.

Essa abordagem é mais flexível e eficaz na validação de CPFs com dígitos repetidos. Além disso, é uma implementação mais genérica e menos sujeita a erros, uma vez que não depende de uma lista fixa de CPFs repetidos.

Um abraço e bons estudos.