http://imasters.com.br/artigo/2451/javascript/algoritmo-do-cnpj
Abril.com
Notcias
Entretenimento
Homem
INFO
Downloads
Reviews
Busca
Celular
Assine
Loja
Grupo Abril
PORTAL
AGENDA DE EVENTOS
ARTICULISTAS
MULTIMDIA
FRUM
CODE
IMASTERS PRO
Design
Banco de Dados
Mercado
CMS
Framework
APIs
Desenvolvimento
Tecnologia
Javascript
Algoritmo do CNPJ
Segunda-feira, 16/08/2004 s 15h06, por Thiago Prado
Anncios Google Baixar Msica CPF CNPJ Musicas MP3
Nesta semana vamos entender um pouco como funciona o algoritmo do CNPJ. A lgica para saber se o CNPJ verdadeiro, necessrio fazer um clculo para validar os dgitos verificadores, que so responsveis por diferenciar um CNPJ de outro. Como hoje em dia muito comum as empresas utilizarem sistemas baseados em linguagens de internet, a validao de dados se torna muito importante para que o sistema no gere erros. Esse algoritmo que responsvel pela validao do CNPJ foi feito de acordo com a regras do Ministrio da Fazenda. O cdigo abaixo foi testado nos seguintes browsers: Internet Explorer 4+ Netscape 4+ Opera 7 Mozilla 1.6 Conhecendo o clculo do algoritmo do CNPJ O nmero que compe o CNPJ composto por trs segmentos de algarismos, sendo o primeiro o nmero da inscrio propriamente dito; o segundo (aps a barra) o nmero de filiais, e o terceiro representados pelos ltimos dois valores que so os dgitos verificadores. Oficialmente, o clculo do nmero do CNPJ prev tambm a verificao do oitavo dgito, mas algumas empresas possuem nmeros que ao serem validados segundo esse critrio so considerados invlidos. Por isso, o mais seguro voc fazer a validao dos dgitos verificadores, pois assim nenhum nmero ser invlido e sua rotina est protegida da mesma forma, j que a regra nica e funciona com qualquer CNPJ vlido. Fazendo o clculo do primeiro dgito verificador Vamos mostrar o modo de clculo de modo prtico, para isso vamos adotar um nmero de CNPJ hipottico e calcularemos seus dgitos verificadores: 11.222.333/0001-XX. Vamos comear alinhando os nmeros que compe o CNPJ com os algarismos 5,4,3,2,9,8,7,6,5,4,3 e 2 nesta ordem, veja: Nmeros do CNPJ Valores definidos para o clculo Feito isso efetuaremos a multiplicao de cada uma das colunas, assim: Nmeros 1 1 2 2 2 3 3 3 0 0 0 1 5 4 3 2 9 8 7 6 5 4 3 2 1 1 2 2 2 3 3 3 0 0 0 1
NOTCIAS
11h40
Android Market deve ultrapassar Apple Store em nmero de aplicativos este ano
10h30
1 de 7
5/5/2011 12:13
http://imasters.com.br/artigo/2451/javascript/algoritmo-do-cnpj
do CNPJ
Encontre-nos no Facebook
iMasters
Curtir 3,073 pessoas curtiram iMasters.
18
24
21
18
2
Thiago Lucas Luana Teka Roni
Com os valores encontrados em cada uma das colunas efetuaremos o somatrio, desta forma: 5+4+6+4+18+24+21+18+0+0+0+2 e com o nmero obtido, nesse caso 102, realizaremos a diviso por 11 (102/11).
Claudinia Hugo Toms Marcos Geraldo
Vamos considerar como quociente somente o valor inteiro, o resto da diviso ser responsvel pelo clculo do primeiro dgito verificador. Assim sendo, no nosso caso o resto da diviso o nmero 3. Neste momento temos a seguinte regra: Caso o resto da diviso seja menor que 2, o valor do dgito verificador passa a ser 0. Caso contrrio, subtramos o valor de 11 para obter o dgito, que o nosso caso. Portanto, nosso primeiro dgito verificador (11 - 3) o nmero 8. Para seguirmos com a nossa validao tomaremos o CNPJ com o primeiro dgito j calculado para efetuarmos a validao do segundo e ltimo dgito verificador: 11.222.333/0001-8X. Fazendo o clculo do segundo dgito verificador O processo semelhante a primeira etapa, a nica mudana a seqncia de nmeros que sero alinhados na tabela, como a tabela ficou maior com a presena do dgito j calculado a seqncia agora tem que ter mais um nmero e ficar assim: 6,5,4,3,2,9,8,7,6,5,4,3 e 2, confira: Nmeros do CNPJ Valores definidos para o clculo Feito isso efetuaremos a multiplicao de cada uma das colunas, assim: Nmeros do CNPJ Valores definidos para o clculo Total 6 5 8 6 4 27 24 21 0 0 0 3 16 1 1 2 2 2 3 3 3 0 0 0 1 8 1 1 2 2 2 3 3 3 0 0 0 1 8
CURSOS ONLINE
Como voc pode notar efetuamos tambm, como na primeira etapa, a multiplicao das colunas e faremos agora o somatrio 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 diviso por 11. Nessa diviso, assim como no clculo anterior, vamos apenas considerar o valor inteiro do quociente, pois o clculo do ltimo dgito verificador ser feito com o resto da diviso seguindo a seguinte regra: caso o resto da diviso seja menor que 2 (dois), esse valor passa automaticamente a ser zero; caso contrrio, que o nosso caso, subtrai-se o resto de 11 para obter o valor do ltimo dgito verificador, acompanhe: 120/11=10 com resto 10, 11-10 dgito verificador 1 - Nosso CNPJ agora completo 11.222.333/0001-81. Exemplo pratico da validao do CNPJ Agora que j conhecemos como funciona o algoritmo do CNPJ, vamos partir para a programao do nosso cdigo, o nosso cdigo composto por uma funo que vai
Planos de Comunicao em Mdias Digitais
Esse curso foi desenvolvido para quem quer entender as principais partes do processo de planejamento de aes digitais e quais so os modelos aplicados de planos de comunicao.
2 de 7
5/5/2011 12:13
http://imasters.com.br/artigo/2451/javascript/algoritmo-do-cnpj
retornar um valor true ou false para que o formulrio seja enviado ou no. Abaixo do cdigo tem uma descrio para um melhor acompanhamento e no fim da matria um link para o exemplo desenvolvido aqui. 1 <script language="Javascript"> 2 3 4 function validaCNPJ() { CNPJ = document.validacao.CNPJID.value; erro = new String;
Celular 3 Chips R$ 99,90 2 Cmeras, Tv, FM, MP3, Bluetooth Frete Grtis para todo Brasil
CompreDaChina.com/SuperOferta
5 if (CNPJ.length < 18) erro += " necessario preencher corretamente o nmero do CNPJ! \n\n"; 6 if ((CNPJ.charAt(2) != ".") || (CNPJ.charAt(6) != ".") || (CNPJ.charAt(10) != "/") || (CNPJ.charAt(15) != "-")){ 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 } var nonNumbers = /\D/; if (erro.length == 0) erro += " necessrio preencher corretamente o nmero } //substituir os caracteres que no so nmeros if(document.layers && parseInt(navigator.appVersion) == 4){ x = CNPJ.substring(0,2); x += CNPJ. substring (3,6); x += CNPJ. substring (7,10); x += CNPJ. substring (11,15); x += CNPJ. substring (16,18); CNPJ = x; } else { CNPJ = CNPJ. replace (".",""); CNPJ = CNPJ. replace (".",""); CNPJ = CNPJ. replace ("-",""); CNPJ = CNPJ. replace ("/",""); do CNPJ! \n\n";
Servidor Asp? Hospede seu site com o UOL HOST. Planos por R$12,90*. Confira aqui!
www.UOLHOST.com.br
Peixe Urbano: Cadastre-se Cadastre-se em 5 Seg e Receba Todo Dia Ofertas de 50-90% de Desconto!
PeixeUrbano.com.br/Cadastre-se
24 if (nonNumbers.test(CNPJ)) erro += "A verificao de CNPJ suporta apenas nmeros! \n\n"; 25 26 27 28 29 30 31 } 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 } } return true; } if (erro.length > 0){ alert(erro); return false; } else { alert("CNPJ valido!"); } if ((x = b % 11) < 2) { a[13] = 0; } else { a[13] = 11-x; } if ((CNPJ.charAt(12) != a[12]) || (CNPJ.charAt(13) != a[13])){ erro +="Dgito verificador com problema!"; if ((x = b % 11) < 2) { a[12] = 0 } else { a[12] = 11-x } b = 0; for (y=0; y<13; y++) { b += (a[y] * c[y]); var a = []; var b = new Number; var c = [6,5,4,3,2,9,8,7,6,5,4,3,2]; for (i=0; i<12; i++){ a[i] = CNPJ.charAt(i); b += a[i] * c[i+1];
49 </script> Linha 3 Declarao da varivel CNPJ responsvel por recuperar o valor do campo que contem o nmero do CNPJ. Linha 5 Verificao se o tamanho da varivel menor que 18. Se retonar true a varivel erro vai ser Verificao com um texto referente ao erro. Linha 6 Verificao se o CNPJ foi preenchido corretamente com os nmeros e dgitos extras. Se retornar true uma nova verificacao sera feita para saber se o tamanho da
3 de 7
5/5/2011 12:13
http://imasters.com.br/artigo/2451/javascript/algoritmo-do-cnpj
varivel erro igual a 0, se retonar true a varivel erro vai ser incrementada com um texto referente ao erro. Obs.: A verificao se se o tamanho da varivel erro igual a 0 para no repetir a mesma mensagem de erro. Linha 10 Verificao se o navegador o Netscape 4. Se retornar true, a varivel x ficar responsvel por recuperar os valores das partes da varivel CNPJ. O propsito disso seria retirar os caracteres extras como ., / e -. Ao final, a mesma varivel CNPJ recebe o valor de x, assim ficando apenas com nmeros. Se o navegador no for o Netscape 4, o mtodo replace sera utilizado para substituir os caracteres extras por espao vazio, assim ficando apenas nmeros na varivel CNPJ. Linha 23 Declarao da varivel nonNumbers utilizando expresso regular. Linha 24 Verificao se a varivel CNPJ contm algum caractere que no seja nmero. Se retonar true, a varivel erro vai ser incrementada com um texto referente ao erro. Linha 25 Declarao da matriz a; Linha 26 Declarao da varivel b como nmero; Linha 27 Declarao da varivel c como matriz copulada com os valores a serem multiplicados pelos nmeros do CNPJ para a validao dos dgitos verificadores. Linha 28 Loop que vai ser executado 12 vezes. Linha 29 A matriz a indexada do valor da varivel do loop recebe o caractere da varivel CNPJ indexada do valor da varivel do loop. Linha 30 A varivel b incrementada com o valor da matriz a indexada do valor da varivel do loop multiplicada pelo valor da matriz c indexada do valor da varivel do loop acrescida de 1. Linha 32 Verificao se a varivel x (que tem o valor do resto da diviso 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 varivel b reiniciada. Linha 34 Loop que vai ser executado 13 vezes. Linha 35 A varivel b incrementada com o valor da matriz a indexada do valor da varivel do loop multiplicada pelo valor da matriz c indexada do valor da varivel do loop. Linha 37 Verificao se a varivel x (que tem o valor do resto da diviso 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 Verificao se o caractere 12 da varivel CNPJ diferente da matriz a indexada de 12, ou, se o caractere 13 da varivel CNPJ diferente da matriz a indexada de 13. Se retonar true, a varivel erro vai ser incrementada com um texto referente ao erro. Linha 41 Verificao se o tamanho da varivel erro maior que 0. Se retornar true, uma caixa de alerta surge a mesagem do(s) erro(s) gerados e a funo retorna false. Se retornar false, uma caixa de alerta surge com a mensagem CNPJ vlido!. Linha 47 Se tudo ocorreu bem a funo vai retornar true e o formulrio vai ser enviado. Finalizando o cdigo Como a funo validaCNPJ pronta, vamos partir para a parte HTML com a criao do formulrio que suportara o caixa de texto para digitar o nmero do CNPJ. O evento onSubmit do formulrio usado para retornar um valor para verificar se o mesmo vai ser enviado. 1 <form action="validaCNPJ.htm" name="validacao" onSubmit="return validaCNPJ()"> 2 3 <input type="text" name="CNPJID" id="CNPJID" size="25" maxlength="18"> <input name="Submit" type="submit" value="enviar">
4 </form> 5 Digite o nmero do CNPJ com os caracteres ".", "/" ou "-". 6 Ex. 03.335.456/0001-45 Com essa explicao, voc poder montar sua prpria rotina ou utilizar a que criamos. Abaixo segue o link para o exemplo criado aqui.
4 de 7
5/5/2011 12:13
http://imasters.com.br/artigo/2451/javascript/algoritmo-do-cnpj
Confira o exemplo do cdigo: validaCNPJ.htm. Crditos: Parte deste artigo foi retirado do site Clube da Informtica, com alteraes e informaes adicionadas por mim. Valeu galera e at a prxima semana!
Thiago Prado Atua profissionalmente com desenvolvimento de projetos web em Flash, PHP e Java. Pgina do autor Email
12 COMENTRIOS
COMENTE TAMBM
Donato Thiago, como sempre acompanho seus artigos de Javascript, pois so muito esclarecedores para mim, iniciante em DHtml. Peo a voc, se possvel, que faa um artigo sobre expresses regulares, mostrando qual a sua funcionalidade (pois no tenho informao nenhuma sobre RE). No tenho noo sobre o uso de expresso regular e de sua importncia. Se puder atender o pedido fico grato. donato.
H 6 anos Responder
Thiago Prado Tenho muito prazer em escrever colunas sobre que os leitores necessitam...
H 6 anos Responder
Renato Amadeu Thiago, Preciso de fazer um sistema parecido com o do imasters, sendo que ao inves de ao clicar em imprimir matria ele abrir uma janela com formatao e tal queria que imprimisse direto pra impressora sem abrir janela alguma entende?
H 6 anos Responder
Julian Fernando Puxa, mais uma vez vocs da iMaster arrasaram este algortmo em javascript bastante esclarecedor . O thiago Prado mais uma vez descreveu com detalhes e clareza um bom algortmo que valida CNPJ, e o melhor em JavaScript. Parabns Thiago
H 6 anos Responder
Valfrid Essa rotina eu j tenho a muito tempo porm, a prpria receita tem divulgado um CNPJ de 15 dgitos (19 com a mscara) e essa rotina, como a minha, s valida CNPJs de 14 dgitos!! Algum sabe como fazer?
H 6 anos Responder
Wellington Guedes Thiago, grande matria, bastante esclarecedora, parabns pelo excelente trabalho. Sou consultar da rea de Imposto de Renda da IOB-Thomsom, este trabalho ser de utilidade inestimvel para min. Na verdade faltava um trabalho que abrangesse esse assunto. Grande abrao.
H 6 anos Responder
Plinio Marcos Cruz Agradeo os crditos prezado Thiago. Convido voca escrever um artigo para o Clube http://www.clubedainformatica.com.br
H 6 anos Responder
ricardo silveira Artigo muito bom! parabns, s faltou colocar um if para se o cnpj for 00.000.000/0000-00
H 4 anos Responder
5 de 7
5/5/2011 12:13
http://imasters.com.br/artigo/2451/javascript/algoritmo-do-cnpj
Parabns pela matria, vc teria esse cdigo de validao de CNPJ sem precisar colocar os caracteres extras como ?.?, ?/? e ?-?. Fico agradecido desde j. alberto.tarastchuk@gmail.com
H 3 anos Responder
Junio Kenedy Prezado Thiago, Poderia me explicar o porque da diviso por 11 do valor total da somatria?
H 2 anos Responder
Victor Silva D uma olhada nesse framework, www.lindbergframework.org Com ele voc pode fazer qualquer tipo de validao, pode criar as suas prprias, mesclar vrias validaes para compor uma outra validao e mais, o framework lhe d suporte a annotations tambm o que faz com que vc possa configurar suas validaes em seus beans utilizando annotations. Mesmo as validaes que o framework j oferece como CNPJ, CPF, DATAS, VALORES, COMPARAES DE OBJETOS, ETC... bem como as suas validaes criadas tb podem ser usadas com as annotations do framework. Esse framework trabalha com o spring (mas no lhe obriga a usa-lo tb) criando um contexto de beans de validaes. O framework extensvel e seu uso customizvel. VAle a pena d uma olhada. O site mais uma vez: www.lindbergframework.org FLw
H 1 ano Responder
Rudinei Parabens, Muito bom seus comentrios, auxiliam muito na compreenso desta lgica. Abrao
H 11 meses Responder
PARCEIROS
6 de 7
5/5/2011 12:13
http://imasters.com.br/artigo/2451/javascript/algoritmo-do-cnpj
7 de 7
5/5/2011 12:13