Validador do Novo CNPJ Alfanumérico em JavaScript

E

Edivan Carvalho

Guest


A Receita Federal do Brasil publicou a Instrução Normativa 2229 de 15 de outubro de 2024 que modifica a regra de formação do CNPJ no Brasil.

Essa ação visa ampliar a capacidade de geração de números de CNPJ para abertura de empresas devido ao esgotamento da modelagem atual.

A repercussão dessa mudança afeta milhares de sistemas, e não será diferente com os sistemas de faturamento e emissão de documentos fiscais eletrônicos e seus respectivos ambientes de autorização mantidos pelas Administrações Tributárias.

Referência oficial:

Estrutura do novo CNPJ​

  • O CNPJ alfanumérico continua com 14 posições.
  • As 8 primeiras posições são a raiz (alfanuméricas).
  • As 4 posições seguintes são a ordem (alfanuméricas).
  • As 2 últimas posições continuam sendo os dígitos verificadores (numéricos).

O cálculo do DV (Dígito Verificador) segue o módulo 11, mas agora cada caractere é convertido em número com a regra:


Code:
valor = ASCII - 48

Exemplos:

  • "0" → 0
  • "9" → 9
  • "A" → 17
  • "B" → 18
  • "Z" → 42

Código em JavaScript​


Code:
class CNPJ {
  static tamanhoCNPJSemDV = 12;
  static regexCNPJSemDV = /^([A-Z\d]){12}$/;
  static regexCNPJ = /^([A-Z\d]){12}(\d){2}$/;
  static regexCaracteresMascara = /[./-]/g;
  static cnpjZerado = "00000000000000";
  static pesosDV = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];

  static isValid(cnpj) {
    let cnpjSemMascara = this.removeMascaraCNPJ(cnpj).toUpperCase();

    if (this.regexCNPJ.test(cnpjSemMascara) && cnpjSemMascara !== this.cnpjZerado) {
      const dvInformado = cnpjSemMascara.substring(this.tamanhoCNPJSemDV);
      const dvCalculado = this.calculaDV(cnpjSemMascara.substring(0, this.tamanhoCNPJSemDV));
      return dvInformado === dvCalculado;
    }
    return false;
  }

  static calculaDV(cnpj) {
    let cnpjSemMascara = this.removeMascaraCNPJ(cnpj).toUpperCase();

    if (this.regexCNPJSemDV.test(cnpjSemMascara) &&
        cnpjSemMascara !== this.cnpjZerado.substring(0, this.tamanhoCNPJSemDV)) {

      let somatorioDV1 = 0;
      let somatorioDV2 = 0;

      for (let i = 0; i < this.tamanhoCNPJSemDV; i++) {
        const asciiDigito = cnpjSemMascara.charCodeAt(i) - 48; // regra oficial
        somatorioDV1 += asciiDigito * this.pesosDV[i + 1];
        somatorioDV2 += asciiDigito * this.pesosDV[i];
      }

      const dv1 = somatorioDV1 % 11 < 2 ? 0 : 11 - (somatorioDV1 % 11);
      somatorioDV2 += dv1 * this.pesosDV[this.tamanhoCNPJSemDV];
      const dv2 = somatorioDV2 % 11 < 2 ? 0 : 11 - (somatorioDV2 % 11);

      return `${dv1}${dv2}`;
    }

    throw new Error("Não é possível calcular o DV pois o CNPJ fornecido é inválido");
  }

  static removeMascaraCNPJ(cnpj) {
    return cnpj.replace(this.regexCaracteresMascara, "");
  }
}

Exemplo de uso​


Code:
const raiz = "A1B2C3D4E5F6"; // 12 primeiros caracteres
const dv = CNPJ.calculaDV(raiz);

console.log(`DV calculado: ${dv}`);

const cnpjCompleto = raiz + dv;
console.log(`CNPJ completo: ${cnpjCompleto}`);
console.log(`É válido? ${CNPJ.isValid(cnpjCompleto)}`);

Saída esperada (exemplo fictício):


Code:
DV calculado: 12
CNPJ completo: A1B2C3D4E5F612
É válido? true

Espero que tenha gostado, agora você já tem um validador pronto em JavaScript para o novo CNPJ alfanumérico.

Continue reading...
 


Join 𝕋𝕄𝕋 on Telegram
Channel PREVIEW:
Back
Top