def Consultar(self, nro_doc): "Llama a la API pública de AFIP para obtener los datos de una persona" n = 0 while n <= 4: n += 1 # reintentar 3 veces try: if not self.client: if DEBUG: warnings.warn("reconectando intento [%d]..." % n) self.Conectar() self.response = self.client("sr-padron", "v2", "persona", str(nro_doc)) except Exception as e: self.client = None ex = exception_info() self.Traceback = ex.get("tb", "") try: self.Excepcion = norm(ex.get("msg", "").replace("\n", "")) except: self.Excepcion = "<no disponible>" if DEBUG: warnings.warn("Error %s [%d]" % (self.Excepcion, n)) else: break else: return False result = json.loads(self.response) if result['success']: data = result['data'] # extraigo datos generales del contribuyente: self.cuit = data["idPersona"] self.tipo_persona = data["tipoPersona"] self.tipo_doc = TIPO_CLAVE.get(data["tipoClave"]) self.dni = data.get("numeroDocumento") self.estado = data.get("estadoClave") self.denominacion = data.get("nombre") # analizo el domicilio domicilio = data.get("domicilioFiscal") if domicilio: self.direccion = domicilio.get("direccion", "") self.localidad = domicilio.get("localidad", "") # no usado en CABA self.provincia = PROVINCIAS.get(domicilio.get("idProvincia"), "") self.cod_postal = domicilio.get("codPostal") else: self.direccion = self.localidad = self.provincia = "" self.cod_postal = "" # retrocompatibilidad: self.domicilios = [ "%s - %s (%s) - %s" % ( self.direccion, self.localidad, self.cod_postal, self.provincia, ) ] # analizo impuestos: self.impuestos = data.get("impuestos", []) self.actividades = data.get("actividades", []) if 32 in self.impuestos: self.imp_iva = "EX" elif 33 in self.impuestos: self.imp_iva = "NI" elif 34 in self.impuestos: self.imp_iva = "NA" else: self.imp_iva = "S" if 30 in self.impuestos else "N" mt = data.get("categoriasMonotributo", {}) self.monotributo = "S" if mt else "N" self.actividad_monotributo = "" # TODO: mt[0].get("idCategoria") self.integrante_soc = "" self.empleador = "S" if 301 in self.impuestos else "N" self.cat_iva = "" self.data = data else: error = result['error'] self.Excepcion = error['mensaje'] return True
# Devuelve TA.xml (ticket de autorización de WSAA) __author__ = "Mariano Reingart ([email protected])" __copyright__ = "Copyright (C) 2008-2011 Mariano Reingart" __license__ = "GPL 3.0" __version__ = "2.11c" import hashlib, datetime, email, os, sys, time, traceback, warnings import unicodedata from pysimplesoap.client import SimpleXMLElement from utils import inicializar_y_capturar_excepciones, BaseWS, get_install_dir, \ exception_info, safe_console, date try: from M2Crypto import BIO, Rand, SMIME, SSL except ImportError: ex = exception_info() warnings.warn("No es posible importar M2Crypto (OpenSSL)") warnings.warn(ex['msg']) # revisar instalación y DLLs de OpenSSL BIO = Rand = SMIME = SSL = None # utilizar alternativa (ejecutar proceso por separado) from subprocess import Popen, PIPE from base64 import b64encode # Constantes (si se usa el script de linea de comandos) WSDL = "https://wsaahomo.afip.gov.ar/ws/services/LoginCms?wsdl" # El WSDL correspondiente al WSAA CERT = "reingart.crt" # El certificado X.509 obtenido de Seg. Inf. PRIVATEKEY = "reingart.key" # La clave privada del certificado CERT PASSPHRASE = "xxxxxxx" # La contraseña para firmar (si hay) SERVICE = "wsfe" # El nombre del web service al que se le pide el TA # WSAAURL: la URL para acceder al WSAA, verificar http/https y wsaa/wsaahomo
print "\n".join(ret) if '--grupos_carne' in sys.argv: ret = wsremcarne.ConsultarGruposCarne() print "\n".join(ret) if '--tipos_carne' in sys.argv: for grupo_carne in wsremcarne.ConsultarGruposCarne(sep=None): ret = wsremcarne.ConsultarTiposCarne(grupo_carne['codigo']) print "\n".join(ret) if '--codigos_domicilio' in sys.argv: cuit = raw_input("Cuit Titular Domicilio: ") ret = wsremcarne.ConsultarCodigosDomicilio(cuit) print "\n".join(ret) if wsremcarne.Errores or wsremcarne.ErroresFormato: print "Errores:", wsremcarne.Errores, wsremcarne.ErroresFormato print "hecho." except SoapFault,e: print "Falla SOAP:", e.faultcode, e.faultstring.encode("ascii","ignore") sys.exit(3) except Exception, e: ex = utils.exception_info() print ex if DEBUG: raise sys.exit(5)
# Devuelve TA.xml (ticket de autorización de WSAA) __author__ = "Mariano Reingart ([email protected])" __copyright__ = "Copyright (C) 2008-2011 Mariano Reingart" __license__ = "GPL 3.0" __version__ = "2.11b" import hashlib, datetime, email, os, sys, time, traceback, warnings import unicodedata from pysimplesoap.client import SimpleXMLElement from utils import inicializar_y_capturar_excepciones, BaseWS, get_install_dir, \ exception_info, safe_console, date try: from M2Crypto import BIO, Rand, SMIME, SSL except ImportError: ex = exception_info() warnings.warn("No es posible importar M2Crypto (OpenSSL)") warnings.warn(ex['msg']) # revisar instalación y DLLs de OpenSSL BIO = Rand = SMIME = SSL = None # utilizar alternativa (ejecutar proceso por separado) from subprocess import Popen, PIPE from base64 import b64encode # Constantes (si se usa el script de linea de comandos) WSDL = "https://wsaahomo.afip.gov.ar/ws/services/LoginCms?wsdl" # El WSDL correspondiente al WSAA CERT = "reingart.crt" # El certificado X.509 obtenido de Seg. Inf. PRIVATEKEY = "reingart.key" # La clave privada del certificado CERT PASSPHRASE = "xxxxxxx" # La contraseña para firmar (si hay) SERVICE = "wsfe" # El nombre del web service al que se le pide el TA # WSAAURL: la URL para acceder al WSAA, verificar http/https y wsaa/wsaahomo
if '--grupos_carne' in sys.argv: ret = wsremcarne.ConsultarGruposCarne() print "\n".join(ret) if '--tipos_carne' in sys.argv: for grupo_carne in wsremcarne.ConsultarGruposCarne(sep=None): ret = wsremcarne.ConsultarTiposCarne(grupo_carne['codigo']) print "\n".join(ret) if '--codigos_domicilio' in sys.argv: cuit = raw_input("Cuit Titular Domicilio: ") ret = wsremcarne.ConsultarCodigosDomicilio(cuit) print "\n".join(ret) if wsremcarne.Errores or wsremcarne.ErroresFormato: print "Errores:", wsremcarne.Errores, wsremcarne.ErroresFormato print "hecho." except SoapFault, e: print "Falla SOAP:", e.faultcode, e.faultstring.encode( "ascii", "ignore") sys.exit(3) except Exception, e: ex = utils.exception_info() print ex if DEBUG: raise sys.exit(5)
def Consultar(self, nro_doc): "Llama a la API pública de AFIP para obtener los datos de una persona" n = 0 while n <= 4: n += 1 # reintentar 3 veces try: if not self.client: if DEBUG: warnings.warn("reconectando intento [%d]..." % n) self.Conectar() self.response = self.client("sr-padron", "v2", "persona", str(nro_doc)) except Exception as e: self.client = None ex = exception_info() self.Traceback = ex.get("tb", "") try: self.Excepcion = norm(ex.get("msg", "").replace("\n", "")) except: self.Excepcion = "<no disponible>" if DEBUG: warnings.warn("Error %s [%d]" % (self.Excepcion, n)) else: break else: return False result = json.loads(self.response) if result['success']: data = result['data'] # extraigo datos generales del contribuyente: self.cuit = data["idPersona"] self.tipo_persona = data["tipoPersona"] self.tipo_doc = TIPO_CLAVE.get(data["tipoClave"]) self.dni = data.get("numeroDocumento") self.estado = data.get("estadoClave") self.denominacion = data.get("nombre") # analizo el domicilio domicilio = data.get("domicilioFiscal") if domicilio: self.direccion = domicilio.get("direccion", "") self.localidad = domicilio.get("localidad", "") # no usado en CABA self.provincia = PROVINCIAS.get(domicilio.get("idProvincia"), "") self.cod_postal = domicilio.get("codPostal") else: self.direccion = self.localidad = self.provincia = "" self.cod_postal = "" # retrocompatibilidad: self.domicilios = ["%s - %s (%s) - %s" % ( self.direccion, self.localidad, self.cod_postal, self.provincia,) ] # analizo impuestos: self.impuestos = data.get("impuestos", []) self.actividades = data.get("actividades", []) if 32 in self.impuestos: self.imp_iva = "EX" elif 33 in self.impuestos: self.imp_iva = "NI" elif 34 in self.impuestos: self.imp_iva = "NA" else: self.imp_iva = "S" if 30 in self.impuestos else "N" mt = data.get("categoriasMonotributo", {}) self.monotributo = "S" if mt else "N" self.actividad_monotributo = "" # TODO: mt[0].get("idCategoria") self.integrante_soc = "" self.empleador = "S" if 301 in self.impuestos else "N" self.cat_iva = "" self.data = data else: error = result['error'] self.Excepcion = error['mensaje'] return True