Skip to content

Latest commit

 

History

History
144 lines (93 loc) · 4.8 KB

File metadata and controls

144 lines (93 loc) · 4.8 KB

Especificação do Algoritmo — CNPJ Alfanumérico

Este documento descreve o algoritmo canônico para validação e geração do CNPJ Alfanumérico conforme a Instrução Normativa RFB nº 2.229/2024. Ele serve como referência única para todas as implementações deste monorepo.


Formato

Um CNPJ tem sempre 14 caracteres sem máscara, divididos em:

Parte Posições Conteúdo
Raiz 1–8 A–Z e 0–9
Ordem 9–12 A–Z e 0–9
Dígitos verificadores 13–14 Sempre 0–9 (numéricos)

A máscara de exibição é: XX.XXX.XXX/XXXX-DD


Etapas de validação

1. Normalização

Remover todos os caracteres que não sejam letras ou dígitos e converter para maiúsculas:

"12.abc.345/01ab-77"  →  "12ABC34501AB77"

2. Verificação de comprimento

O resultado normalizado deve ter exatamente 14 caracteres. Qualquer outro comprimento é inválido.

3. Rejeição de sequências uniformes

Se todos os 14 caracteres forem iguais (ex: "00000000000000", "AAAAAAAAAAAAAA"), o CNPJ é inválido. Essa regra existe porque algumas sequências uniformes passariam pela verificação de dígitos por coincidência matemática (ex: todos zeros).

4. Conversão de caracteres para valor numérico

Cada caractere é convertido subtraindo 48 do seu código ASCII:

Caractere Código ASCII Valor numérico
'0' 48 0
'9' 57 9
'A' 65 17
'B' 66 18
'Z' 90 42

Em código: valor = charCode(c) - 48

5. Cálculo do 1º dígito verificador

  1. Tome os 12 primeiros caracteres (base)
  2. Multiplique cada caractere pelo peso correspondente:
Posição 1 2 3 4 5 6 7 8 9 10 11 12
Peso 5 4 3 2 9 8 7 6 5 4 3 2
  1. Some todos os produtos
  2. Calcule resto = soma % 11
  3. Se resto < 2d1 = 0; caso contrário → d1 = 11 - resto

6. Cálculo do 2º dígito verificador

  1. Forme uma string de 13 caracteres: base + d1 (o dígito calculado acima, como caractere numérico)
  2. Multiplique cada caractere pelo peso correspondente:
Posição 1 2 3 4 5 6 7 8 9 10 11 12 13
Peso 6 5 4 3 2 9 8 7 6 5 4 3 2
  1. Some todos os produtos
  2. Calcule resto = soma % 11
  3. Mesma regra: d2 = (resto < 2) ? 0 : 11 - resto

7. Verificação final

O CNPJ é válido se e somente se os dois últimos caracteres do CNPJ normalizado forem iguais a d1 e d2 respectivamente:

cnpj_normalizado[12] == d1  &&  cnpj_normalizado[13] == d2

Algoritmo do gerador

Para gerar um CNPJ válido aleatório:

  1. Sortear 12 caracteres aleatórios do alfabeto [A-Z0-9]
  2. Rejeitar e repetir se todos os 12 caracteres forem iguais
  3. Calcular d1 e d2 conforme as etapas 5 e 6 acima
  4. Retornar a concatenação base + d1 + d2 (14 caracteres normalizados)

O CNPJ gerado é garantidamente válido pois os dígitos são calculados — não sorteados.


Exemplo passo a passo

Entrada: "12.ABC.345/01AB-77"

Passo 1 — Normalização: "12ABC34501AB77"

Passo 2 — Comprimento: 14 ✓

Passo 3 — Sequência uniforme: não ✓

Passo 4 — Base: "12ABC34501AB" (12 chars)

Passo 5 — 1º dígito:

Char Valor Peso Produto
1 1 5 5
2 2 4 8
A 17 3 51
B 18 2 36
C 19 9 171
3 3 8 24
4 4 7 28
5 5 6 30
0 0 5 0
1 1 4 4
A 17 3 51
B 18 2 36

Soma = 444 · Resto = 444 % 11 = 4 · d1 = 11 - 4 = 7

Passo 6 — 2º dígito (base "12ABC34501AB7"):

Soma = 411 · Resto = 411 % 11 = 4 · d2 = 11 - 4 = 7

Resultado: cnpj[12..13] == "77"válido


Referências