Olá, A validação de CPF mostrada não trata o caso da soma ser um número múliplo de 11, pois "11 - (soma%11)" retornaria 11, porém a comparação é feita por dígito. E como exemplo o CPF 010.000.001-09 conforme a validação apresentada é inválido, porém comparando em diversos validadores online ele é válido. Segue abaixo o código para validação:
function checaDigitoVerificadorCPF(cpf, multiplicador) {
if(multiplicador>=12){
return true
}
let multiplicadorInicial = multiplicador
let soma = 0
let contador = 0
const cpfSemDigitos = cpf.substr(0, multiplicador - 1).split('')
const digitoVerificador = cpf.charAt(multiplicador - 1)
for(; multiplicadorInicial > 1 ; multiplicadorInicial--) {
soma = soma + cpfSemDigitos[contador] * multiplicadorInicial
contador++
}
if(digitoVerificador == confirmaDigito(soma)){
return checaDigitoVerificadorCPF(cpf,multiplicador+1)
}
return false
}
function confirmaDigito(soma){
return 11 - (soma%11)
}
function checaEstruturaCPF(cpf){
const multiplicador = 10
return checaDigitoVerificadorCPF(cpf,multiplicador)
}
let cpf = "01000000109"
const resultado = checaEstruturaCPF(cpf)
console.log(resultado)
Eu acredito que para que a validação se torne adequada seria preciso realizar um dos seguintes procedimentos:
- Utilizar a fórmula apresentada aqui (tópico Cálculo do dígito verificador),
- Substituir "11 - (soma%11)" por "(soma*10)%11",
- Retornar 0 na função "confirmaDigito" quando "soma%11" for igual a 0 .