From fbd2bcbf378e9361ea8c9974cab70df37785bb8e Mon Sep 17 00:00:00 2001 From: Julio Spader Date: Mon, 8 Oct 2018 10:48:53 -0300 Subject: [PATCH] Additional: Included validation rule for CNPJ from Brazil --- src/additional/cnpjBR.js | 69 ++++++++++++++++++++++++++++++ src/localization/messages_pt_BR.js | 3 +- test/methods.js | 20 +++++++++ 3 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 src/additional/cnpjBR.js diff --git a/src/additional/cnpjBR.js b/src/additional/cnpjBR.js new file mode 100644 index 000000000..41834380e --- /dev/null +++ b/src/additional/cnpjBR.js @@ -0,0 +1,69 @@ +/* + * Brazillian value number (Cadastrado de Pessoas Juridica). + * value numbers have 14 digits in total: 12 numbers followed by 2 check numbers that are being used for validation. + */ +$.validator.addMethod( "cnpjBR", function( value ) { + + // Removing no number + value = value.replace( /[^\d]+/g, "" ); + + // Checking value to have 14 digits only + if ( value.length !== 14 ) { + return false; + } + + // Elimina values invalidos conhecidos + if ( value === "00000000000000" || + value === "11111111111111" || + value === "22222222222222" || + value === "33333333333333" || + value === "44444444444444" || + value === "55555555555555" || + value === "66666666666666" || + value === "77777777777777" || + value === "88888888888888" || + value === "99999999999999" ) { + return false; + } + + // Valida DVs + var tamanho = ( value.length - 2 ); + var numeros = value.substring( 0, tamanho ); + var digitos = value.substring( tamanho ); + var soma = 0; + var pos = tamanho - 7; + + for ( var i = tamanho; i >= 1; i-- ) { + soma += numeros.charAt( tamanho - i ) * pos--; + if ( pos < 2 ) { + pos = 9; + } + } + + var resultado = soma % 11 < 2 ? 0 : 11 - soma % 11; + + if ( resultado !== parseInt( digitos.charAt( 0 ), 10 ) ) { + return false; + } + + tamanho = tamanho + 1; + numeros = value.substring( 0, tamanho ); + soma = 0; + pos = tamanho - 7; + + for ( var il = tamanho; il >= 1; il-- ) { + soma += numeros.charAt( tamanho - il ) * pos--; + if ( pos < 2 ) { + pos = 9; + } + } + + resultado = soma % 11 < 2 ? 0 : 11 - soma % 11; + + if ( resultado !== parseInt( digitos.charAt( 1 ), 10 ) ) { + return false; + } + + return true; + +}, "Please specify a CNPJ value number" ); diff --git a/src/localization/messages_pt_BR.js b/src/localization/messages_pt_BR.js index 4f9effad8..cfd018de8 100644 --- a/src/localization/messages_pt_BR.js +++ b/src/localization/messages_pt_BR.js @@ -74,5 +74,6 @@ $.extend( $.validator.messages, { ziprange: "O código postal deve estar entre 902xx-xxxx e 905xx-xxxx", cpfBR: "Por favor, forneça um CPF válido.", nisBR: "Por favor, forneça um NIS/PIS válido", - cnhBR: "Por favor, forneça um CNH válido." + cnhBR: "Por favor, forneça um CNH válido.", + cnpjBR: "Por favor, forneça um CNPJ válido." } ); diff --git a/test/methods.js b/test/methods.js index ad2662c7e..f7a193536 100644 --- a/test/methods.js +++ b/test/methods.js @@ -1717,6 +1717,26 @@ QUnit.test( "cpfBR", function( assert ) { assert.ok( !method( "11144477737" ), "Invalid CPF Number: 2nd check number failed" ); } ); +QUnit.test( "cnpjBR", function( assert ) { + var method = methodTest( "cnpjBR" ); + assert.ok( method( "18517604000175" ), "Valid CNPJ Number" ); + assert.ok( method( "18.517.604/0001-75" ), "Valid CNPJ Number" ); + assert.ok( method( "06994660000111" ), "Valid CNPJ Number" ); + assert.ok( method( "06.994.660/0001-11" ), "Valid CNPJ Number" ); + assert.ok( !method( "00000000000000" ), "Invalid CNPJ Number: dump data" ); + assert.ok( !method( "11111111111111" ), "Invalid CNPJ Number: dump data" ); + assert.ok( !method( "22222222222222" ), "Invalid CNPJ Number: dump data" ); + assert.ok( !method( "99999999999999" ), "Invalid CNPJ Number: dump data" ); + assert.ok( !method( "8517604000175" ), "Invalid CNPJ Number: < 14 digits" ); + assert.ok( !method( "8.517.604/0001-75" ), "Invalid CNPJ Number: < 14 digits" ); + assert.ok( !method( "1185176040001750" ), "Invalid CNPJ Number: > 14 digits" ); + assert.ok( !method( "18.517.604/0001-750" ), "Invalid CNPJ Number: > 14 digits" ); + assert.ok( !method( "18517604000174" ), "Invalid CNPJ Number" ); + assert.ok( !method( "18.517.604/0001-74" ), "Invalid CNPJ Number" ); + assert.ok( !method( "06994660000211" ), "Invalid CNPJ Number" ); + assert.ok( !method( "06.994.660/0002-11" ), "Invalid CNPJ Number" ); +} ); + QUnit.test( "nisBR", function( assert ) { var method = methodTest( "nisBR" ); assert.ok( method( "10757995753" ), "Valid NIS/PIS Number" );