Skip to content

Instantly share code, notes, and snippets.

@victor-rds
Last active March 6, 2024 21:31
Show Gist options
  • Star 10 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save victor-rds/1d00b98f6b03385a472d to your computer and use it in GitHub Desktop.
Save victor-rds/1d00b98f6b03385a472d to your computer and use it in GitHub Desktop.
Extensão para JQuery Validation Plugin (jqueryvalidation.org) que valida o número de CPF ou CNPJ (inclusive os dois ao mesmo tempo num único campo), usa "namespace" brdocs para evitar conflitos, a função calculaDigito() pode ser usada sozinha caso você deseje mudar a lógica do validador ou criar seu método de validação em outro framework ou plugin.
brdocs = {
/**
* Enum com opções do validador
* @readonly
* @enum {number}
*/
cpfcnpj: { "CPF": 1, "CNPJ": 2, "AMBOS": 3 },
/**
* Função que valida CPF e CNPJ de uma só vez.
* O Documento a ser validado depende apenas da quantidade de dígitos
* 11 é aceito como CPF, 14 como CNPJ..
* @param {string} value - Número do CPF ou CNPJ a ser validado.
* @param {Element} element - Elemento HTML onde o valor se encontra.
* @param {Object} [params=3] params - pametros do validador definidos
* pelo enum brdocs.cpfcnpj, default assume AMBOS
* @returns {boolean} se o documento é válido
*/
cpfcnpjValidator: function (value, element, params) {
//params = (typeof params === 'undefined' || (typeof params === 'boolean' && params) ) ? brdocs.cpfcnpj.AMBOS : params;
value = value.replace(/[^\d]+/g, ''); //Remove todos os cacteres que exceto [0-9]
var isCNPJ = false;
if (value.length != 11 && value.length != 14) return false;
switch(params){
case brdocs.cpfcnpj.CPF:
if (value.length != 11) return false;
isCNPJ = false;
break;
case brdocs.cpfcnpj.CNPJ:
if (value.length != 14) return false;
isCNPJ = true;
break;
default:
isCNPJ = (value.length === 14)
break;
}
if (/^(\d)\1+$/.test(value)) return false; //falso se se todos os digitos forem iguais, os digitos verificadores estão corretos, mas o documento não é válido.
if (brdocs.calculaDigito(value, value.length-3, isCNPJ) != parseInt(value.charAt(value.length-2))) return false;
if (brdocs.calculaDigito(value, value.length-2, isCNPJ) != parseInt(value.charAt(value.length-1))) return false;
return true;
},
/**
* Função que valida 1 dígito verificador, lembrando que
* esta função não vai checar se o documento tem tamanho
* documento está correto, vai apenas calcular o dígito.
* A única diferença nos algoritimos de CPF e CNPJ é que o
* multiplicador deve voltar a 2 quando passar de 9 no caso
* do cnpj, ao contrário do CPF que multiplicador máximo é
* quantidade de caracteres no processo de soma + 2.
*
* @param {string} doc - Número do documento CPF ou CNPJ a ser validado (somente números).
* @param {number} start [start=doc.length-1] - Indice do char em doc por onde o iteração do cálculo deve iniciar
* (útil quando a string doc não foi separada previamento dos dígitos verificadores).
* @param {boolean} [isCNPJ=false] - Se documento deve ser tratado como CPF, se omitido é tratado como falso.
* @returns {number} valor calculado do digito.
*/
calculaDigito: function(doc, start, isCNPJ) {
if(doc.length === 0) return false;
start = (typeof start === 'undefined') ? doc.length-1 : start;
if(start >= doc.length)
return false;
if(isNaN(doc))
return false;
isCNPJ = (typeof isCNPJ === 'undefined') ? false : isCNPJ;
var add = 0
var multi = 2;
for (i = start; i >= 0; i--) {
add += parseInt(doc.charAt(i)) * multi++
if (isCNPJ && multi > 9) multi = 2;
}
var resultado = 11 - add % 11;
return resultado < 10 ? resultado : 0;
}
};
if (Object.freeze) { Object.freeze(brdocs); }
@victor-rds
Copy link
Author

Como usar:
Primeiro registro o validador

$.validator.addMethod("cpfcnpj", brdocs.cpfcnpjValidator, "Informe um documento válido.");

Depois é só criar as regras paras campos no .validade()

$("#formulario").validate({
    rules: {
        nome_do_campo_cpf: {//Apenas CPF
            cpfcnpj: brdocs.cpfcnpj.CPF
        },
        nome_do_campo_cnpj:{//Apenas CNPJ
            cpfcnpj: brdocs.cpfcnpj.CNPJ
        },
        //Mesmo campo para ambos os documentos
        nome_do_campo_ambos: "cpfcnpj",
        nome_do_campo_ambos2:{
            cpfcnpj: brdocs.cpfcnpj.AMBOS
        },
    }
});

@edson-junior
Copy link

Você acaba de salvar minha vida! Vlw! \o/

@adrianoerasmo
Copy link

Bom dia, estou tentando colocar numa modal dentro um input. como fazer para validar ainda dentro do input. Utilizo o mesmo campo input para validar.

@elynegrao
Copy link

Olá, o algorítimo entente esse CNPJ como inválido: 50.445.477/0001-59 , mas é válido.

@victor-rds
Copy link
Author

victor-rds commented Aug 12, 2020

Olá, o algorítimo entente esse CNPJ como inválido: 50.445.477/0001-59 , mas é válido.

@elynegrao Pronto corrigido, eu já tinha corrigido no repositório interno da empresa e esqueci de atualizar aqui, era um erro besta.
Na linha return resultado < 9 ? resultado : 0; deveria ser resultado <= 9 ou resultado < 10

@elynegrao
Copy link

Olá, o algorítimo entente esse CNPJ como inválido: 50.445.477/0001-59 , mas é válido.

@elynegrao Pronto corrigido, eu já tinha corrigido no repositório interno da empresa e esqueci de atualizar aqui, era um erro besta.
Na linha return resultado < 9 ? resultado : 0; deveria ser resultado <= 9 ou resultado < 10

Show de bola Victor, muito obrigado!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment