Recentemente tive “corrigir” um pequeno problema que ocorre no navegador do Google, o Chrome. A validação de data do jQuery.validate faz a verificação da data pelo formato americano, ou seja, se você informasse 30/05/2009 (30 de maio, ou qualquer outro dia maior que 12) o validate interpreta no Chrome como dia 5 do mês 30. Beleza, vou procurar um método para validar a data para a localidade brasileira.

Procurando este método encontrei também o metodo para validar data hora e CPF. Daí pensei, deve ter também do CNPJ, procurei por algum tempo e não encontrei. Dando uma olhada no código do CPF, percebi que é bem fácil de implementar um método novo ao validate. Eu já tinha visto outras funções para validar CNPJ, no meu blog mesmo tem um gerador de CPF/CNPJ, para quem quiser testar o método que implementei sinta-se a vontade XD.

Uma observação importante, se vocês encontrarem algum bug, erro, testarem em outros navegadores E NÃO FUNCIONAR, ou simplemente se vocês quiserem elogiar o meu esforço de implementar este método ao validate, comentem a vontade.

Não vou explicar aqui o funcionamento da validação, nem o calculo do digito verificador, nem que a casa da moeda… é deixa pra lá. XD

Chega de delongas e vamos ao código, abaixo coloquei o método e o exemplo de como utilizá-lo com o validate. Nos arquivos disponíveis tem o exemplo funcionando.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Testando validate com novos módulos</title>
 
<script type="text/javascript" src="http://www.shiguenori.com/jquery/jquery-1.3.1.js"></script>
<script type="text/javascript" src="jquery.validate.js"></script>
 
<script type="text/javascript">
/*
 *
 * NOVO METODO PARA O JQUERY VALIDATE
 * VALIDA CNPJ COM 14 OU 15 DIGITOS
 * A VALIDAÇÃO É FEITA COM OU SEM OS CARACTERES SEPARADORES, PONTO, HIFEN, BARRA
 *
 * ESTE MÉTODO FOI ADAPTADO POR:
 * 
 * Shiguenori Suguiura Junior <junior@dothcom.net>
 * 
 * http://blog.shiguenori.com
 * http://www.dothcom.net
 * 
 */
jQuery.validator.addMethod("cnpj", function(cnpj, element) {
   cnpj = jQuery.trim(cnpj);// retira espaços em branco
   // DEIXA APENAS OS NÚMEROS
   cnpj = cnpj.replace('/','');
   cnpj = cnpj.replace('.','');
   cnpj = cnpj.replace('.','');
   cnpj = cnpj.replace('-','');
 
   var numeros, digitos, soma, i, resultado, pos, tamanho, digitos_iguais;
   digitos_iguais = 1;
 
   if (cnpj.length < 14 && cnpj.length < 15){
      return false;
   }
   for (i = 0; i < cnpj.length - 1; i++){
      if (cnpj.charAt(i) != cnpj.charAt(i + 1)){
         digitos_iguais = 0;
         break;
      }
   }
 
   if (!digitos_iguais){
      tamanho = cnpj.length - 2
      numeros = cnpj.substring(0,tamanho);
      digitos = cnpj.substring(tamanho);
      soma = 0;
      pos = tamanho - 7;
 
      for (i = tamanho; i >= 1; i--){
         soma += numeros.charAt(tamanho - i) * pos--;
         if (pos < 2){
            pos = 9;
         }
      }
      resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
      if (resultado != digitos.charAt(0)){
         return false;
      }
      tamanho = tamanho + 1;
      numeros = cnpj.substring(0,tamanho);
      soma = 0;
      pos = tamanho - 7;
      for (i = tamanho; i >= 1; i--){
         soma += numeros.charAt(tamanho - i) * pos--;
         if (pos < 2){
            pos = 9;
         }
      }
      resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
      if (resultado != digitos.charAt(1)){
         return false;
      }
      return true;
   }else{
      return false;
   }
}, "Informe um CNPJ válido."); // Mensagem padrão 
 
 
 
// QUANDO O DOCUMENTO ESTIVER PRONTO
$(document).ready(function(){
 
   // CONFIGURA A VALIDACAO DO FORMULARIO
   $("#meuForm").validate({
      rules: {
         titulo: {required: true},
         data_galeria: {required: true, dateBR: true},
         cnpj: {cnpj: true}
      },
      messages: {
         titulo: {required: 'Informe o titulo'},
         data_galeria: {required: 'Informe a data', dateBR: 'Digite uma data válida'},
         cnpj: { cnpj: 'CNPJ inválido'}
      }
      ,submitHandler:function(form) {
         alert('ok');
      }
   });
 
   $('#result').html('jQuery Validate com novos métodos: cpf, cnpj, dateBR e dateTimeBR');
});
 
</script>
 
</head>
 
<body>
 
<div id="result"></div>
 
<form id="meuForm" action="">
 
   <label>Título</label>
   <input id="titulo" name="titulo" type="text" value="" /><br />
 
   <label>Data</label>
   <input id="data_galeria" name="data_galeria" type="text" value="" /><br />
 
   <label>CNPJ</label>
   <input id="cnpj" name="cnpj" type="text" value="" /><br />
 
   <input type="submit" value="Enviar" />
 
</form>
 
</body>
</html>

jquery-1.3.1.js
jquery.validate.js com novos métodos
Exemplo On-line
Exemplo Comprimido

ATUALIZAÇÃO

Galera estou atualizando o post, abaixo os links das atualizações do jQuery 1.5.1 e do jQuery.validate 1.7 no arquivo do validate estou deixando os mesmos arquivos que é disponibilizado no site do bassistance.de entre os arquivos estão alguns plugins opcionais (um para ajax e outro para meta-data) e um arquivo chamado additiona-methods.js que contem algumas funções úteis e outras uteis para outros paises. Também disponibilizo um arquivo que juntei os métodos comentados ou que fizemos por causa da solicitação de algumas pessoas:

jquery-1.5.1.min.js (quem quiser a versão não minimizada baixe do site oficial)
jQuery.validate 1.7 (inclui plugins opcionais, novos métodos e demonstração)
Métodos comentados (tudo o que agente falou por aqui)

OBS.: nos métodos comentados eu atualizei os métodos CPF e CNPJ, deixando os como opcionais, para que eles sejam obrigatórios lembrem-se de utilizar o método required:true. Lembrem também de utilizar o atributo name ou classe diferente de cpf ou cnpj para que a validação não seja chamada automaticamente.