viernes, 26 de julio de 2013

Validación de NIE, NIF y CIF con jQuery Validator

Introducción

El plugin jQuery Validation, fue escrito y es mantenido por Jörn Zaefferer, miembro del equipo jQuery, desarrollador jefe del equipo jQuery UI, y uno de los responsables del mantenimiento de QUnit. Lo que dicho plugin nos ofrece, es validación de formularios en cliente, con una alta capacidad de personalización.

Una de las ventajas, es que nosotros mismos podemos extender la clase y añadir nuestros propios métodos a la librería. Esto lo hacemos creando e importando un .js con nuestros métodos de validación, justo después de hacer la llamada al plugin.

¿Cómo añadir un nuevo método?

El formato que debe tener dicho js, para añadir un nuevo método es el siguiente:

;(function($) {

 jQuery.validator.addMethod(
  "NOMBRE_REGLA", 
  function(value, element) {
   
   return false;
  },
  "MENSAJE DE ERROR"
 );
}(jQuery));

Validación de NIF, NIE y CIF:

Volviendo al tema inicial, así quedaría nuestro archivo js para validar NIF, NIE y CIF:

jQuery.validator.addMethod( "nifES", function ( value, element ) {
 "use strict";

 value = value.toUpperCase();

 // Basic format test 
 if ( !value.match('((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)') ) {
  return false;
 }

 // Test NIF
 if ( /^[0-9]{8}[A-Z]{1}$/.test( value ) ) {
  return ( "TRWAGMYFPDXBNJZSQVHLCKE".charAt( value.substring( 8, 0 ) % 23 ) === value.charAt( 8 ) );
 }
 // Test specials NIF (starts with K, L or M)
 if ( /^[KLM]{1}/.test( value ) ) {
  return ( value[ 8 ] === String.fromCharCode( 64 ) );
 }

 return false;

}, "Please specify a valid NIF number." );


jQuery.validator.addMethod( "nieES", function ( value, element ) {
 "use strict";

 value = value.toUpperCase();

 // Basic format test 
 if ( !value.match('((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)') ) {
  return false;
 }

 // Test NIE
 //T
 if ( /^[T]{1}/.test( value ) ) {
  return ( value[ 8 ] === /^[T]{1}[A-Z0-9]{8}$/.test( value ) );
 }

 //XYZ
 if ( /^[XYZ]{1}/.test( value ) ) {
  return ( 
   value[ 8 ] === "TRWAGMYFPDXBNJZSQVHLCKE".charAt( 
    value.replace( 'X', '0' )
     .replace( 'Y', '1' )
     .replace( 'Z', '2' )
     .substring( 0, 8 ) % 23 
   ) 
  );
 }

 return false;

}, "Please specify a valid NIE number." );



jQuery.validator.addMethod( "cifES", function ( value, element ) {
 "use strict";
 
 var sum,
  num = [],
  controlDigit;
 
 value = value.toUpperCase();
 
 // Basic format test 
 if ( !value.match( '((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)' ) ) {
  return false;
 }
 
 for ( var i = 0; i < 9; i++ ) {
  num[ i ] = parseInt( value.charAt( i ), 10 );
 }
 
 // Algorithm for checking CIF codes
 sum = num[ 2 ] + num[ 4 ] + num[ 6 ];
 for ( var count = 1; count < 8; count += 2 ) {
  var tmp = ( 2 * num[ count ] ).toString(),
   secondDigit = tmp.charAt( 1 );
  
  sum += parseInt( tmp.charAt( 0 ), 10 ) + ( secondDigit === '' ? 0 : parseInt( secondDigit, 10 ) );
 }
 
 // CIF test
 if ( /^[ABCDEFGHJNPQRSUVW]{1}/.test( value ) ) {
  sum += '';
  controlDigit = 10 - parseInt( sum.charAt( sum.length - 1 ), 10 );
  value += controlDigit;
  return ( num[ 8 ].toString() === String.fromCharCode( 64 + controlDigit ) || num[ 8 ].toString() === value.charAt( value.length - 1 ) );
 }
 
 return false;
 
}, "Please specify a valid CIF number." );

Test

He creado unos sencillos test con QUnit para comprobar el correcto funcionamiento de dichos archivos, dada la importancia de dichos valores: no es nada deseable que un usuario introduzca un NIF, o CIF inválido, y el sistema no lo detecte. Los resultados han sido satisfactorios:

A continuación os dejo el código de los test:

;(function($) {

function methodTest( methodName ) {
 var v = jQuery("#form").validate();
 var method = $.validator.methods[methodName];
 var element = $("#test")[0];
 return function(value, param) {
  element.value = value;
  return method.call( v, value, element, param );
 };
}

module("methods");

test("nifES", function() {
 var method = methodTest("nifES");
 ok( method( "11441059P" ), "NIF valid" );
 ok( method( "80054306T" ), "NIF valid" );
 ok( method( "76048581R" ), "NIF valid" );
 ok( method( "28950849J" ), "NIF valid" );
 ok( method( "34048598L" ), "NIF valid" );
 ok( method( "28311529R" ), "NIF valid" );
 ok( method( "34673804Q" ), "NIF valid" );
 ok( method( "92133247P" ), "NIF valid" );
 ok( method( "77149717N" ), "NIF valid" );
 ok( method( "15762034L" ), "NIF valid" );
 ok( method( "05122654W" ), "NIF valid" );
 ok( method( "05122654w" ), "NIF valid: lower case" );
 ok(!method( "1144105R" ), "NIF invalid: less than 8 digits without zero" );
 ok(!method( "11441059 R" ), "NIF invalid: white space" );
 ok(!method( "11441059" ), "NIF invalid: no letter" );
 ok(!method( "11441059PR" ), "NIF invalid: two letters" );
 ok(!method( "11440059R" ), "NIF invalid: wrong number" );
 ok(!method( "11441059S" ), "NIF invalid: wrong letter" );
 ok(!method( "114410598R" ), "NIF invalid: > 8 digits" );
 ok(!method( "11441059-R" ), "NIF invalid: dash" );
 ok(!method( "asdasdasd" ), "NIF invalid: all letters" );
 ok(!method( "11.144.059R" ), "NIF invalid: two dots" );
 ok(!method( "05.122.654R" ), "NIF invalid: starts with 0 and dots" );
 ok(!method( "5.122.654-R" ), "NIF invalid:  dots and dash" );
 ok(!method( "05.122.654-R" ), "NIF invalid: starts with zero and dot and dash" );
});

test("nieES", function() {
 var method = methodTest("nieES");
 ok( method( "X0093999K" ), "NIE valid" );
 ok( method( "X1923000Q" ), "NIE valid" );
 ok( method( "Z9669587R" ), "NIE valid" );
 ok( method( "Z8945005B" ), "NIE valid" );
 ok( method( "Z6663465W" ), "NIE valid" );
 ok( method( "Y7875935J" ), "NIE valid" );
 ok( method( "X3390130E" ), "NIE valid" );
 ok( method( "Y7699182S" ), "NIE valid" );
 ok( method( "Y1524243R" ), "NIE valid" );
 ok( method( "X3744072V" ), "NIE valid" );
 ok( method( "X7436800A" ), "NIE valid" );
 ok( method( "y7875935j" ), "NIE valid: lower case" );
 ok(!method( "X0093999 K" ), "NIE inválido: white space" );
 ok(!method( "X 0093999 K" ), "NIE inválido:  white space" );
 ok(!method( "11441059" ), "NIE inválido: no letter" );
 ok(!method( "11441059PR" ), "NIE inválido: two letters" );
 ok(!method( "11440059R" ), "NIE inválido: wrong number" );
 ok(!method( "11441059S" ), "NIE inválido: wrong letter" );
 ok(!method( "114410598R" ), "NIE inválido: > 8 digits" );
 ok(!method( "11441059-R" ), "NIE inválido: dash" );
 ok(!method( "asdasdasd" ), "NIE inválido: all letters" );
 ok(!method( "11.144.059R" ), "NIE inválido: two dots" );
 ok(!method( "05.122.654R" ), "NIE inválido: starts with 0 and dots" );
 ok(!method( "5.122.654-R" ), "NIE inválido: dots and dash" );
 ok(!method( "05.122.654-R" ), "NIE inválido: starts with zero and dot and dash" );
});

test("cifES", function() {
 var method = methodTest("cifES");
 ok( method( "A79082244" ), "CIF valid" );
 ok( method( "A60917978" ), "CIF valid" );
 ok( method( "A39000013" ), "CIF valid" );
 ok( method( "B43522192" ), "CIF valid" );
 ok( method( "B38624334" ), "CIF valid" );
 ok( method( "G72102064" ), "CIF valid" );
 ok( method( "F41190612" ), "CIF valid" );
 ok( method( "J85081081" ), "CIF valid" );
 ok( method( "S98038813" ), "CIF valid" );
 ok( method( "G32937757" ), "CIF valid" );
 ok( method( "B46125746" ), "CIF valid" );
 ok( method( "C27827559" ), "CIF valid" );
 ok( method( "E48911572" ), "CIF valid" );
 ok( method( "s98038813" ), "CIF valid: lower case" );
 ok(!method( "K48911572" ), "CIF invalid: starts with K" );
 ok(!method( "L48911572" ), "CIF invalid: starts with L" );
 ok(!method( "M48911572" ), "CIF invalid: starts with M" );
 ok(!method( "X48911572" ), "CIF invalid: starts with X" );
 ok(!method( "Y48911572" ), "CIF invalid: starts with Y" );
 ok(!method( "Z48911572" ), "CIF invalid: starts with Z" );
 ok(!method( "M15661515" ), "CIF invalid" );
 ok(!method( "Z98038813" ), "CIF invalid: wrong letter" );
 ok(!method( "B 43522192" ), "CIF invalid: white spaces" );
 ok(!method( "43522192" ), "CIF invalid: missing letter" );
 ok(!method( "BB43522192" ), "CIF invalid: two letters" );
 ok(!method( "B53522192" ), "CIF invalid: wrong number" );
 ok(!method( "B433522192" ), "CIF invalid: > 8 digits" );
 ok(!method( "B3522192" ), "CIF invalid: < 8 digits" );
 ok(!method( "B-43522192" ), "CIF invalid: dash" );
 ok(!method( "Basdasdas" ), "CIF invalid: all letters" );
 ok(!method( "B43.522.192" ), "CIF invalid: dots" );
 ok(!method( "B-43.522.192" ), "CIF invalid: dots and dash" );
});

})(jQuery);

No hay comentarios :

Publicar un comentario