viernes, 17 de julio de 2009

Validar CUIT en Ruby

Hace unos días tuve que implementar un método que permita validar si un número de CUIT es válido o no. Una vez más pude resolverlo de una manera especial utilizando Ruby. Veamos el ejemplo:

Lo que determina si un número de CUIT es válido es realizar un producto dígito por dígito por una determinada secuencia y realizar la sumatoria de estas operaciones. Luego bastará con verificar si nuestra suma es múltiplo de 11.

En tal caso supongamos que tenemos un número de CUIT: 12345678901
La secuencia por la que debemos multiplicar cada valor es: 54327654321

De esta forma lo que buscamos es hacer la siguiente operación:
(1*5) + (2*4) + (3*3) + (4 *2) + (5*7) + (6*6) + (7*5) + (8*4) + (9*3)+(0*2) + (1*1)

Lo cual nos arrojará un valor de 196.

Luego haremos 196/11 y obtendremos un cociente de 17 con un resto de 9.

Desde luego en este ejemplo el CUIT no es válido, dado que si nuestra suma fuera múltiplo de 11 el resto debería ser 0 en vez de 9.

¿Cómo lo resolveremos en Ruby?

Definiremos un método es_cuit_valido? dentro de la clase Bignum:


class Bignum

def es_cuit_valido?

numero_validador = 54327654321 # orden de los dígitos a mutliplicar

arre_validador = numero_validador.to_s.split('') #armo un array separando los dígitos

arre_cuit = self.to_s.split('') #armo un array separando los dígitos

suma = arre_validador.zip(arre_cuit).inject(0) {|sum, par_ordenado|

sum += par_ordenado.first.to_i * par_ordenado.second.to_i

} #armamos un nuevo array cuyo cada elemento es un array de dos elementos, uno de cada array, posteriormente realizamos la sumatoria almacenándola en la variable sum, inicializada en 0.

return suma.multiple_of?(11) # verificamos si la suma es múltiplo de 11

end

end




También podemos resumirlo un poco más:


class Bignum

def es_cuit_valido?

v = 54327654321.to_s.split('')

self.to_s.split('') .zip(@v).inject(0) {|s, p| s += p[0].to_i * p[1].to_i}.multiple_of?(11)

end

end




Luego podremos probar nuesto método haciendo:


>> 12345678900.es_cuit_valido?

=> false

>> 12345678903.es_cuit_valido?

=> true




Desde luego hay cuestiones que pueden mejorarse, pero sin duda es positivo probar la potencia de algunos métodos de este lenguaje que desde luego lo hereda de otros.

No tienes Ruby? pruébalo on line desde http://tryruby.hobix.com/

No hay comentarios:

Publicar un comentario