Pular para o conteúdo
CNPJ Alfa Toolkit

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.

Ferramentas para a migração