Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update 2025 #120

Merged
merged 20 commits into from
Mar 8, 2025
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
177 changes: 177 additions & 0 deletions ejemplos/remito_electronico_harina.vbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
'
' Ejemplo de Uso de Interfaz PyAfipWs para Windows Script Host
' (Visual Basic / Visual Fox y lenguages con soporte ActiveX simil OCX)
' con Web Service Autenticación / Remito Electrónico Harina AFIP
' 2018(C) Mariano Reingart <[email protected]>
' Licencia: GPLv3
' Requerimientos: scripts wsaa.py y wsfev1.py registrados (ver instaladores)
' Documentacion:
' http://www.sistemasagiles.com.ar/trac/wiki/RemitoElectronicoHarina
' http://www.sistemasagiles.com.ar/trac/wiki/PyAfipWs
' http://www.sistemasagiles.com.ar/trac/wiki/ManualPyAfipWs

' Crear el objeto WSAA (Web Service de Autenticación y Autorización) AFIP
Set WSAA = Wscript.CreateObject("WSAA")
Wscript.Echo "InstallDir", WSAA.InstallDir, WSAA.Version

' Solicitar Ticket de Acceso
wsdl = "https://wsaahomo.afip.gov.ar/ws/services/LoginCms" ' Homologación!
scriptdir = CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName)
proxy = "" ' en caso de ser necesario: "usuario:clave@servidor:puerto"
wrapper = "" ' usar "pycurl" como transporte alternativo en caso de inconvenientes con SSL
cacert = "" ' para verificacion de canal seguro usar: "conf\afip_ca_info.crt"
cache = "C:\WINDOWS\TEMP"
ok = WSAA.Autenticar("wsremharina", scriptdir & "\..\reingart.crt", scriptdir & "\..\reingart.key", wsdl, proxy, wrapper, cacert, cache)
Wscript.Echo "Excepcion", WSAA.Excepcion
Wscript.Echo "Token", WSAA.Token
Wscript.Echo "Sign", WSAA.Sign

' Crear el objeto WSRemHarina (Web Service de Remito Harinero) AFIP

Set WSRemHarina = Wscript.CreateObject("WSRemHarina")
Wscript.Echo "WSRemHarina Version", WSRemHarina.Version

' Establecer parametros de uso:
WSRemHarina.Cuit = "20267565393"
WSRemHarina.Token = WSAA.Token
WSRemHarina.Sign = WSAA.Sign

' Conectar al websrvice
wsdl = "https://fwshomo.afip.gov.ar/wsremharina/RemHarinaService?wsdl"
timeout = 30 ' tiempo de espera predeterminado
WSRemHarina.Conectar cache, wsdl, proxy, wrapper, cacert, timeout

' Consultar último comprobante autorizado en AFIP
tipo_comprobante = 993
punto_emision = 1
ult = 1

If ult = 0 Then
ok = WSRemHarina.ConsultarUltimoRemitoEmitido(tipo_comprobante, punto_emision)

If ok Then
ult = WSRemHarina.NroRemito
Else
Wscript.Echo WSRemHarina.Traceback, "Traceback"
Wscript.Echo WSRemHarina.XmlResponse, "XmlResponse"
Wscript.Echo WSRemHarina.XmlRequest, "XmlRequest"
ult = 0
End If
Wscript.Echo ult, "Ultimo comprobante: "
Wscript.Echo WSRemHarina.ErrMsg, "ErrMsg:"
if WSRemHarina.Excepcion <> "" Then Wscript.Echo WSRemHarina.Excepcion, "Excepcion:"
End If

' Calculo el próximo número de comprobante:
If ult = "" Then
nro_remito = 0 ' no hay comprobantes emitidos
Else
nro_remito = CLng(ult) ' convertir a entero largo
End If
nro_remito = nro_remito + 1

' Establezco los valores del remito a autorizar:
tipo_movimiento = "ENV" ' ENV: envio, RET: retiro, CAN: canje, RED: redestino
cuit_titular = "20267565393"
es_entrega_mostrador = "N"
es_mercaderia_consignacion = "N"
cuit_titular = "20267565393"
importe_cot = "10000.0"
tipo_emisor = "I" ' U: Usiario de molienda de trigo I: Industrial
ruca_est_emisor = 1031
cod_rem_redestinar = Null
cod_remito = Null
estado = Null
observaciones = Null

ok = WSRemHarina.CrearRemito(tipo_comprobante, punto_emision, tipo_movimiento, _
cuit_titular, es_entrega_mostrador, es_mercaderia_consignacion, _
importe_cot, _
tipo_emisor, ruca_est_emisor, _
cod_rem_redestinar, _
cod_remito, estado, observaciones)

cuit_pais_receptor = "55000002002"
cuit_receptor = "20111111112"
tipo_dom_receptor = 1 ' 1: fiscal, 3: comercial
cod_dom_receptor = 1234
cuit_despachante = Null
codigo_aduana = Null
denominacion_receptor = Null
domicilio_receptor = Null

ok = WSRemHarina.AgregarReceptor(cuit_pais_receptor, _
cuit_receptor, tipo_dom_receptor, cod_dom_receptor, _
cuit_despachante, codigo_aduana, _
denominacion_receptor, domicilio_receptor):

tipo_depositario = "E" ' I: Industrial de Molino/Trigo, E: Emisor D: Depositario
cuit_depositario = "23000000019"
ruca_est_depositario = 7297
tipo_dom_origen = 1
cod_dom_origen = 1

ok = WSRemHarina.AgregarDepositario(tipo_depositario, cuit_depositario, ruca_est_depositario, _
tipo_dom_origen=None, cod_dom_origen)

' Agrego el viaje:
fecha_inicio_viaje = "2018-10-01"
distancia_km = 999
ok = WSRemHarina.AgregarViaje(fecha_inicio_viaje, distancia_km)

cod_pais_transportista = 200
cuit_transportista = "20333333334"
cuit_conductor = "20333333334"
apellido_conductor = Null
cedula_conductor = Null
denom_transportista = Null
id_impositivo = Null
nombre_conductor = Null

ok = WSRemHarina.AgregarTransportista(cod_pais_transportista, _
cuit_transportista, cuit_conductor, _
apellido_conductor, cedula_conductor, denom_transportista, _
id_impositivo, nombre_conductor)

' Agregar vehiculo al viaje
dominio_vehiculo = "AAA000"
dominio_acoplado = "ZZZ000"
ok = WSRemHarina.AgregarVehiculo(dominio_vehiculo, dominio_acoplado)

' Agregar Mercaderia
orden = 1
cod_tipo = 0
cod_tipo_emb = 0
cantidad_emb = 0
cod_tipo_unidad = 0
cant_unidad = 0
ok = WSRemHarina.AgregarMercaderia(orden, cod_tipo, cod_tipo_emb, cantidad_emb, cod_tipo_unidad, cant_unidad)

' WSRemHarina.AgregarContingencias(tipo=1, observacion="anulacion")

' Solicito CodRemito:
id_req = Int(DateDiff("s","24-Sep-23 00:00:00", Now)) ' usar un numero interno único / clave primaria (id_remito)
archivo = "qr.png"
ok = WSRemHarina.GenerarRemito(id_req, archivo)

If not ok Then
' Imprimo pedido y respuesta XML para depuración (errores de formato)
Wscript.Echo "Traceback", WSRemHarina.Traceback
Wscript.Echo "XmlResponse", WSRemHarina.XmlResponse
Wscript.Echo "XmlRequest", WSRemHarina.XmlRequest
End If

Wscript.Echo "Resultado: ", WSRemHarina.Resultado
Wscript.Echo "Cod Remito: ", WSRemHarina.CodRemito
If WSRemHarina.CodAutorizacion Then
Wscript.Echo "Numero Remito: ", WSRemHarina.NumeroRemito
Wscript.Echo "Cod Autorizacion: ", WSRemHarina.CodAutorizacion
Wscript.Echo "Fecha Emision", WSRemHarina.FechaEmision
Wscript.Echo "Fecha Vencimiento", WSRemHarina.FechaVencimiento
End If
Wscript.Echo "Estado: ", WSRemHarina.Estado
Wscript.Echo "Observaciones: ", WSRemHarina.Obs
Wscript.Echo "Errores:", WSRemHarina.ErrMsg
Wscript.Echo "Evento:", WSRemHarina.Evento

MsgBox "Resultado:" & WSRemHarina.Resultado & " CodRemito: " & WSRemHarina.CodRemito, vbInformation + vbOKOnly
40 changes: 32 additions & 8 deletions pyfepdf.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
__author__ = "Mariano Reingart <[email protected]>"
__copyright__ = "Copyright (C) 2011-2021 Mariano Reingart"
__license__ = "LGPL-3.0-or-later"
__version__ = "3.10c"
__version__ = "3.11c"

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

# Facturas B Ley 27743
cat_iva_rg = fact.get('categoria', fact.get('id_impositivo', '')).upper()
consumidor_final = ("CONS" in cat_iva_rg and "FINAL" in cat_iva_rg) or ("EXENTO" in cat_iva_rg)

copias = {1: "Original", 2: "Duplicado", 3: "Triplicado"}

for copia in range(1, num_copias + 1):
Expand Down Expand Up @@ -1292,6 +1296,7 @@ def ProcesarPlantilla(self, num_copias=3, lineas_max=36, qty_pos="izq"):
li = 0
k = 0
subtotal = Decimal("0.00")
iva_liq = Decimal("0.00")
for it in li_items:
k = k + 1
if k > hoja * (lineas_max - 1):
Expand Down Expand Up @@ -1319,12 +1324,22 @@ def ProcesarPlantilla(self, num_copias=3, lineas_max=36, qty_pos="izq"):
# solo discriminar IVA en A/M (mostrar tasa en B)
if letra_fact in ("A", "M", "B"):
if it.get("iva_id") is not None:
f.set("Item.IvaId%02d" % li, it["iva_id"])
if it["iva_id"]:
f.set(
"Item.AlicuotaIva%02d" % li,
self.fmt_iva(it["iva_id"]),
)
if letra_fact != "B" or consumidor_final:
f.set("Item.IvaId%02d" % li, it["iva_id"])
if it["iva_id"]:
f.set(
"Item.AlicuotaIva%02d" % li,
self.fmt_iva(it["iva_id"]),
)
imp_it_iva = Decimal(it['imp_iva'] or "0.00")
if not imp_it_iva and it['importe']:
p = self.ivas_ds[int(it['iva_id'])]
importe_it = Decimal(it['importe'])
if p == int(p):
imp_it_bruto = importe_it / (Decimal(p) / Decimal(100) + Decimal(1))
imp_it_iva = importe_it - imp_it_bruto
iva_liq += imp_it_iva

if letra_fact in ("A", "M"):
if it.get("imp_iva") is not None:
f.set(
Expand Down Expand Up @@ -1464,6 +1479,15 @@ def ProcesarPlantilla(self, num_copias=3, lineas_max=36, qty_pos="izq"):
f.set("NETO.L", "")
f.set("IVA.L", "")
f.set("LeyendaIVA", "")
# Facturas B Ley 27743
if letra_fact == "B" and consumidor_final:
if fact.get('impto_liq', fact.get('imp_iva')):
iva_liq = fact.get('impto_liq', fact.get('imp_iva'))
f.set('IVA.L', "IVA Contenido:")
else:
f.set('IVA.L', "IVA Contenido (*est.):")
f.set('IVALIQ', self.fmt_imp(iva_liq))
f.set('LeyendaIVA', "Regimen de Transparencia Fiscal al Consumidor (Ley 27.743)")
for p in list(self.ivas_ds.values()):
f.set("IVA%s.L" % p, "")
f.set("NETO%s.L" % p, "")
Expand Down Expand Up @@ -2102,4 +2126,4 @@ def main():
return fepdf

if __name__ == "__main__":
main()
main()
3 changes: 2 additions & 1 deletion pyqr.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ def GenerarImagen(


def main():
url = None
if "--register" in sys.argv or "--unregister" in sys.argv:
import pythoncom
if TYPELIB:
Expand Down Expand Up @@ -294,4 +295,4 @@ def main():
return url

if __name__ == "__main__":
main()
main()
Loading
Loading