jueves, 18 de noviembre de 2010

Verificar CUIT/CUIL usando el Modulus 11 en Python

Basado en una versión de 10 dígitos de Pablo Canello para el CUIT/CUIL de Argentina en Visual Basic (en la Wikipedia), implementé una versión del algoritmo de control de códigos llamado Modulus 11 en Python.

En el caso del CUIL/CUIT de Argentina el código de contro de un dígito es el último, por ejemplo 8 para 20-29582925-8. De cualquier manera este código se usa en mucho otros lados, ya que fue diseñado para bancos por HP.

#!/usr/bin/python
# -*- coding: utf-8 -*-

def VerificarModulus11(Numero, CodigoUnDigito):
'''
Input en la forma:

Numero="23-34568734" y CodigoUnDigito="7"
o
Numero=2334568734 y CodigoUnDigito=7
'''


if str(Numero) != Numero:
Numero = str(Numero)

x = 0
factor = 2
for c in reversed(Numero):

try:
int(c)
except ValueError:
# not numeric
continue
else:
# numeric
x += int(c) * factor
factor += 1
if factor == 8:
factor = 2
#Calcula el dígito de control.
Control = (11 - (x % 11)) % 11
#Verifica si el dígito de control ingresado
# difiere con el calculado.
return Control == int(CodigoUnDigito)


if __name__ == '__main__':

print '4 OK'
print VerificarModulus11( '20-29582925', '8' )
print VerificarModulus11( 3065876301, '2' )
print VerificarModulus11( 2029582925, '8' )
print VerificarModulus11( 3065876301, 2 )
print '4 Not OK'
print VerificarModulus11( '20-29582925', '7' )
print VerificarModulus11( 3065876301, '3' )
print VerificarModulus11( 2029582925, '4' )
print VerificarModulus11( 3065876301, 1 )

No hay comentarios:

Publicar un comentario en la entrada