Skip to content

Commit 55bf354

Browse files
authored
Merge pull request reingart#120 from reingart/2025
Update 2025 RG5616/24 WSFEv1 Version 4 + Ley 27743 Facturas B
2 parents 6a3147e + 718f3cd commit 55bf354

10 files changed

Lines changed: 392 additions & 25 deletions

File tree

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
'
2+
' Ejemplo de Uso de Interfaz PyAfipWs para Windows Script Host
3+
' (Visual Basic / Visual Fox y lenguages con soporte ActiveX simil OCX)
4+
' con Web Service Autenticación / Remito Electrónico Harina AFIP
5+
' 2018(C) Mariano Reingart <reingart@gmail.com>
6+
' Licencia: GPLv3
7+
' Requerimientos: scripts wsaa.py y wsfev1.py registrados (ver instaladores)
8+
' Documentacion:
9+
' http://www.sistemasagiles.com.ar/trac/wiki/RemitoElectronicoHarina
10+
' http://www.sistemasagiles.com.ar/trac/wiki/PyAfipWs
11+
' http://www.sistemasagiles.com.ar/trac/wiki/ManualPyAfipWs
12+
13+
' Crear el objeto WSAA (Web Service de Autenticación y Autorización) AFIP
14+
Set WSAA = Wscript.CreateObject("WSAA")
15+
Wscript.Echo "InstallDir", WSAA.InstallDir, WSAA.Version
16+
17+
' Solicitar Ticket de Acceso
18+
wsdl = "https://wsaahomo.afip.gov.ar/ws/services/LoginCms" ' Homologación!
19+
scriptdir = CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName)
20+
proxy = "" ' en caso de ser necesario: "usuario:clave@servidor:puerto"
21+
wrapper = "" ' usar "pycurl" como transporte alternativo en caso de inconvenientes con SSL
22+
cacert = "" ' para verificacion de canal seguro usar: "conf\afip_ca_info.crt"
23+
cache = "C:\WINDOWS\TEMP"
24+
ok = WSAA.Autenticar("wsremharina", scriptdir & "\..\reingart.crt", scriptdir & "\..\reingart.key", wsdl, proxy, wrapper, cacert, cache)
25+
Wscript.Echo "Excepcion", WSAA.Excepcion
26+
Wscript.Echo "Token", WSAA.Token
27+
Wscript.Echo "Sign", WSAA.Sign
28+
29+
' Crear el objeto WSRemHarina (Web Service de Remito Harinero) AFIP
30+
31+
Set WSRemHarina = Wscript.CreateObject("WSRemHarina")
32+
Wscript.Echo "WSRemHarina Version", WSRemHarina.Version
33+
34+
' Establecer parametros de uso:
35+
WSRemHarina.Cuit = "20267565393"
36+
WSRemHarina.Token = WSAA.Token
37+
WSRemHarina.Sign = WSAA.Sign
38+
39+
' Conectar al websrvice
40+
wsdl = "https://fwshomo.afip.gov.ar/wsremharina/RemHarinaService?wsdl"
41+
timeout = 30 ' tiempo de espera predeterminado
42+
WSRemHarina.Conectar cache, wsdl, proxy, wrapper, cacert, timeout
43+
44+
' Consultar último comprobante autorizado en AFIP
45+
tipo_comprobante = 993
46+
punto_emision = 1
47+
ult = 1
48+
49+
If ult = 0 Then
50+
ok = WSRemHarina.ConsultarUltimoRemitoEmitido(tipo_comprobante, punto_emision)
51+
52+
If ok Then
53+
ult = WSRemHarina.NroRemito
54+
Else
55+
Wscript.Echo WSRemHarina.Traceback, "Traceback"
56+
Wscript.Echo WSRemHarina.XmlResponse, "XmlResponse"
57+
Wscript.Echo WSRemHarina.XmlRequest, "XmlRequest"
58+
ult = 0
59+
End If
60+
Wscript.Echo ult, "Ultimo comprobante: "
61+
Wscript.Echo WSRemHarina.ErrMsg, "ErrMsg:"
62+
if WSRemHarina.Excepcion <> "" Then Wscript.Echo WSRemHarina.Excepcion, "Excepcion:"
63+
End If
64+
65+
' Calculo el próximo número de comprobante:
66+
If ult = "" Then
67+
nro_remito = 0 ' no hay comprobantes emitidos
68+
Else
69+
nro_remito = CLng(ult) ' convertir a entero largo
70+
End If
71+
nro_remito = nro_remito + 1
72+
73+
' Establezco los valores del remito a autorizar:
74+
tipo_movimiento = "ENV" ' ENV: envio, RET: retiro, CAN: canje, RED: redestino
75+
cuit_titular = "20267565393"
76+
es_entrega_mostrador = "N"
77+
es_mercaderia_consignacion = "N"
78+
cuit_titular = "20267565393"
79+
importe_cot = "10000.0"
80+
tipo_emisor = "I" ' U: Usiario de molienda de trigo I: Industrial
81+
ruca_est_emisor = 1031
82+
cod_rem_redestinar = Null
83+
cod_remito = Null
84+
estado = Null
85+
observaciones = Null
86+
87+
ok = WSRemHarina.CrearRemito(tipo_comprobante, punto_emision, tipo_movimiento, _
88+
cuit_titular, es_entrega_mostrador, es_mercaderia_consignacion, _
89+
importe_cot, _
90+
tipo_emisor, ruca_est_emisor, _
91+
cod_rem_redestinar, _
92+
cod_remito, estado, observaciones)
93+
94+
cuit_pais_receptor = "55000002002"
95+
cuit_receptor = "20111111112"
96+
tipo_dom_receptor = 1 ' 1: fiscal, 3: comercial
97+
cod_dom_receptor = 1234
98+
cuit_despachante = Null
99+
codigo_aduana = Null
100+
denominacion_receptor = Null
101+
domicilio_receptor = Null
102+
103+
ok = WSRemHarina.AgregarReceptor(cuit_pais_receptor, _
104+
cuit_receptor, tipo_dom_receptor, cod_dom_receptor, _
105+
cuit_despachante, codigo_aduana, _
106+
denominacion_receptor, domicilio_receptor):
107+
108+
tipo_depositario = "E" ' I: Industrial de Molino/Trigo, E: Emisor D: Depositario
109+
cuit_depositario = "23000000019"
110+
ruca_est_depositario = 7297
111+
tipo_dom_origen = 1
112+
cod_dom_origen = 1
113+
114+
ok = WSRemHarina.AgregarDepositario(tipo_depositario, cuit_depositario, ruca_est_depositario, _
115+
tipo_dom_origen=None, cod_dom_origen)
116+
117+
' Agrego el viaje:
118+
fecha_inicio_viaje = "2018-10-01"
119+
distancia_km = 999
120+
ok = WSRemHarina.AgregarViaje(fecha_inicio_viaje, distancia_km)
121+
122+
cod_pais_transportista = 200
123+
cuit_transportista = "20333333334"
124+
cuit_conductor = "20333333334"
125+
apellido_conductor = Null
126+
cedula_conductor = Null
127+
denom_transportista = Null
128+
id_impositivo = Null
129+
nombre_conductor = Null
130+
131+
ok = WSRemHarina.AgregarTransportista(cod_pais_transportista, _
132+
cuit_transportista, cuit_conductor, _
133+
apellido_conductor, cedula_conductor, denom_transportista, _
134+
id_impositivo, nombre_conductor)
135+
136+
' Agregar vehiculo al viaje
137+
dominio_vehiculo = "AAA000"
138+
dominio_acoplado = "ZZZ000"
139+
ok = WSRemHarina.AgregarVehiculo(dominio_vehiculo, dominio_acoplado)
140+
141+
' Agregar Mercaderia
142+
orden = 1
143+
cod_tipo = 0
144+
cod_tipo_emb = 0
145+
cantidad_emb = 0
146+
cod_tipo_unidad = 0
147+
cant_unidad = 0
148+
ok = WSRemHarina.AgregarMercaderia(orden, cod_tipo, cod_tipo_emb, cantidad_emb, cod_tipo_unidad, cant_unidad)
149+
150+
' WSRemHarina.AgregarContingencias(tipo=1, observacion="anulacion")
151+
152+
' Solicito CodRemito:
153+
id_req = Int(DateDiff("s","24-Sep-23 00:00:00", Now)) ' usar un numero interno único / clave primaria (id_remito)
154+
archivo = "qr.png"
155+
ok = WSRemHarina.GenerarRemito(id_req, archivo)
156+
157+
If not ok Then
158+
' Imprimo pedido y respuesta XML para depuración (errores de formato)
159+
Wscript.Echo "Traceback", WSRemHarina.Traceback
160+
Wscript.Echo "XmlResponse", WSRemHarina.XmlResponse
161+
Wscript.Echo "XmlRequest", WSRemHarina.XmlRequest
162+
End If
163+
164+
Wscript.Echo "Resultado: ", WSRemHarina.Resultado
165+
Wscript.Echo "Cod Remito: ", WSRemHarina.CodRemito
166+
If WSRemHarina.CodAutorizacion Then
167+
Wscript.Echo "Numero Remito: ", WSRemHarina.NumeroRemito
168+
Wscript.Echo "Cod Autorizacion: ", WSRemHarina.CodAutorizacion
169+
Wscript.Echo "Fecha Emision", WSRemHarina.FechaEmision
170+
Wscript.Echo "Fecha Vencimiento", WSRemHarina.FechaVencimiento
171+
End If
172+
Wscript.Echo "Estado: ", WSRemHarina.Estado
173+
Wscript.Echo "Observaciones: ", WSRemHarina.Obs
174+
Wscript.Echo "Errores:", WSRemHarina.ErrMsg
175+
Wscript.Echo "Evento:", WSRemHarina.Evento
176+
177+
MsgBox "Resultado:" & WSRemHarina.Resultado & " CodRemito: " & WSRemHarina.CodRemito, vbInformation + vbOKOnly

pyfepdf.py

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
__author__ = "Mariano Reingart <reingart@gmail.com>"
2929
__copyright__ = "Copyright (C) 2011-2021 Mariano Reingart"
3030
__license__ = "LGPL-3.0-or-later"
31-
__version__ = "3.10c"
31+
__version__ = "3.11c"
3232

3333
DEBUG = False
3434
HOMO = False
@@ -1179,6 +1179,10 @@ def ProcesarPlantilla(self, num_copias=3, lineas_max=36, qty_pos="izq"):
11791179
if not f.has_key("leyenda_credito_fiscal") and motivos_ds:
11801180
motivos_ds += msg_no_iva
11811181

1182+
# Facturas B Ley 27743
1183+
cat_iva_rg = fact.get('categoria', fact.get('id_impositivo', '')).upper()
1184+
consumidor_final = ("CONS" in cat_iva_rg and "FINAL" in cat_iva_rg) or ("EXENTO" in cat_iva_rg)
1185+
11821186
copias = {1: "Original", 2: "Duplicado", 3: "Triplicado"}
11831187

11841188
for copia in range(1, num_copias + 1):
@@ -1292,6 +1296,7 @@ def ProcesarPlantilla(self, num_copias=3, lineas_max=36, qty_pos="izq"):
12921296
li = 0
12931297
k = 0
12941298
subtotal = Decimal("0.00")
1299+
iva_liq = Decimal("0.00")
12951300
for it in li_items:
12961301
k = k + 1
12971302
if k > hoja * (lineas_max - 1):
@@ -1319,12 +1324,22 @@ def ProcesarPlantilla(self, num_copias=3, lineas_max=36, qty_pos="izq"):
13191324
# solo discriminar IVA en A/M (mostrar tasa en B)
13201325
if letra_fact in ("A", "M", "B"):
13211326
if it.get("iva_id") is not None:
1322-
f.set("Item.IvaId%02d" % li, it["iva_id"])
1323-
if it["iva_id"]:
1324-
f.set(
1325-
"Item.AlicuotaIva%02d" % li,
1326-
self.fmt_iva(it["iva_id"]),
1327-
)
1327+
if letra_fact != "B" or consumidor_final:
1328+
f.set("Item.IvaId%02d" % li, it["iva_id"])
1329+
if it["iva_id"]:
1330+
f.set(
1331+
"Item.AlicuotaIva%02d" % li,
1332+
self.fmt_iva(it["iva_id"]),
1333+
)
1334+
imp_it_iva = Decimal(it['imp_iva'] or "0.00")
1335+
if not imp_it_iva and it['importe']:
1336+
p = self.ivas_ds[int(it['iva_id'])]
1337+
importe_it = Decimal(it['importe'])
1338+
if p == int(p):
1339+
imp_it_bruto = importe_it / (Decimal(p) / Decimal(100) + Decimal(1))
1340+
imp_it_iva = importe_it - imp_it_bruto
1341+
iva_liq += imp_it_iva
1342+
13281343
if letra_fact in ("A", "M"):
13291344
if it.get("imp_iva") is not None:
13301345
f.set(
@@ -1464,6 +1479,15 @@ def ProcesarPlantilla(self, num_copias=3, lineas_max=36, qty_pos="izq"):
14641479
f.set("NETO.L", "")
14651480
f.set("IVA.L", "")
14661481
f.set("LeyendaIVA", "")
1482+
# Facturas B Ley 27743
1483+
if letra_fact == "B" and consumidor_final:
1484+
if fact.get('impto_liq', fact.get('imp_iva')):
1485+
iva_liq = fact.get('impto_liq', fact.get('imp_iva'))
1486+
f.set('IVA.L', "IVA Contenido:")
1487+
else:
1488+
f.set('IVA.L', "IVA Contenido (*est.):")
1489+
f.set('IVALIQ', self.fmt_imp(iva_liq))
1490+
f.set('LeyendaIVA', "Regimen de Transparencia Fiscal al Consumidor (Ley 27.743)")
14671491
for p in list(self.ivas_ds.values()):
14681492
f.set("IVA%s.L" % p, "")
14691493
f.set("NETO%s.L" % p, "")
@@ -2102,4 +2126,4 @@ def main():
21022126
return fepdf
21032127

21042128
if __name__ == "__main__":
2105-
main()
2129+
main()

pyqr.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ def GenerarImagen(
154154

155155

156156
def main():
157+
url = None
157158
if "--register" in sys.argv or "--unregister" in sys.argv:
158159
import pythoncom
159160
if TYPELIB:
@@ -294,4 +295,4 @@ def main():
294295
return url
295296

296297
if __name__ == "__main__":
297-
main()
298+
main()

0 commit comments

Comments
 (0)