2
respostas

Não funciona com qualquer CPF mesmo válido

Fiz exatamente como o instrutor, e porém ao incluir o MEU CPF para testar, não funcionou.

Fui na internet em um gerador de CPF e alguns funcionam e outros não... Peguei na aula seguinte o projeto dessa, e ainda assim não funciona...

export function valida(input) { const tipoDeInput = input.dataset.tipo

if(validadores[tipoDeInput]) {
    validadores[tipoDeInput](input)
}

if(input.validity.valid) {
    input.parentElement.classList.remove('input-container--invalido')
    input.parentElement.querySelector('.input-mensagem-erro').innerHTML = ''
} else {
    input.parentElement.classList.add('input-container--invalido')
    input.parentElement.querySelector('.input-mensagem-erro').innerHTML = mostraMensagemDeErro(tipoDeInput, input)
}

}

const tiposDeErro = [ 'valueMissing', 'typeMismatch', 'patternMismatch', 'customError' ]

const mensagensDeErro = { nome: { valueMissing: 'O campo de nome não pode estar vazio.' }, email: { valueMissing: 'O campo de email não pode estar vazio.', typeMismatch: 'O email digitado não é válido.' }, senha: { valueMissing: 'O campo de senha não pode estar vazio.', patternMismatch: 'A senha deve conter entre 6 a 12 caracteres, deve conter pelo menos uma letra maiúscula, um número e não deve conter símbolos.' }, dataNascimento: { valueMissing: 'O campo de data de nascimento não pode estar vazio.', customError: 'Você deve ser maior que 18 anos para se cadastrar.' }, cpf: { valueMissing: 'O campo de CPF não pode estar vazio.', customError: 'O CPF digitado não é válido.' } }

const validadores = { dataNascimento:input => validaDataNascimento(input), cpf:input => validaCPF(input) }

function mostraMensagemDeErro(tipoDeInput, input) { let mensagem = '' tiposDeErro.forEach(erro => { if(input.validity[erro]) { mensagem = mensagensDeErro[tipoDeInput][erro] } })

return mensagem

}

function validaDataNascimento(input) { const dataRecebida = new Date(input.value) let mensagem = ''

if(!maiorQue18(dataRecebida)) {
    mensagem = 'Você deve ser maior que 18 anos para se cadastrar.'
}

input.setCustomValidity(mensagem)

}

function maiorQue18(data) { const dataAtual = new Date() const dataMais18 = new Date(data.getUTCFullYear() + 18, data.getUTCMonth(), data.getUTCDate())

return dataMais18 <= dataAtual

}

function validaCPF(input) { const cpfFormatado = input.value.replace(/\D/g, '') let mensagem = ''

if(!checaCPFRepetido(cpfFormatado) || !checaEstruturaCPF(cpfFormatado)) {
    mensagem = 'O CPF digitado não é válido.'
}

input.setCustomValidity(mensagem)

}

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
let soma = 0
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) }

// 123 456 789 09

// let soma = (11 * 1) + (10 * 2) + (9 * 3) ... (2 * 0)

// let digitoVerificador = 11 - (soma % 11)

2 respostas

Opa, baseado num problema parecido de outro curso da Alura cheguei a uma forma de resolver esse problema. Como um colega citou: "Faltou a lógica nos casos em que o resto da divisão para verificação dos dígitos resulta em 10 ou 11. Nestes casos o resto se torna 0, para verificar corretamente os dígitos"

Ajustei a lógica pra funcionar nesse código, ficou assim:

function confirmaDigito(soma) {
    let resto = 11 - (soma % 11);
    if (resto === 10 || resto === 11) resto = 0;
    return resto;
}

O problema original está nesse link: https://cursos.alura.com.br/forum/topico-faltou-implementar-uma-logica-127996

Funcionou pra mim e espero que funcione pra você também! Boa sorte!

Também estava com o mesmo problema, a solução do Luís funcionou aqui também, valeu Luís!