Segunda-feira, 16 de agosto de 2004 às 15h06

Algoritmo do CNPJ

Nesta semana vamos entender um pouco como funciona o algoritmo do CNPJ. A lógica para saber se o CNPJ é verdadeiro, é necessário fazer um cálculo para validar os dígitos verificadores, que são responsáveis por diferenciar um CNPJ de outro.

Como hoje em dia é muito comum as empresas utilizarem sistemas baseados em linguagens de internet, a validação de dados se torna muito importante para que o sistema não gere erros. Esse algoritmo que é responsável pela validação do CNPJ foi feito de acordo com a regras do Ministério da Fazenda.

O código abaixo foi testado nos seguintes browsers:

Internet Explorer 4+
Netscape 4+
Opera 7
Mozilla 1.6

Conhecendo o cálculo do algoritmo do CNPJ

O número que compõe o CNPJ é composto por três segmentos de algarismos, sendo o primeiro o número da inscrição propriamente dito; o segundo (após a barra) o número de filiais, e o terceiro representados pelos últimos dois valores que são os dígitos verificadores.

Oficialmente, o cálculo do número do CNPJ prevê também a verificação do oitavo dígito, mas algumas empresas possuem números que ao serem validados segundo esse critério são considerados inválidos.

Por isso, o mais seguro é você fazer a validação dos dígitos verificadores, pois assim nenhum número será inválido e sua rotina está protegida da mesma forma, já que a regra é única e funciona com qualquer CNPJ válido.

Fazendo o cálculo do primeiro dígito verificador

Vamos mostrar o modo de cálculo de modo prático, para isso vamos adotar um número de CNPJ hipotético e calcularemos seus dígitos verificadores: 11.222.333/0001-XX.

Vamos começar alinhando os números que compõe o CNPJ com os algarismos 5,4,3,2,9,8,7,6,5,4,3 e 2 nesta ordem, veja:

Números do CNPJ

1

1

2

2

2

3

3

3

0

0

0

1

Valores definidos
para o cálculo

5

4

3

2

9

8

7

6

5

4

3

2

Feito isso efetuaremos a multiplicação de cada uma das colunas, assim:

Números do CNPJ

1

1

2

2

2

3

3

3

0

0

0

1

Valores definidos
para o cálculo

5

4

3

2

9

8

7

6

5

4

3

2

Total

5

4

6

4

18

24

21

18

0

0

0

2

Com os valores encontrados em cada uma das colunas efetuaremos o somatório, desta forma: 5+4+6+4+18+24+21+18+0+0+0+2 e com o número obtido, nesse caso 102, realizaremos a divisão por 11 (102/11).

Vamos considerar como quociente somente o valor inteiro, o resto da divisão será responsável pelo cálculo do primeiro dígito verificador. Assim sendo, no nosso caso o resto da divisão é o número 3.

Neste momento temos a seguinte regra: Caso o resto da divisão seja menor que 2, o valor do dígito verificador passa a ser 0. Caso contrário, subtraímos o valor de 11 para obter o dígito, que é o nosso caso. Portanto, nosso primeiro dígito verificador é (11 - 3) o número 8.

Para seguirmos com a nossa validação tomaremos o CNPJ com o primeiro dígito já calculado para efetuarmos a validação do segundo e último dígito verificador: 11.222.333/0001-8X.

Fazendo o cálculo do segundo dígito verificador

O processo é semelhante a primeira etapa, a única mudança é a seqüência de números que serão alinhados na tabela, como a tabela ficou maior com a presença do dígito já calculado a seqüência agora tem que ter mais um número e ficará assim: 6,5,4,3,2,9,8,7,6,5,4,3 e 2, confira:

Números do CNPJ

1

1

2

2

2

3

3

3

0

0

0

1

8

Valores definidos
para o cálculo

6

5

4

3

2

9

8

7

6

5

4

3

2

Feito isso efetuaremos a multiplicação de cada uma das colunas, assim:

Números do CNPJ

1

1

2

2

2

3

3

3

0

0

0

1

8

Valores definidos
para o cálculo

6

5

4

3

2

9

8

7

6

5

4

3

2

Total

6

5

8

6

4

27

24

21

0

0

0

3

16

Como você pode notar efetuamos também, como na primeira etapa, a multiplicação das colunas e faremos agora o somatório das resultados obtidos: 6+5+8+6+4+27+24+21+0+0+0+3+16. Com o resultado obtido, nesse caso 120, efetuamos a divisão por 11.

Nessa divisão, assim como no cálculo anterior, vamos apenas considerar o valor inteiro do quociente, pois o cálculo do último dígito verificador será feito com o resto da divisão seguindo a seguinte regra: caso o resto da divisão seja menor que 2 (dois), esse valor passa automaticamente a ser zero; caso contrário, que é o nosso caso, subtrai-se o resto de 11 para obter o valor do último dígito verificador, acompanhe: 120/11=10 com resto 10, 11-10 dígito verificador 1 - Nosso CNPJ agora completo 11.222.333/0001-81.

Exemplo pratico da validação do CNPJ

Agora que já conhecemos como funciona o algoritmo do CNPJ, vamos partir para a programação do nosso código, o nosso código é composto por uma função que vai retornar um valor true ou false para que o formulário seja enviado ou não. Abaixo do código tem uma descrição para um melhor acompanhamento e no fim da matéria um link para o exemplo desenvolvido aqui.

1 <script language="Javascript">
2         function validaCNPJ() {
3                 CNPJ = document.validacao.CNPJID.value;
4                 erro = new String;
5                 if (CNPJ.length < 18) erro += "É necessario preencher corretamente o número do CNPJ! \n\n";
6                 if ((CNPJ.charAt(2) != ".") || (CNPJ.charAt(6) != ".") || (CNPJ.charAt(10) != "/") || (CNPJ.charAt(15) != "-")){
7                 if (erro.length == 0) erro += "É necessário preencher corretamente o número do CNPJ! \n\n";
8                 }
9                 //substituir os caracteres que não são números
10               if(document.layers && parseInt(navigator.appVersion) == 4){
11                       x = CNPJ.substring(0,2);
12                       x += CNPJ. substring (3,6);
13                       x += CNPJ. substring (7,10);
14                       x += CNPJ. substring (11,15);
15                       x += CNPJ. substring (16,18);
16                       CNPJ = x;
17               } else {
18                       CNPJ = CNPJ. replace (".","");
19                       CNPJ = CNPJ. replace (".","");
20                       CNPJ = CNPJ. replace ("-","");
21                       CNPJ = CNPJ. replace ("/","");
22               }
23               var nonNumbers = /\D/;
24               if (nonNumbers.test(CNPJ)) erro += "A verificação de CNPJ suporta apenas números! \n\n";
25               var a = [];
26               var b = new Number;
27               var c = [6,5,4,3,2,9,8,7,6,5,4,3,2];
28               for (i=0; i<12; i++){
29                       a[i] = CNPJ.charAt(i);
30                       b += a[i] * c[i+1];
31 }
32               if ((x = b % 11) < 2) { a[12] = 0 } else { a[12] = 11-x }
33               b = 0;
34               for (y=0; y<13; y++) {
35                       b += (a[y] * c[y]);
36               }
37               if ((x = b % 11) < 2) { a[13] = 0; } else { a[13] = 11-x; }
38               if ((CNPJ.charAt(12) != a[12]) || (CNPJ.charAt(13) != a[13])){
39                       erro +="Dígito verificador com problema!";
40               }
41               if (erro.length > 0){
42                       alert(erro);
43                       return false;
44               } else {
45                       alert("CNPJ valido!");
46               }
47               return true;
48       }
49 </script>

Linha 3 – Declaração da variável CNPJ responsável por recuperar o valor do campo que contem o número do CNPJ.

Linha 5 – Verificação se o tamanho da variável é menor que 18. Se retonar true a variável erro vai ser Verificação com um texto referente ao erro.

Linha 6 – Verificação se o CNPJ foi preenchido corretamente com os números e dígitos extras. Se retornar true uma nova verificacao sera feita para saber se o tamanho da variável erro é igual a 0, se retonar true a variável erro vai ser incrementada com um texto referente ao erro.

Obs.: A verificação se se o tamanho da variável erro é igual a 0 é para não repetir a mesma mensagem de erro.

Linha 10 – Verificação se o navegador é o Netscape 4. Se retornar true, a variável x ficará responsável por recuperar os valores das partes da variável CNPJ. O propósito disso seria retirar os caracteres extras como “.”, “/” e “-”. Ao final, a mesma variável CNPJ recebe o valor de x, assim ficando apenas com números.

Se o navegador não for o Netscape 4, o método replace sera utilizado para substituir os caracteres extras por espaço vazio, assim ficando apenas números na variável CNPJ.

Linha 23 – Declaração da variável nonNumbers utilizando expressão regular.

Linha 24 – Verificação se a variável CNPJ contém algum caractere que não seja número. Se retonar true, a variável erro vai ser incrementada com um texto referente ao erro.

Linha 25 – Declaração da matriz a;

Linha 26 – Declaração da variável b como número;

Linha 27 – Declaração da variável c como matriz copulada com os valores a serem multiplicados pelos números do CNPJ para a validação dos dígitos verificadores.

Linha 28 – Loop que vai ser executado 12 vezes.

Linha 29 – A matriz a indexada do valor da variável do loop recebe o caractere da variável CNPJ indexada do valor da variável do loop.

Linha 30 – A variável b é incrementada com o valor da matriz a indexada do valor da variável do loop multiplicada pelo valor da matriz c indexada do valor da variável do loop acrescida de 1.

Linha 32 – Verificação se a variável x (que tem o valor do resto da divisão de b por 11) é menor que 2. Se retornar true, a matriz a indexada de 12 recebe o valor de 0. Se retornar false a matriz a indexada de 12 recebe o valor de 11 menos o valor de x.

Linha 33 – A variável b é reiniciada.

Linha 34 – Loop que vai ser executado 13 vezes.

Linha 35 – A variável b é incrementada com o valor da matriz a indexada do valor da variável do loop multiplicada pelo valor da matriz c indexada do valor da variável do loop.

Linha 37 – Verificação se a variável x (que tem o valor do resto da divisão de b por 11) é menor que 2. Se retornar true, a matriz a indexada de 13 recebe o valor de 0. Se retornar false, a matriz a indexada de 13 recebe o valor de 11 menos o valor de x.

Linha 38 – Verificação se o caractere 12 da variável CNPJ é diferente da matriz a indexada de 12, ou, se o caractere 13 da variável CNPJ é diferente da matriz a indexada de 13. Se retonar true, a variável erro vai ser incrementada com um texto referente ao erro.

Linha 41 – Verificação se o tamanho da variável erro é maior que 0. Se retornar true, uma caixa de alerta surge a mesagem do(s) erro(s) gerados e a função retorna false. Se retornar false, uma caixa de alerta surge com a mensagem “CNPJ válido!”.

Linha 47 – Se tudo ocorreu bem a função vai retornar true e o formulário vai ser enviado.

Finalizando o código

Como a função validaCNPJ pronta, vamos partir para a parte HTML com a criação do formulário que suportara o caixa de texto para digitar o número do CNPJ. O evento onSubmit do formulário é usado para retornar um valor para verificar se o mesmo vai ser enviado.

1 <form action="validaCNPJ.htm" name="validacao" onSubmit="return validaCNPJ()">
2         <input type="text" name="CNPJID" id="CNPJID" size="25" maxlength="18">
3         <input name="Submit" type="submit" value="enviar">
4 </form>
5 Digite o número do CNPJ com os caracteres ".", "/" ou "-".
6 Ex. 03.335.456/0001-45

Com essa explicação, você poderá montar sua própria rotina ou utilizar a que criamos. Abaixo segue o link para o exemplo criado aqui.

Confira o exemplo do código: validaCNPJ.htm.

Créditos: Parte deste artigo foi retirado do site Clube da Informática, com alterações e informações adicionadas por mim.

Valeu galera e até a próxima semana!

11 comentários

 Donato
16/08/2004 22h49

Elogio ao artigo e pedido para um outro

Thiago, como sempre acompanho seus artigos de Javascript, pois são muito esclarecedores para mim, iniciante em DHtml. Peço a você, se possível, que faça um artigo sobre expressões regulares, mostrando qual a sua funcionalidade (pois não tenho informação nenhuma sobre RE). Não tenho noção sobre o uso de expressão regular e de sua importância. Se puder atender o pedido fico grato.
donato.

 Thiago Prado
17/08/2004 19h17

Expressoes Regulares

Tenho muito prazer em escrever colunas sobre que os leitores necessitam...

 Renato Amadeu
26/08/2004 15h30

Imprimir esta pagina

Thiago,
Preciso de fazer um sistema parecido com o do imasters, sendo que ao inves de ao clicar em imprimir matéria ele abrir uma janela com formatação e tal queria que imprimisse direto pra impressora sem abrir janela alguma entende?

 Julian Fernando
27/08/2004 14h41

Elogio ao algorítmo do CNPJ

Puxa, mais uma vez vocês da iMaster arrasaram este algorítmo em javascript é bastante esclarecedor . O thiago Prado mais uma vez descreveu com detalhes e clareza um bom algorítmo que valida CNPJ, e o melhor em JavaScript.
Parabéns Thiago

 Valfrid
20/09/2004 12h07

E com 15 dígitos??

Essa rotina eu já tenho a muito tempo porém, a própria receita tem divulgado um CNPJ de 15 dígitos (19 com a máscara) e essa rotina, como a minha, só valida CNPJs de 14 dígitos!! Alguém sabe como fazer?

 Wellington Guedes
22/09/2004 15h50

Algoritmo do CNPJ

Thiago, grande matéria, bastante esclarecedora, parabéns pelo excelente trabalho.
Sou consultar da área de Imposto de Renda da IOB-Thomsom, este trabalho será de utilidade inestimável para min.
Na verdade faltava um trabalho que abrangesse esse assunto.
Grande abraço.

 Plinio Marcos Cruz
17/10/2004 15h55

Créditos do Artigo

Agradeço os créditos prezado Thiago. Convido vocêa escrever um artigo para o Clube - http://www.clubedainformatica.com.br

 ricardo silveira
30/01/2007 23h41

zeros

Artigo muito bom! parabéns, só faltou colocar um if para se o cnpj for 00.000.000/0000-00

 Alberto Tarastchuk
02/04/2008 21h15

CARACTERES EXTRAS

Prezado Thiago

Parabéns pela matéria, vc teria esse código de validação de CNPJ sem precisar colocar os caracteres extras como ?.?, ?/? e ?-?. Fico agradecido desde já.

alberto.tarastchuk@gmail.com

 Junio Kenedy
23/05/2008 16h37

DIVISÃO POR 11?

Prezado Thiago,
Poderia me explicar o porque da divisão por 11 do valor total da somatória?

 Victor Silva
07/01/2010 19h05

Framework para validações

Dá uma olhada nesse framework, www.lindbergframework.org

Com ele você pode fazer qualquer tipo de validação, pode criar as suas próprias, mesclar várias validações para compor uma outra validação e mais, o framework lhe dá suporte a annotations também o que faz com que vc possa configurar suas validações em seus beans utilizando annotations. Mesmo as validações que o framework já oferece como CNPJ, CPF, DATAS, VALORES, COMPARAÇÕES DE OBJETOS, ETC... bem como as suas validações criadas tb podem ser usadas com as annotations do framework.

Esse framework trabalha com o spring (mas não lhe obriga a usa-lo tb) criando um contexto de beans de validações. O framework é extensível e seu uso customizável.

VAle a pena dá uma olhada.

O site mais uma vez: www.lindbergframework.org

FLw

Cancelar resposta

Qual a sua opinião?

Faça login abaixo ou cadastre-se rapidamente.


Sobre o Autor
Thiago Prado Atua profissionalmente com desenvolvimento de projetos web em Flash, PHP e Java.

2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.