Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 33 additions & 8 deletions ejemplos/padron/ws_sr_padron.bas
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,43 @@ Attribute VB_Name = "Module1"
' Ejemplo de Uso de Interface COM para consultar
' Padron Unico de Contribuyentes AFIP via webservice (servicio web WS-SR-Padron Alcance 4)
' Documentaci�n: http://www.sistemasagiles.com.ar/trac/wiki/PadronContribuyentesAFIP
' 2017 (C) Mariano Reingart <[email protected]>
' 2025 (C) Mariano Reingart <[email protected]>
' Licencia: GPLv3

Sub Main()
Dim Padron As Object, ok As Variant

' Crear la interfaz COM
Set Padron = CreateObject("WSSrPadronA4")
Set Padron = CreateObject("WSSrPadronA5")

Debug.Print Padron.Version
Debug.Print Padron.InstallDir

' Crear objeto interface Web Service Autenticaci�n y Autorizaci�n
Set WSAA = CreateObject("WSAA")
ta = WSAA.Autenticar("ws_sr_padron_a4", WSAA.InstallDir + "\reingart.crt", WSAA.InstallDir + "\reingart.key")

ok = Padron.Conectar()

' URL de produccion
wsaa_url = "https://wsaa.afip.gov.ar/ws/services/LoginCms"
padron_a5_url = "https://aws.afip.gov.ar/sr-padron/webservices/personaServiceA5"

' PRODUCCION !!
' ta = WSAA.Autenticar("ws_sr_constancia_inscripcion", WSAA.InstallDir + "\reingart.crt", WSAA.InstallDir + "\reingart.key", wsaa_url)

ta = WSAA.Autenticar("ws_sr_constancia_inscripcion", WSAA.InstallDir + "\reingart.crt", WSAA.InstallDir + "\reingart.key")

Padron.SetTicketAcceso ta
Padron.Cuit = "20267565393"
Padron.Cuit = "20471277534"

' PRODUCCION !!
' Padron.Token = WSAA.Token
' Padron.Sign = WSAA.Sign
' ok = Padron.Conectar("cache", padron_a5_url)

ok = Padron.Conectar()

' Consultar CUIT (online con AFIP):
id_persona = InputBox("Ingrese CUIT a buscar:", "Consultar Padron AFIP", "20000000516")
' Usar CUITs brindados por ARCA en Homologacion
id_persona = InputBox("Ingrese CUIT a buscar:", "Consultar Padron AFIP", "20201731594")
ok = Padron.Consultar(id_persona)
Debug.Print ok, Err.Description

Expand All @@ -44,13 +59,23 @@ Sub Main()
Debug.Print "IVA", Padron.imp_iva
Debug.Print "MT", Padron.monotributo, Padron.actividad_monotributo
Debug.Print "Empleador", Padron.empleador

' Muestro campos del Impuesto (actualizacion 1.06)
For Each id_impuesto In Padron.impuestos
Debug.Print "Id Impuesto: ", id_impuesto
Debug.Print "Descripcion Impuesto: ", Padron.ObtenerCampoImpuesto(id_impuesto, "descripcionImpuesto")
Debug.Print "Motivo: ", Padron.ObtenerCampoImpuesto(id_impuesto, "motivo")
Debug.Print "Estado Impuesto: ", Padron.ObtenerCampoImpuesto(id_impuesto, "estadoImpuesto")
Debug.Print "Periodo: ", Padron.ObtenerCampoImpuesto(id_impuesto, "periodo")
Next

If Padron.Excepcion = "" Then
MsgBox Padron.denominacion & " " & Padron.Estado & vbCrLf & Padron.direccion & vbCrLf & Padron.localidad & vbCrLf & Padron.provincia & vbCrLf & Padron.cod_postal, vbInformation, "Resultado CUIT " & Cuit & " (online AFIP)"
Else
' respuesta del servidor (para depuraci�n)
Debug.Print Padron.response
' Debug.Print Padron.response
MsgBox "Error AFIP: " & Padron.Excepcion, vbCritical, "Resultado CUIT " & Cuit & " (online)"
End If

End Sub

56 changes: 38 additions & 18 deletions ws_sr_padron.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.

"""M�dulo para acceder a los datos de un contribuyente registrado en el Padr�n
de AFIP (WS-SR-PADRON de AFIP). Consulta a Padr�n Alcance 4 version 1.1
Consulta de Padr�n Constancia Inscripci�n Alcance 5 version 2.0
"""Módulo para acceder a los datos de un contribuyente registrado en el Padrón
de AFIP (WS-SR-PADRON de AFIP). Consulta a Padrón Alcance 4 version 1.1
Consulta de Padrón Constancia Inscripción Alcance 5 version 2.0
"""

__author__ = "Mariano Reingart <[email protected]>"
__copyright__ = "Copyright (C) 2017-2022 Mariano Reingart"
__copyright__ = "Copyright (C) 2017-2025 Mariano Reingart"
__license__ = "GPL 3.0"
__version__ = "1.05a"
__version__ = "1.06a"

import csv
import datetime
Expand All @@ -40,11 +40,11 @@


class WSSrPadronA4(BaseWS):
"Interfaz para el WebService de Consulta Padr�n Contribuyentes Alcance 4"
"Interfaz para el WebService de Consulta Padrón Contribuyentes Alcance 4"
_public_methods_ = ['Consultar',
'AnalizarXml', 'ObtenerTagXml', 'LoadTestXML',
'SetParametros', 'SetTicketAcceso', 'GetParametro',
'Dummy', 'Conectar', 'DebugLog', 'SetTicketAcceso']
'Dummy', 'Conectar', 'DebugLog', 'SetTicketAcceso', "ObtenerCampoImpuesto"]
_public_attrs_ = ['Token', 'Sign', 'Cuit',
'AppServerStatus', 'DbServerStatus', 'AuthServerStatus',
'XmlRequest', 'XmlResponse', 'Version', 'InstallDir',
Expand All @@ -64,7 +64,7 @@ class WSSrPadronA4(BaseWS):
# Variables globales para BaseWS:
HOMO = HOMO
WSDL = WSDL
Version = "%s %s" % (__version__, HOMO and 'Homologaci�n' or '')
Version = "%s %s" % (__version__, HOMO and 'Homologación' or '')
Reprocesar = True # recuperar automaticamente CAE emitidos
LanzarExcepciones = LANZAR_EXCEPCIONES
factura = None
Expand Down Expand Up @@ -156,7 +156,7 @@ def Consultar(self, id_persona):
return True

def analizar_datos(self, cat_mt):
# intenta determinar situaci�n de IVA:
# intenta determinar situación de IVA:
if 32 in self.impuestos:
self.imp_iva = "EX"
elif 33 in self.impuestos:
Expand All @@ -169,7 +169,7 @@ def analizar_datos(self, cat_mt):
self.actividad_monotributo = cat_mt.get("descripcionCategoria") if cat_mt else ""
self.integrante_soc = ""
self.empleador = "S" if 301 in self.impuestos else "N"
# intenta determinar categor�a de IVA (confirmar)
# intenta determinar categoría de IVA (confirmar)
if self.imp_iva in ('AC', 'S'):
self.cat_iva = 1 # RI
elif self.imp_iva == 'EX':
Expand All @@ -182,7 +182,7 @@ def analizar_datos(self, cat_mt):


class WSSrPadronA5(WSSrPadronA4):
"Interfaz para el WebService de Consulta Padr�n Constancia de Inscripci�n Alcance 5"
"Interfaz para el WebService de Consulta Padrón Constancia de Inscripción Alcance 5"

_reg_progid_ = "WSSrPadronA5"
_reg_clsid_ = "{DF7447DD-EEF3-4E6B-A93B-F969B5075EC8}"
Expand Down Expand Up @@ -239,7 +239,7 @@ def Consultar(self, id_persona):
self.domicilio = "%s - %s (%s) - %s" % (
self.direccion, self.localidad,
self.cod_postal, self.provincia,)
# extraer datos impositivos (inscripci�n / opci�n) para unificarlos:
# extraer datos impositivos (inscripción / opción) para unificarlos:
data_mt = ret.get("datosMonotributo", {})
data_rg = ret.get("datosRegimenGeneral", {})
# analizo impuestos:
Expand All @@ -249,11 +249,23 @@ def Consultar(self, id_persona):
self.actividades = [act["idActividad"] for act in actividades]
cat_mt = data_mt.get("categoriaMonotributo", {})
self.analizar_datos(cat_mt)
self.impuestos_detallados = impuestos

return not self.errores

@inicializar_y_capturar_excepciones
def ObtenerCampoImpuesto(self, id_impuesto, campo):
"Devuelve el detalle de un campo del impuesto"
for impuesto in self.impuestos_detallados:
id_imp = impuesto.get("idImpuesto", "")
if id_impuesto == id_imp:
return impuesto.get(campo, "")

return ""


def main():
"Funci�n principal de pruebas (obtener CAE)"
"Función principal de pruebas (obtener CAE)"
import os, time
global CONFIG_FILE

Expand All @@ -275,8 +287,8 @@ def main():
key = config.get('WSAA', 'PRIVATEKEY')
cuit = config.get(SECTION, 'CUIT')
else:
crt, key = "reingart.crt", "reingart.key"
cuit = "20267565393"
crt, key = "inreingartwsass.crt", "inreingartwsass.key"
cuit = "20471277534"
url_wsaa = url_ws = None
if config.has_option('WSAA','URL'):
url_wsaa = config.get('WSAA', 'URL')
Expand Down Expand Up @@ -328,15 +340,15 @@ def main():
if e.faultstring != "No existe persona con ese Id":
raise
print 'ok' if ok else "error", padron.Excepcion
# domicilio posiblemente est� en Latin1, normalizar
# domicilio posiblemente estó en Latin1, normalizar
csv_writer.writerow([norm(getattr(padron, campo, ""))
for campo in columnas])
sys.exit(0)

try:

if "--prueba" in sys.argv:
id_persona = "20000000516"
id_persona = "20201731594"
else:
id_persona = len(sys.argv)>1 and sys.argv[1] or "20267565393"

Expand Down Expand Up @@ -364,6 +376,14 @@ def main():
print "MT", padron.monotributo, padron.actividad_monotributo
print "Empleador", padron.empleador

#agrego ObtenerCampoImpuesto
for id_impuesto in padron.impuestos:
print "Id Impuesto: ", id_impuesto
print "Descripcion Impuesto: ", padron.ObtenerCampoImpuesto(id_impuesto, "descripcion")
print "Motivo: ", padron.ObtenerCampoImpuesto(id_impuesto, "motivo")
print "Estado Impuesto: ", padron.ObtenerCampoImpuesto(id_impuesto, "estadoImpuesto")
print "Periodo: ", padron.ObtenerCampoImpuesto(id_impuesto, "periodo")

if padron.Excepcion:
print "Excepcion:", padron.Excepcion
# ver padron.errores para el detalle
Expand All @@ -374,7 +394,7 @@ def main():
print padron.XmlResponse


# busco el directorio de instalaci�n (global para que no cambie si usan otra dll)
# busco el directorio de instalación (global para que no cambie si usan otra dll)
INSTALL_DIR = WSSrPadronA4.InstallDir = WSSrPadronA5.InstallDir = get_install_dir()


Expand Down