[Aporte] Calcular CUIT a partir de DNI

2,516 views
Skip to first unread message

Flavio V.

unread,
Jul 21, 2015, 1:00:47 PM7/21/15
to pyaf...@googlegroups.com
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

Eduardo Martinez

unread,
Jul 21, 2015, 1:40:47 PM7/21/15
to pyaf...@googlegroups.com

Muy bueno.
Por si t3 sirve: en caso de obtener un digito verificador fuera de rango, o sea, dos digitos, cambia el principio.

  Creía que 20 pasaba a 24 y 27 a 23, pero tengo clientes con el inicio distinto a su sexo.
   Allí hace falta alguien con más conocimiento. Quizás igual tuvieran digito verificador fuera de rango, pero no me consta.

   Saludos.

   Eduardo.

--
Has recibido este mensaje porque estás suscrito al grupo "PyAfipWs Factura Electrónica Libre y temas relacionados AFIP ARBA ANMAT" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a pyafipws+u...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a pyaf...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/pyafipws.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Pablo Lafosse - L+A&A

unread,
Jul 21, 2015, 3:12:31 PM7/21/15
to pyaf...@googlegroups.com
¡Gracias!, todo aporte es útil.
Saludos,
Pablo

--
Has recibido este mensaje porque estás suscrito al grupo "PyAfipWs Factura Electrónica Libre y temas relacionados AFIP ARBA ANMAT" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a pyafipws+u...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a pyaf...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/pyafipws.
Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
Visite el sitio de Por Los Chicos y done comida gratis con un click.

Diego Gonella

unread,
Jul 21, 2015, 4:41:03 PM7/21/15
to pyaf...@googlegroups.com
Muy bueno Flavio, lo voy a migrar a php y lo comparto


Andres Misiak

unread,
Jul 21, 2015, 10:05:58 PM7/21/15
to pyafipws
Diego pensaba poner lo mismo. No tengo tiempo por unos días, pero en cuanto me libere un poco lo comparto y sino será muy bienvenido tu código.

Saludos.

Andres Misiak

Carlos Rey

unread,
Jul 22, 2015, 11:53:16 AM7/22/15
to PyAfipWs Factura Electrónica Libre y temas relacionados AFIP ARBA ANMAT
Hola yo en mi caso tengo 24 como primeros dos digitos y es según me explicaron cuando hay algún problema en el AFIP, yo primero tenía 23 pero figuraba tambien con 20, nadie sabía porque en el AFIP, y me pusieron el 24.

Andres Misiak

unread,
Jul 22, 2015, 3:00:56 PM7/22/15
to pyafipws
Gracias Carlos, es bueno saberlo

Andres Misiak

Gerardo Allende

unread,
Jul 22, 2015, 9:58:53 PM7/22/15
to pyaf...@googlegroups.com

Hola,

Afip tiene un servicio que devuelve una lista de cuits o cuils a partir de un dni o parte de dni.

Ejemplo:

https://soa.afip.gob.ar/sr-padron/v2/personas/23456789

Saludos

Flavio V.

unread,
Jul 23, 2015, 1:03:02 AM7/23/15
to PyAfipWs Factura Electrónica Libre y temas relacionados AFIP ARBA ANMAT, gerardo...@gmail.com
Muy interesante Gerardo, no conocia este servicio, lo destacable es la coleccion de numeros que devuelve ya que como esta en el ejemplo que publicas, existe mas de un posible CUIL para ese DNI, conozco varios de esos casos donde un mismo numero de DNI es asignado a solo a un hombre y solo a una mujer, creo que esto se daba hace mucho tiempo atras, hoy ya no.

Saludos
Flavio
Reply all
Reply to author
Forward
0 new messages