Gente, mando este pequeño aporte ya que en mi sistema tuve que resolver una necesidad.
Les comento como surgio, en mi sistema al realizar facturas B cuando las mismas superan los $1000 se pide el ingreso del CUIL/CUIT para validarlo contra la afip y emitir la factura a nombre de la persona. Particularmente mi sistema primero hace la consulta online contra la afip para ver que la persona tenga un CUIT activo, si se dan las condiciones entonces se emite la factura.
Ahora, la unica forma de consultar contra la afip es a traves del numero de CUIT, lo cual es un tanto incomodo para el que viene a comprar porque algunas veces no lo recuerda.
Al ver este problema evalue la posibilidad de descargar el padron, pero al verlo me di cuenta que no tiene a todos los contribuyentes, al menos los que yo descargue.
Entonces hice esta pequeña clase que resuelve el calculo del digito veritificador, por lo tanto desde mi sistema quedaria asi:
Se ingresa el numero de documento y ademas se pide el tipo de persona (Persona Fisica Masculino 20, Persona Fisica Femenino 27, Empresa 30), luego esos 10 numeros pasan por esta clase y sale con el digito verificador completando los 11 numeros.
De ahi sigue el camino de consulta contra el padron.
Entiendo que esto no resuelve el 100% de los casos ya que hay numeros que tienen como primeros digitos el 24, pero bueno, va a resolver la mayoria de los casos sin necesidad de pedir CUIT / CUIL.
Sin mas vueltas les dejo el codigo, como siempre, dejo en claro que esto resuelve mi problema, de aca pueden salir mejoras u observaciones. Todavia no corri el total del set de pruebas pero hasta el momento paso las basicas.
----------------------------------------------------------------------- INICIO CODIGO -----------------------------------------------------------
generarCuit.py
#!/usr/bin/python
# -*- coding: utf8 -*-
import sys
class ErrorNegocio(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
class GenerarCuit():
_public_methods_ = ['obtenerCuit']
_public_attrs_ = ['nroCuit','LanzarExcepciones']
def __init__(self):
self.inicializar()
def inicializar(self):
self.nroCuit=0
def obtenerCuit(self):
strCuit=str(self.nroCuit)
lenghtCuit=len(strCuit)
self.validarCantidadDeCaracteres(lenghtCuit)
if self.esNecesarioCalcularDigitoVerificador(lenghtCuit):
digitoVerificador=self.calcularDigitoVerificador()
self.nroCuit=self.nroCuit+str(digitoVerificador)
return self.nroCuit
def calcularDigitoVerificador(self):
v1=int(self.nroCuit[0])
v2=int(self.nroCuit[1])
v3=int(self.nroCuit[2])
v4=int(self.nroCuit[3])
v5=int(self.nroCuit[4])
v6=int(self.nroCuit[5])
v7=int(self.nroCuit[6])
v8=int(self.nroCuit[7])
v9=int(self.nroCuit[8])
v10=int(self.nroCuit[9])
sumatoria=v1*5+v2*4+v3*3+v4*2+v5*7+v6*6+v7*5+v8*4+v9*3+v10*2
#print "Sumatoria",sumatoria
division=sumatoria%11
#print "Resultado division:",division
resta=11-division
#print "Resultado de la resta:",resta
digitoVerificador=resta
if resta==11:
digitoVerificador=0
if resta==10:
digitoVerificador=9
#print "Digito Verificador calculado: ",digitoVerificador
return digitoVerificador
def esNecesarioCalcularDigitoVerificador(self, largo):
if largo == 10:
return True
return False
def validarCantidadDeCaracteres(self, largo):
try:
if largo <> 10 and largo <> 11:
raise ErrorNegocio('Se espera que el numero de entrada tenga 10 u 11 caracteres')
except ErrorNegocio as e:
print e.value
if __name__ == "__main__":
generadorCuit = GenerarCuit()
generadorCuit.nroCuit=sys.argv[1]
cuit=generadorCuit.obtenerCuit()
print "El cuit calculado es:",cuit
----------------------------------------------------------------------- FIN CODIGO -----------------------------------------------------------
Espero le sea util a alguien mas.
Saludos
Flavio