logotipo Blog Giovani Da Cruz
Informativo

Desvendando o Algoritmo de Geração de CNPJ: Uma Perspectiva Profunda

9 min de leitura · publicado em 03/03/2024 282 visualizações

algoritmo de geração de CNPJ

Como Funciona o Algoritmo de Geração e Validação de CNPJ (Guia Completo)

Olá pessoal!

Neste artigo vamos entender como funciona o algoritmo de geração e validação de CNPJ, incluindo o cálculo dos dígitos verificadores, a estrutura do documento e as mudanças trazidas pelo novo CNPJ alfanumérico.

Se você é programador, analista de sistemas, estudante ou trabalha com integrações fiscais, compreender esse algoritmo pode ajudar bastante no desenvolvimento de sistemas e validações cadastrais.

 

Ferramentas Relacionadas

 

O que é o CNPJ?

O CNPJ (Cadastro Nacional da Pessoa Jurídica) é o identificador oficial utilizado pela Receita Federal para registrar empresas e demais pessoas jurídicas no Brasil.

Assim como o CPF identifica uma pessoa física, o CNPJ identifica uma empresa perante órgãos governamentais, instituições financeiras, fornecedores e clientes.

Praticamente toda empresa brasileira possui um número de CNPJ, utilizado em contratos, emissão de notas fiscais, abertura de contas bancárias e obrigações tributárias.

 

Estrutura do CNPJ

Tradicionalmente, o CNPJ possui 14 posições.

Exemplo:

12.345.678/0001-95

Onde:

  • 12.345.678 → Raiz da empresa;
  • 0001 → Identificação da matriz ou filial;
  • 95 → Dígitos verificadores.

Os dois últimos números são calculados matematicamente através do algoritmo oficial de validação de CNPJ.

 

O que são os Dígitos Verificadores?

Os dígitos verificadores (DV) são os dois últimos caracteres do CNPJ.

Eles servem para reduzir erros de digitação e aumentar a confiabilidade dos cadastros.

Quando um sistema valida um CNPJ, ele recalcula os dígitos verificadores e compara o resultado com os dígitos informados.

Se os valores não coincidirem, o CNPJ é considerado inválido.

 

Como Funciona o Algoritmo de Validação de CNPJ?

O algoritmo utiliza o método conhecido como Módulo 11.

O processo consiste em:

  1. Multiplicar cada posição por uma sequência específica de pesos;
  2. Somar todos os resultados;
  3. Calcular o resto da divisão por 11;
  4. Determinar o dígito verificador conforme a regra oficial.

O primeiro dígito é calculado utilizando os 12 primeiros caracteres do documento.

O segundo dígito é calculado utilizando os 12 caracteres originais mais o primeiro dígito verificador encontrado.

Esse processo garante que erros simples de digitação sejam facilmente detectados.

 

Exemplo Simplificado do Cálculo

Considere o CNPJ base:

12.345.678/0001

Os 12 primeiros números são multiplicados por uma sequência de pesos predeterminada.

Após realizar a soma dos produtos, aplica-se a regra do módulo 11 para obter o primeiro dígito verificador.

Em seguida, o processo é repetido para encontrar o segundo dígito.

Embora o cálculo seja relativamente simples para computadores, ele se torna trabalhoso manualmente, motivo pelo qual normalmente utilizamos bibliotecas ou funções específicas para validação.

 

O Novo CNPJ Alfanumérico

Para ampliar a quantidade de combinações disponíveis, a Receita Federal definiu um novo padrão conhecido como CNPJ Alfanumérico.

Nesse modelo, determinadas posições podem conter letras além dos números.

O objetivo é garantir a continuidade do sistema de identificação das empresas brasileiras sem alterar a quantidade total de caracteres do documento.

Com essa mudança, sistemas, ERPs, CRMs, APIs e bancos de dados precisarão ser adaptados para aceitar letras no CNPJ.

Além disso, o cálculo dos dígitos verificadores também precisou ser atualizado para suportar caracteres alfanuméricos.

 

Por Que Desenvolvedores Precisam Conhecer Esse Algoritmo?

O algoritmo de validação de CNPJ é amplamente utilizado em:

  • Sistemas ERP;
  • Sistemas financeiros;
  • Emissão de notas fiscais;
  • Integrações bancárias;
  • Cadastros de clientes e fornecedores;
  • APIs de consulta cadastral;
  • Softwares de gestão empresarial.

Conhecer esse algoritmo ajuda a reduzir erros de cadastro, melhorar a qualidade dos dados e evitar inconsistências em integrações.

 

Exemplos de Código para Geração de CNPJ

Abaixo você encontra exemplos práticos em diferentes linguagens de programação para gerar e validar CNPJs.
Exemplo em JavaScript (CNPJ Alfanumérico)

const CARACTERES = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

/**
 * Converte um caractere para o valor utilizado
 * no cálculo do CNPJ Alfanumérico.
 *
 * Receita Federal:
 * valor = código ASCII - 48
 */
function valorCaracter(caractere) {
    return caractere.charCodeAt(0) - 48;
}

/**
 * Calcula um dígito verificador.
 */
function calcularDV(base, pesos) {

    let soma = 0;

    for (let i = 0; i < base.length; i++) {
        soma += valorCaracter(base[i]) * pesos[i];
    }

    const resto = soma % 11;

    return (resto < 2) ? 0 : 11 - resto;
}

/**
 * Gera um CNPJ Alfanumérico.
 */
function gerarCNPJAlfanumerico() {

    let base = '';

    // Gera os 8 primeiros caracteres
    for (let i = 0; i < 8; i++) {
        base += CARACTERES[
            Math.floor(Math.random() * CARACTERES.length)
        ];
    }

    // Matriz padrão
    base += '0001';

    const pesosDV1 =
        [5,4,3,2,9,8,7,6,5,4,3,2];

    const dv1 =
        calcularDV(base, pesosDV1);

    const pesosDV2 =
        [6,5,4,3,2,9,8,7,6,5,4,3,2];

    const dv2 =
        calcularDV(base + dv1, pesosDV2);

    return formatarCNPJ(base + dv1 + dv2);
}

/**
 * Formata o CNPJ.
 */
function formatarCNPJ(cnpj) {

    return cnpj.replace(
        /^(.{2})(.{3})(.{3})(.{4})(\d{2})$/,
        '$1.$2.$3/$4-$5'
    );
}

// Exemplo de utilização
const cnpj = gerarCNPJAlfanumerico();

console.log('CNPJ Gerado:', cnpj);

O exemplo acima demonstra como gerar um CNPJ Alfanumérico utilizando JavaScript.
O algoritmo segue a mesma lógica de cálculo dos dígitos verificadores utilizada pelo CNPJ tradicional, porém considerando a conversão dos caracteres alfanuméricos para seus respectivos valores durante o cálculo.

Esse tipo de implementação é bastante útil em sistemas ERP, aplicações financeiras, plataformas de emissão fiscal, testes automatizados e processos de homologação.

Exemplo em Go (CNPJ Alfanumérico)

package main

import (
	"fmt"
	"math/rand"
	"time"
)

const caracteres = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

// Converte um caractere para o valor utilizado
// no cálculo do CNPJ Alfanumérico.
// Receita Federal: ASCII - 48
func valorCaracter(c byte) int {
	return int(c) - 48
}

// Calcula um dígito verificador.
func calcularDV(base string, pesos []int) int {

	soma := 0

	for i := 0; i < len(base); i++ {
		soma += valorCaracter(base[i]) * pesos[i]
	}

	resto := soma % 11

	if resto < 2 {
		return 0
	}

	return 11 - resto
}

// Formata o CNPJ.
func formatarCNPJ(cnpj string) string {

	return fmt.Sprintf(
		"%s.%s.%s/%s-%s",
		cnpj[0:2],
		cnpj[2:5],
		cnpj[5:8],
		cnpj[8:12],
		cnpj[12:14],
	)
}

// Gera um CNPJ Alfanumérico.
func gerarCNPJAlfanumerico() string {

	rand.Seed(time.Now().UnixNano())

	base := ""

	// Gera os 8 primeiros caracteres
	for i := 0; i < 8; i++ {
		base += string(
			caracteres[rand.Intn(len(caracteres))],
		)
	}

	// Matriz padrão
	base += "0001"

	pesosDV1 := []int{
		5, 4, 3, 2,
		9, 8, 7, 6,
		5, 4, 3, 2,
	}

	dv1 := calcularDV(base, pesosDV1)

	pesosDV2 := []int{
		6, 5, 4, 3, 2,
		9, 8, 7, 6,
		5, 4, 3, 2,
	}

	dv2 := calcularDV(
		base+fmt.Sprintf("%d", dv1),
		pesosDV2,
	)

	cnpj := fmt.Sprintf(
		"%s%d%d",
		base,
		dv1,
		dv2,
	)

	return formatarCNPJ(cnpj)
}

func main() {

	cnpj := gerarCNPJAlfanumerico()

	fmt.Println("CNPJ Gerado:", cnpj)
}

Este exemplo demonstra a geração de um CNPJ Alfanumérico utilizando Go (Golang).
A implementação utiliza os pesos oficiais para cálculo dos dígitos verificadores e converte os caracteres alfanuméricos para seus respectivos valores conforme a regra definida pela Receita Federal.

Esse tipo de código pode ser utilizado em sistemas ERP, APIs, testes automatizados, aplicações financeiras e processos de homologação que necessitem gerar documentos válidos para desenvolvimento e testes.

Exemplo em PHP (CNPJ Alfanumérico)

<?php

const CARACTERES = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

/**
 * Converte um caractere para o valor utilizado
 * no cálculo do CNPJ Alfanumérico.
 *
 * Receita Federal:
 * valor = ASCII - 48
 */
function valorCaracter(string $caractere): int
{
    return ord($caractere) - 48;
}

/**
 * Calcula um dígito verificador.
 */
function calcularDV(string $base, array $pesos): int
{
    $soma = 0;

    for ($i = 0; $i < strlen($base); $i++) {
        $soma += valorCaracter($base[$i]) * $pesos[$i];
    }

    $resto = $soma % 11;

    return ($resto < 2) ? 0 : 11 - $resto;
}

/**
 * Formata o CNPJ.
 */
function formatarCNPJ(string $cnpj): string
{
    return preg_replace(
        '/^(.{2})(.{3})(.{3})(.{4})(\d{2})$/',
        '$1.$2.$3/$4-$5',
        $cnpj
    );
}

/**
 * Gera um CNPJ Alfanumérico.
 */
function gerarCNPJAlfanumerico(): string
{
    $base = '';

    // Gera os 8 primeiros caracteres
    for ($i = 0; $i < 8; $i++) {
        $base .= CARACTERES[random_int(
            0,
            strlen(CARACTERES) - 1
        )];
    }

    // Matriz padrão
    $base .= '0001';

    $pesosDV1 = [
        5,4,3,2,
        9,8,7,6,
        5,4,3,2
    ];

    $dv1 = calcularDV(
        $base,
        $pesosDV1
    );

    $pesosDV2 = [
        6,5,4,3,2,
        9,8,7,6,
        5,4,3,2
    ];

    $dv2 = calcularDV(
        $base . $dv1,
        $pesosDV2
    );

    return formatarCNPJ(
        $base . $dv1 . $dv2
    );
}

// Exemplo de utilização
$cnpj = gerarCNPJAlfanumerico();

echo 'CNPJ Gerado: ' . $cnpj;

?>

Este exemplo demonstra como gerar um CNPJ Alfanumérico utilizando PHP. A implementação segue a lógica oficial de cálculo dos dígitos verificadores, aplicando os pesos definidos para o algoritmo do CNPJ e realizando a conversão dos caracteres alfanuméricos durante o processamento.

O código pode ser adaptado para sistemas ERP, plataformas de emissão fiscal, APIs de integração, aplicações financeiras e ambientes de testes que necessitem gerar documentos válidos para homologação.

 

Perguntas Frequentes (FAQ)

Como saber se um CNPJ é válido?

Basta recalcular os dígitos verificadores utilizando o algoritmo oficial e comparar com os dígitos informados.

Um CNPJ válido significa que a empresa existe?

Não. Um CNPJ pode ser matematicamente válido e não estar cadastrado na Receita Federal.

Os CNPJs gerados pertencem a empresas reais?

Não necessariamente. Geradores de CNPJ normalmente criam apenas números válidos do ponto de vista matemático.

O que muda com o CNPJ alfanumérico?

O novo padrão permite a utilização de letras em determinadas posições do documento, ampliando a quantidade de combinações disponíveis.

Posso utilizar CNPJs gerados em ambiente de produção?

Não. Os CNPJs gerados devem ser utilizados apenas para testes, homologação e desenvolvimento de sistemas.

 

Conclusão

O algoritmo de geração e validação de CNPJ é uma peça fundamental da infraestrutura tributária brasileira.

Ele garante que os documentos possuam integridade matemática e possam ser validados automaticamente pelos sistemas.

Com a chegada do CNPJ alfanumérico, torna-se ainda mais importante que desenvolvedores e empresas mantenham seus sistemas atualizados para suportar o novo padrão definido pela Receita Federal.

Se você precisa gerar documentos válidos para testes, utilize também nosso Gerador de CNPJ Online.

 


Dúvidas ou sugestões? Deixe seu comentário abaixo.

Um abraço e até o próximo post!

Deixe um comentário

Seu e-mail não será publicado.