Ariel Popovsky's Blog

Aventuras y desventuras con .net
posts - 9, comments - 144, trackbacks - 0

My Links

News

Locations of visitors to this page

Twitter












Tag Cloud

Archives

Post Categories

My Sites

Validar un CUIT/CUIL con C#, Javascript y JQuery.Validate

Etiquetas de Technorati: ,,,,
 

Hace tiempo que quiero armar un blog técnico para compartir experiencias y cosas de interes para desarrolladores web y finalmente me decidí.
Para el primer post quiero empezar con algo útil que tuve que armar para una aplicación que estamos desarrollando. Se trata de rutinas de validación de CUIT/CUIL (Código Unico de Identificación Tributaria / Laboral de Argentina). Hay varios ejemplos en la web en distintos lenguajes pero al no ver algo en c# o Javascript decidí armar mi versión.
La validación se basa en calcular el dígito verificador y compararlo con el suministrado. El algoritmo es muy simple, se multiplica cada dígito por un factor específico, la suma de todos los términos se divide por 11 y el dígito es igual a 0 si el resto es 0, 9 si el resto es 1 o 11-resto en los demás casos.
Esta es la versión de .net para calcular el dígito:

 
   1:          /// <summary>
   2:          /// Calcula el dígito verificador dado un CUIT completo o sin él.
   3:          /// </summary>
   4:          /// <param name="cuit">El CUIT como String sin guiones</param>
   5:          /// <returns>El valor del dígito verificador calculado.</returns>
   6:          public static int CalcularDigitoCuit(string cuit)
   7:          {
   8:              int[] mult = new[] { 5, 4, 3, 2, 7, 6, 5, 4, 3, 2 };
   9:              char[] nums = cuit.ToCharArray();
  10:              int total = 0;
  11:              for (int i = 0; i < mult.Length; i++)
  12:              {
  13:                  total += int.Parse(nums[i].ToString()) * mult[i];
  14:              }
  15:              var resto = total % 11;
  16:              return resto == 0 ? 0 : resto == 1 ? 9 : 11 - resto;
  17:          }

 

El código para validar simplemente compara el dígito suministrado con el calculado. Como mejora se podrían validar los primeros 2 dígitos que solo pueden tener ciertos valores pero preferí dejarlo afuera por ahora ya que quien sabe si el día de mañana no se agregan otros códigos.

   1:          /// <summary>
   2:          /// Valida el CUIT ingresado.
   3:          /// </summary>
   4:          /// <param name="cuit" />Número de CUIT como string con o sin guiones
   5:          /// <returns>True si el CUIT es válido y False si no.</returns>
   6:          public static bool ValidaCuit(string cuit)
   7:          {
   8:              if (cuit == null)
   9:              {
  10:                  return false;
  11:              }
  12:              //Quito los guiones, el cuit resultante debe tener 11 caracteres.
  13:              cuit = cuit.Replace("-", string.Empty);
  14:              if (cuit.Length != 11)
  15:              {
  16:                  return false;
  17:              }
  18:              else
  19:              {
  20:                  int calculado = CalcularDigitoCuit(cuit);
  21:                  int digito = int.Parse(cuit.Substring(10));
  22:                  return calculado == digito;
  23:              }
  24:          }

 

 La versión Javascript es muy similar aunque no separé la generación del dígito de la validación. La última línea registra el método de validación en JQuery Validator.

   1:  function validaCuit(cuit) {
   2:      if (typeof (cuit) == 'undefined')
   3:          return true;
   4:      cuit = cuit.toString().replace(/[-_]/g, "");
   5:      if (cuit == '')
   6:          return true; //No estamos validando si el campo esta vacio, eso queda para el "required"
   7:      if (cuit.length != 11)
   8:          return false;
   9:      else {
  10:          var mult = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
  11:          var total = 0;
  12:          for (var i = 0; i < mult.length; i++) {
  13:              total += parseInt(cuit[i]) * mult[i];
  14:          }
  15:          var mod = total % 11;
  16:          var digito = mod == 0 ? 0 : mod == 1 ? 9 : 11 - mod;
  17:      }
  18:      return digito == parseInt(cuit[10]);
  19:  }
  20:   
  21:  $.validator.addMethod("cuit", validaCuit, 'CUIT/CUIT Inválido');


Un ejemplo de uso del validador de Javascript:
   1:   <form id="test">
   2:      <input type="text" id="cuit" name="cuit" />
   3:   </form>

 

 

   1:      <script type="text/javascript">
   2:          $(function() {
   3:              $("#test").validate({
   4:                  rules: {
   5:                      cuit: "cuit"
   6:                  }
   7:              });
   8:              $("#cuit").keydown(function() {
   9:                  $(this).valid();
  10:              });
  11:          });
  12:      
  13:      </script>

Espero que a alguien le sea útil.

 
  • Share This Post:
  • Share on Twitter
  • Share on Facebook
  • Share on Technorati

Print | posted on Monday, April 27, 2009 4:18 PM | Filed Under [ ASP.net ]

Feedback

Gravatar

# re: Validar un CUIT/CUIL con C#, Javascript y JQuery.Validate

Muchisimas gracias. Me ahorraste varias minutos de codificacion. Un abrazo y Gracias.
5/30/2009 3:39 PM | Nahuel Alejandro Ramos
Gravatar

# re: Validar un CUIT/CUIL con C#, Javascript y JQuery.Validate

Usalo tranquilo y modificalo a gusto (eso si, después no me eches la culpa si no anda ;) ).

Saludos!
10/28/2009 5:48 PM | Ariel Popovsky
Gravatar

# re: Validar un CUIT/CUIL con C#, Javascript y JQuery.Validate

Capo! todavia no lo pude hacer andar pero muchas gracias igual!!!
11/10/2009 2:52 PM | Juanito
Gravatar

# re: Validar un CUIT/CUIL con C#, Javascript y JQuery.Validate

Muy buen post, gracias!!!

@mariano: si hiciste modificaciones que son necesarias, ¿que tal si las compartes con todos? ;) Gracias!
1/13/2010 10:56 AM | Sharer
Gravatar

# re: Validar un CUIT/CUIL con C#, Javascript y JQuery.Validate

Hay un error en la línea 15, en la función CalcularDigitoCuit(string cuit) en C#. en lugar de decir:

var resto = total % 11;

debería ser

int resto = total % 11;
2/3/2010 12:42 PM | c#coder
Gravatar

# re: Validar un CUIT/CUIL con C#, Javascript y JQuery.Validate

Muchas gracias por el aporte, la verdad que es muy util
4/4/2010 7:44 PM | alfredo
Gravatar

# re: Validar un CUIT/CUIL con C#, Javascript y JQuery.Validate

en los ejemplos de c# faltaria validar que no sea tenga caracteres la cadena. y que los primeros 2 digitos sean si o si una de las siguientes opciones:
20, 23, 24, 27, o 30

Saludos
4/8/2010 11:47 PM | julian
Gravatar

# re: Validar un CUIT/CUIL con C#, Javascript y JQuery.Validate

El tema de los prefijos no estaría mal agregarlo, no lo hice porque no estaba seguro de saber todos los posibles. Por ejemplo en tu lista falta el 33 que está en uso.
El tema de validar que no esté vacío, eso es a propósito.
Cuando trabajas con validadores, hay validadores específicos para campos obligatorios. Este validador valida que ingreses un CUIT valido, pero el CUIT podría no ser obligatorio. Si es obligatorio o no, tenés un validador específico que es el "required".
4/9/2010 9:47 AM | Ariel Popovsky
Gravatar

# re: Validar un CUIT/CUIL con C#, Javascript y JQuery.Validate

No soy de comentar en los foros... exepto cuando hay algo verdaderamente simple y practico como estos script. saludos muy bueno el blog felicitaciones!
6/4/2010 8:04 PM | GONZALO
Gravatar

# re: Validar un CUIT/CUIL con C#, Javascript y JQuery.Validate

Excelente post! Muy útil
7/17/2010 9:51 AM | Carlos
Gravatar

# re: Validar un CUIT/CUIL con C#, Javascript y JQuery.Validate

Muchas gracias hermano!!
saludos de Brasil
7/27/2010 3:19 PM | Pedrero
Gravatar

# re: Validar un CUIT/CUIL con C#, Javascript y JQuery.Validate

gracias, pero la verdad todos estos ejemplos nunca me sirven ya que no se programar.
entonces los miro de lejos.... osea... ojo . me pongo mal con lo que me pasa internamente, pero siempre digo que en la vida hay q seguir y meterle duro a las adversidades.
para mi la programacion siempre fue un karma, tuve 2 trabajos como programador y me hecharon al mes.
no se q onda,,, osea.. me keria hacer el poronga, viste osea.. ese tipo bil geits o esos loquitos...
pero la verdad es q el destino me la jugo por detras... pero bueno aca estoy dandole batalla.
saludos a todos los que me conocen, la radio esta muy buena.
aguante c sharp.
10/7/2010 8:15 AM | carlos gomez
Gravatar

# re: Validar un CUIT/CUIL con C#, Javascript y JQuery.Validate

Buenisimo!!!! Muchas gracias por el aporte
11/24/2010 1:14 PM | Diego
Gravatar

# re: Validar un CUIT/CUIL con C#, Javascript y JQuery.Validate

FileUltimate is an ASP.NET file manager control which you can add directly to your existing ASP.NET (.aspx) pages. The control renders a user interface similar to "Windows Explorer" within the page and this user interface allows you to view the contents of the predefined root folders and allow complete file management actions within those folders. File management actions can be limited by predefined permissions and quota limits on each folder separately.
12/10/2010 7:00 PM | asp.net file picker
Gravatar

# re: Validar un CUIT/CUIL con C#, Javascript y JQuery.Validate

Sólo para contar que utilicé tu código como spec de mi impl en scala del cálculo del dígito verificador que quedó como sigue:


private val factors = Seq(5, 4, 3, 2, 7, 6, 5, 4, 3, 2)

def verifier(cuit: String): Digit = {
val digits = cuit.map(_.toString.toInt)
0.until(factors.length).map(i ⇒ digits(i) * factors(i)).reduceLeft(_ + _) % 11 match {
case 0 ⇒ 0
case 1 ⇒ 9
case x ⇒ 11 - x
}
}


Saludos y muchas gracias!
2/15/2011 3:52 PM | Pablo
Gravatar

# re: Validar un CUIT/CUIL con C#, Javascript y JQuery.Validate

La linea 8 de la fn CalcularDigitoCuit lo correcto seria:

int[] mult = new int[] { 5, 4, 3, 2, 7, 6, 5, 4, 3, 2 };

Saludos.
10/19/2011 1:14 PM | Hernan
Gravatar

# re: Validar un CUIT/CUIL con C#, Javascript y JQuery.Validate

Muchas gracias por compartir este código. Siempre es útil y necesario.

Saludos.
2/1/2012 12:56 PM | Ramiro
Post A Comment
Title:
Name:
Email:
Website:
Comment:
Verification:
 
 

Powered by: