11Attribute VB_Name = "Modulo1"
22' Ejemplo de Uso de Interface COM con Web Service Factura Electrónica Mercado Interno AFIP
33' Según RG2485 y RG2904 Artículo 4 Opción B (sin detalle, Version 1)
4- ' 2010 (C) Mariano Reingart <[email protected] > 4+ ' 2025 (C) Mariano Reingart <[email protected] > 55' Licencia: GPLv3
66
77Sub Main ()
@@ -11,110 +11,94 @@ Sub Main()
1111
1212 ' Crear objeto interface Web Service Autenticación y Autorización
1313 Set WSAA = CreateObject("WSAA" )
14- Debug.Print WSAA.Version
15- If WSAA.Version < "2.04" Then
16- MsgBox "Debe instalar una versión más actualizada de PyAfipWs WSAA!"
17- End
18- End If
19-
20- ' deshabilito errores no manejados (version 2.04 o superior)
21- WSAA.LanzarExcepciones = False
22-
23- ' Generar un Ticket de Requerimiento de Acceso (TRA) para WSFEv1
24- ttl = 36000 ' tiempo de vida = 10hs hasta expiración
25- tra = WSAA.CreateTRA("wsfe" , ttl)
26- ControlarExcepcion WSAA
27- Debug.Print tra
2814
29- ' Especificar la ubicacion de los archivos certificado y clave privada
30- Path = WSAA.InstallDir + "\" ' para ruta actual, usar CurDir()
31- ' Certificado: certificado es el firmado por la AFIP
32- ' ClavePrivada: la clave privada usada para crear el certificado
33- Certificado = "reingart.crt" ' certificado de prueba
34- ClavePrivada = "reingart.key" ' clave privada de prueba
15+ ' inicializo las variables:
16+ token = ""
17+ sign = ""
3518
36- ' Generar el mensaje firmado (CMS)
37- cms = WSAA.SignTRA(tra, Path + Certificado, Path + ClavePrivada)
38- ControlarExcepcion WSAA
39- Debug.Print cms
19+ ' busco un ticket de acceso previamente almacenado:
20+ If Dir("ta.xml" ) <> "" Then
21+ ' leo el xml almacenado del archivo
22+ Open "ta.xml" For Input As #1
23+ Line Input #1 , ta_xml
24+ Close #1
25+ ' analizo el ticket de acceso previo:
26+ ok = WSAA.AnalizarXml(ta_xml)
27+ If Not WSAA.Expirado() Then
28+ ' puedo reusar el ticket de acceso:
29+ token = WSAA.ObtenerTagXml("token" )
30+ sign = WSAA.ObtenerTagXml("sign" )
31+ End If
32+ End If
4033
41- ' Conectarse con el webservice de autenticación:
42- cache = ""
43- proxy = "" '"usuario:clave@localhost:8000"
44- wrapper = "" ' libreria http (httplib2, urllib2, pycurl)
45- cacert = WSAA.InstallDir & "\conf\afip_ca_info.crt" ' certificado de la autoridad de certificante
46- wsdl = "https://wsaahomo.afip.gov.ar/ws/services/LoginCms?wsdl"
47- ok = WSAA.Conectar(cache, wsdl, proxy, wrapper, cacert) ' Homologación
48- ControlarExcepcion WSAA
34+ ' Si no reuso un ticket de acceso, solicito uno nuevo:
35+ If token = "" Or sign = "" Then
36+ ' Generar un Ticket de Requerimiento de Acceso (TRA)
37+ tra = WSAA.CreateTRA("wsfe" , 43200 ) ' 3600*12hs
38+
39+ Path = WSAA.InstallDir + "\"
40+
41+ ' Especificar la ubicacion de los archivos certificado y clave privada
42+ cert = "reingart.crt" ' certificado de prueba
43+ clave = "reingart.key" ' clave privada de prueba
44+ ' Generar el mensaje firmado (CMS)
45+ cms = WSAA.SignTRA(tra, Path + cert, Path + clave)
46+ If cms <> "" Then
47+ ' Llamar al web service para autenticar (cambiar URL para produccion):
48+ wsdl = "https://wsaahomo.afip.gov.ar/ws/services/LoginCms?wsdl"
49+ ok = WSAA.Conectar("" , wsdl)
50+ ta_xml = WSAA.LoginCMS(cms)
51+ If ta_xml <> "" Then
52+ ' guardo el ticket de acceso en el archivo
53+ Open "ta.xml" For Output As #1
54+ Print #1 , ta_xml
55+ Close #1
56+ End If
57+ token = WSAA.token
58+ sign = WSAA.sign
59+ End If
60+ ' reviso que no haya errores:
61+ Debug.Print "Excepcion:" , WSAA.Excepcion
62+ If WSAA.Excepcion <> "" Then
63+ Debug.Print WSAA.Traceback
64+ End If
4965
50- ' Llamar al web service para autenticar:
51- ta = WSAA.LoginCMS(cms)
52- ControlarExcepcion WSAA
53-
66+ End If
5467 ' Imprimir el ticket de acceso, ToKen y Sign de autorización
5568 Debug.Print ta
56- Debug.Print "Token:" , WSAA.Token
57- Debug.Print "Sign:" , WSAA.Sign
69+ Debug.Print "Token:" , token
70+ Debug.Print "Sign:" , sign
5871
59- ' Una vez obtenido, se puede usar el mismo token y sign por 10 horas
72+ ' Una vez obtenido, se puede usar el mismo token y sign por 24 horas
6073 ' (este período se puede cambiar)
61- ' revisar WSAA.Expirado() y en dicho caso tramitar nuevo TA
6274
63- ' Crear objeto interface Web Service de Factura Electrónica de Mercado Interno
75+ ' Crear objeto interface Web Service de Factura Electrónica Mercado Interno
6476 Set WSFEv1 = CreateObject("WSFEv1" )
65- Debug.Print WSFEv1.Version
66- If WSAA.Version < "1.12" Then
67- MsgBox "Debe instalar una versión mas actualizada de PyAfipWs WSFEv1!"
68- End
69- End If
70- 'Debug.Print WSFEv1.InstallDir
71-
7277 ' Setear tocken y sing de autorización (pasos previos)
73- WSFEv1.Token = WSAA.Token
74- WSFEv1.Sign = WSAA.Sign
78+ WSFEv1.token = token
79+ WSFEv1.sign = sign
7580
7681 ' CUIT del emisor (debe estar registrado en la AFIP)
7782 WSFEv1.Cuit = "20267565393"
7883
79- ' deshabilito errores no manejados
80- WSFEv1.LanzarExcepciones = False
81-
8284 ' Conectar al Servicio Web de Facturación
83- proxy = "" ' "usuario:clave@localhost:8000"
84- wsdl = "https://wswhomo.afip.gov.ar/wsfev1/service.asmx?WSDL"
85- cache = "" 'Path
86- wrapper = "" ' libreria http (httplib2, urllib2, pycurl)
87- cacert = WSAA.InstallDir & "\conf\afip_ca_info.crt" ' certificado de la autoridad de certificante (solo pycurl)
88-
89- ok = WSFEv1.Conectar(cache, wsdl, proxy, wrapper, cacert) ' homologación
90- Debug.Print WSFEv1.Version
91- ControlarExcepcion WSFEv1
92-
93- ' mostrar bitácora de depuración:
94- Debug.Print WSFEv1.DebugLog
95-
85+ wsdl = "" ' "file:///C:/pyafipws/wsfev1_wsdl.xml"
86+ ok = WSFEv1.Conectar("" , wsdl) ' produccion
9687 ' Llamo a un servicio nulo, para obtener el estado del servidor (opcional)
9788 WSFEv1.Dummy
9889 ControlarExcepcion WSFEv1
9990 Debug.Print "appserver status" , WSFEv1.AppServerStatus
10091 Debug.Print "dbserver status" , WSFEv1.DbServerStatus
10192 Debug.Print "authserver status" , WSFEv1.AuthServerStatus
102-
103- ' Establezco los valores de la factura a autorizar:
104- tipo_cbte = 6
105- punto_vta = 4004
106- cbte_nro = WSFEv1.CompUltimoAutorizado(tipo_cbte, punto_vta)
107- ControlarExcepcion WSFEv1
108- For Each v In WSFEv1.errores
109- Debug.Print v
110- Next
111- Debug.Print WSFEv1.errmsg
112- Debug.Print WSFEv1.errcode
113- If cbte_nro = "" Then
114- cbte_nro = 0 ' no hay comprobantes emitidos
115- Else
116- cbte_nro = CLng(cbte_nro) ' convertir a entero largo
117- End If
93+
94+
95+
96+ TipoCamioAfip = WSFEv1.ParamGetCotizacion("DOL" , "20250403" )
97+ Debug.Print WSFEv1.XmlRequest
98+ Debug.Print WSFEv1.XmlResponse
99+ MsgBox TipoCambioAfip
100+
101+ cbte_nro = CInt(WSFEv1.CompUltimoAutorizado(tipo_cbte, punto_vta)) + 1
118102 fecha = Format(Date , "yyyymmdd" )
119103 concepto = 1
120104 tipo_doc = 80 : nro_doc = "33693450239"
@@ -187,6 +171,10 @@ Sub Main()
187171
188172 ' Habilito reprocesamiento automático (predeterminado):
189173 WSFEv1.Reprocesar = True
174+
175+ ' Agrego RG 5616
176+ ok = WSFEv1.EstablecerCampoFactura("cancela_misma_moneda_ext" , "N" )
177+ ok = WSFEv1.EstablecerCampoFactura("condicion_iva_receptor_id" , "5" )
190178
191179 ' Solicito CAE:
192180 CAE = WSFEv1.CAESolicitar()
0 commit comments