Guia de migração para o CNPJ alfanumérico
Desde julho de 2026, novos CNPJs podem ter letras nas 12 primeiras posições (IN RFB nº 2.229/2024). Os CNPJs numéricos continuam válidos, então os sistemas precisam aceitar os dois formatos ao mesmo tempo. Use o checklist abaixo para mapear os pontos de impacto e o código pronto para atualizar a validação.
Checklist de adequação
Banco de dados
- Trocar colunas numéricas (BIGINT, NUMERIC, INTEGER) por texto de 14 posições (CHAR(14)/VARCHAR(14)).
- Garantir zeros à esquerda: CNPJs numéricos migrados de colunas numéricas perdem os zeros iniciais.
- Revisar índices, chaves estrangeiras e constraints que dependem do tipo numérico.
- Definir collation/ordenação: em texto, números vêm antes das letras (0-9 < A-Z).
Validação e regras de negócio
- Substituir regex como \d{14} ou [0-9]{14} por [A-Z0-9]{12}[0-9]{2}.
- Atualizar o cálculo do DV para usar ASCII − 48 (funciona para os dois formatos).
- Normalizar para maiúsculas antes de validar, comparar e armazenar.
- Revisar conversões para número (parseInt, Number, Long.parseLong) em qualquer ponto do fluxo.
Interface (front-end)
- Máscaras de campo devem aceitar letras nas 12 primeiras posições (ex: XX.XXX.XXX/XXXX-XX).
- Remover inputmode="numeric" e type="number" dos campos de CNPJ.
- Converter para maiúsculas durante a digitação ou ao sair do campo.
APIs e integrações
- Tipar o CNPJ como string nos contratos (OpenAPI/JSON Schema), nunca como number.
- Revisar arquivos posicionais (CNAB, layouts de remessa/retorno) com campos numéricos.
- Comunicar parceiros e testar integrações Open Finance e Pix com CNPJs alfanuméricos.
Dados, relatórios e planilhas
- Excel converte CNPJ numérico para número (perde zeros ou vira notação científica): importar como texto.
- Revisar ETLs, dashboards e relatórios que fazem cast do CNPJ para número.
- Sanear a base atual: use a validação em lote para encontrar registros inválidos.
Testes (QA)
- Incluir CNPJs alfanuméricos válidos e inválidos nos cenários de teste (use o gerador).
- Testar letras minúsculas, máscaras diferentes e o DV incorreto.
- Testar convivência: cadastros antigos numéricos e novos alfanuméricos no mesmo fluxo.
Código de validação (numérico e alfanumérico)
Mesma regra em todas as linguagens: remove a máscara, converte para maiúsculas, exige [A-Z0-9]{12}[0-9]{2}, rejeita as 12 primeiras posições com o mesmo caractere e compara os DVs calculados com ASCII − 48 e Módulo 11.
const PESOS_DV1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
const PESOS_DV2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
function calcularDv(base, pesos) {
const soma = pesos.reduce((acc, peso, i) => acc + (base.charCodeAt(i) - 48) * peso, 0);
const resto = soma % 11;
return resto < 2 ? 0 : 11 - resto;
}
function validarCnpj(valor) {
const cnpj = String(valor ?? '').replace(/[./\-\s]/g, '').toUpperCase();
if (!/^[A-Z0-9]{12}[0-9]{2}$/.test(cnpj)) return false;
if (/^(.)\1{11}/.test(cnpj)) return false; // raiz+ordem com o mesmo caractere
return cnpj.endsWith(String(calcularDv(cnpj, PESOS_DV1)) + calcularDv(cnpj, PESOS_DV2));
}Expressões regulares
Sem máscara
^[A-Z0-9]{12}[0-9]{2}$Com máscara
^[A-Z0-9]{2}\.[A-Z0-9]{3}\.[A-Z0-9]{3}/[A-Z0-9]{4}-[0-9]{2}$Com ou sem máscara
^[A-Z0-9]{2}\.?[A-Z0-9]{3}\.?[A-Z0-9]{3}/?[A-Z0-9]{4}-?[0-9]{2}$A regex só confere o formato. Sempre valide também os dígitos verificadores.