Skip to content

Instantly share code, notes, and snippets.

@FeMaffezzolli
Forked from alexbruno/valid.cnpj.ts
Last active September 12, 2020 14:32
Show Gist options
  • Save FeMaffezzolli/4af131a6d33de28b97adaac22c193757 to your computer and use it in GitHub Desktop.
Save FeMaffezzolli/4af131a6d33de28b97adaac22c193757 to your computer and use it in GitHub Desktop.
Validação de CNPJ
export function cnpjValidation(value) {
if (!value) return false
// Aceita receber o valor como string, número ou array com todos os dígitos
const validTypes =
typeof value === 'string' || Number.isInteger(value) || Array.isArray(value)
// Elimina valor não em formato inválido
if (!validTypes) return false
// Guarda um array com todos os dígitos do valor
const numbers = value.toString().match(/\d/g).map(Number)
// Valida a quantidade de dígitos
if (numbers.length !== 14) return false
// Elimina inválidos com todos os dígitos iguais
const items = [...new Set(numbers)]
if (items.length === 1) return false
// Cálculo validador
const calc = (x) => {
const slice = numbers.slice(0, x)
let factor = x - 7
let sum = 0
for (let i = x; i >= 1; i--) {
const n = slice[x - i]
sum += n * factor--
if (factor < 2) factor = 9
}
const result = 11 - (sum % 11)
return result > 9 ? 0 : result
}
// Separa os 2 últimos dígitos de verificadores
const digits = numbers.slice(12)
// Valida 1o. dígito verificador
const digit0 = calc(12)
if (digit0 !== digits[0]) return false
// Valida 2o. dígito verificador
const digit1 = calc(13)
return digit1 === digits[1]
}
// Referência: https://pt.wikipedia.org/wiki/Cadastro_Nacional_da_Pessoa_Jur%C3%ADdica
@alexbruno
Copy link

Atualizei o script para um código mais moderno e aderente às boas práticas JS atuais.
Fique à vontade para atualizar o seu também.
Aproveitei e fiz um de CPF que também é muito útil.

@FeMaffezzolli
Copy link
Author

Atualizei o script para um código mais moderno e aderente às boas práticas JS atuais.
Fique à vontade para atualizar o seu também.
Aproveitei e fiz um de CPF que também é muito útil.

Valeu por avisar meu caro! De fato ficou muito massa. Abraço!

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