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