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:
- Nota Técnica DFe Conjunta - CNPJ Alfanumérico v1.00
- Documento em PDF da Nota Técnica DFe Conjunta - CNPJ Alfanumérico v1.00
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:
valor = ASCII - 48
Exemplos:
-
"0"
→ 0 -
"9"
→ 9 -
"A"
→ 17 -
"B"
→ 18 -
"Z"
→ 42
Código em JavaScript
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
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):
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.
Top comments (0)