UNPKG

doc-br

Version:

Validação de documentos brasileiros para facilitar o desenvolvimento

106 lines (105 loc) 3.19 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const Validators_1 = require("./Validators"); class CnpjValidator extends Validators_1.Validators { /** * @param {string} parameter - CNPJ que deve ser validado. Caso você queria apenas gerar um CNPJ, esse campo pode ser deixado vazio */ constructor(parameter) { super(); this.parameter = parameter; } asyncRun() { throw new Error('Método não implementado para esse validator'); } /** * @return {string} - Gera número de CNPJ falso. No entanto, pode passa por qualquer validador. */ falsify() { return { res: this.generate() }; } /** * @return {Sucesso | Erro} - Verifica a validade de qualquer CNPJ. O CNPJ deve estar no formato com ou sem mascara. */ run() { if (!this.parameter) { return { mensagem: 'Cnpj invalido X' }; } if (!(this.parameter.length >= 14 || this.parameter.length <= 18)) { return { mensagem: 'Cnpj invalido Y' }; } const numbers = this.parameter.replaceAll(/[.,/-]/g, '').split('').map(e => parseInt(e)); const items = new Set(numbers); if (items.size === 1) { return { mensagem: 'Cnpj invalido' }; } 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; }; const digits = numbers.slice(12); const digit0 = calc(12); if (digit0 !== digits[0]) { return { mensagem: 'Cnpj invalido' }; } const digit1 = calc(13); return { mensagem: 'Cnpj valido' }; } gerenateSeed(x) { return Math.round(Math.random() * x); } round(x, y) { return Math.round(x - Math.floor(x / y) * y); } sum(x) { return x.slice().reverse().reduce((e, i, a) => { if (a > 7) { return (a - 6) * i + e; } return (a + 2) * i + e; }, 0); } generate() { let numbers = []; while (numbers.length < 8) { numbers[numbers.length] = this.gerenateSeed(9); } while (numbers.length < 14) { let last = 11 - this.round(this.sum(numbers), 11); if (numbers.length == 8 || numbers.length == 9 || numbers.length == 10) { last = 0; } if (numbers.length == 11) { last = 1; } if (last > 9) { last = 0; } numbers[numbers.length] = last; } const result = numbers.join(''); return result; } } exports.default = CnpjValidator;