Skip to content

Instantly share code, notes, and snippets.

@bernardoadc
Last active October 30, 2020 18:21
Show Gist options
  • Save bernardoadc/072b301ac343e84c2b2b0d5d964c6ec4 to your computer and use it in GitHub Desktop.
Save bernardoadc/072b301ac343e84c2b2b0d5d964c6ec4 to your computer and use it in GitHub Desktop.
Calculo geral de DVs
function DV (sequencial, incluirOriginalComSep = false, { SeAcimaDez = '0123456789', modulo = 11, mult = 10, restoVsFalta = false, fatores = '98765432' } = {}) {
if (parseInt(sequencial) != Number(sequencial)) throw new Error('Sequencial não é número válido')
sequencial = String(sequencial)
fatores = fatores.repeat(sequencial.length / 8 + 1).slice(-sequencial.length)
const soma = sequencial.split('').reduce(function (s, v, i) {
return (s += Number(v) * Number(fatores[i]))
}, 0)
let resto = (soma * mult) % modulo
if (restoVsFalta) resto = restoVsFalta - resto // em modulo 10, 10 - (soma % modulo)
let DV
if (resto >= 10) DV = '' + ((incluirOriginalComSep !== false) ? sequencial + incluirOriginalComSep : '') + SeAcimaDez[resto - 10]
else DV = '' + ((incluirOriginalComSep !== false) ? sequencial + incluirOriginalComSep : '') + resto
return DV
}
export default {
DV,
modulo11: (sequencial, incluirOriginalComSep, SeAcimaDez) => DV(sequencial, incluirOriginalComSep, {
SeAcimaDez: SeAcimaDez,
modulo: 11,
mult: 10,
restoVsFalta: 0
}),
modulo10: (sequencial, incluirOriginalComSep) => DV(sequencial, incluirOriginalComSep, {
SeAcimaDez: '0',
modulo: 10,
mult: 10,
restoVsFalta: 10
}),
modulo97: (sequencial, incluirOriginalComSep) => DV(sequencial, incluirOriginalComSep, {
SeAcimaDez: '?',
modulo: 97,
mult: 100,
restoVsFalta: 98,
fatores: '1'
})
}

podia somar + 1 antes, evitando 0110=110 *b-1 ou nao OU divisao ou subtr (subtr = *(b-1) e aih mod b) tem tb subtr sem *b-1

e calculos recorrentes (CPF)? acho q deixa fora neh.. pq pode ser de numero todo ou apenas parte dele. se fosse soh de todo, ate daria pra pensar, se nao usar 2 sistemas distintos. ficaria modulo11(x) + modulo11(modulo11(x)). Um param recorrencia? tem forma simples disso direto?

fatores de CPF nao repetem! vai de 11 a 2. fator max? aí de novo cresc ou decresc.. ou []?

30/10/2020 podia tb aceitar um formatador.. q se aplica pro final ex: '-#' pra incluir dv com '-' '-##' pra incluir dv de 2 digitos com '-' '###.###.###-##' pra CPF talvez opçao de slice -tam mascara. no caso de cpf funfa, no caso de dv simples nao precisa

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment