Skip to content

Commit

Permalink
futurize *.py -w
Browse files Browse the repository at this point in the history
  • Loading branch information
reingart committed Feb 23, 2021
1 parent c272f7b commit 1d4bb71
Show file tree
Hide file tree
Showing 49 changed files with 3,391 additions and 2,966 deletions.
52 changes: 28 additions & 24 deletions cot.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,11 @@
# Ejemplos iniciales gracias a "Matias Gieco matigro@gmail.com"

"Módulo para obtener remito electrónico automático (COT)"
from __future__ import print_function
from __future__ import absolute_import

from builtins import str
from builtins import object
__author__ = "Mariano Reingart (reingart@gmail.com)"
__copyright__ = "Copyright (C) 2010 Mariano Reingart"
__license__ = "LGPL 3.0"
Expand All @@ -23,7 +27,7 @@
import os, sys, traceback
from pysimplesoap.simplexml import SimpleXMLElement

from utils import WebClient
from .utils import WebClient

HOMO = False
CACERT = "conf/arba.crt" # establecimiento de canal seguro (en producción)
Expand All @@ -34,7 +38,7 @@
#URL = "https://cot.arba.gov.ar/TransporteBienes/SeguridadCliente/presentarRemitos.do" # prod.


class COT:
class COT(object):
"Interfaz para el servicio de Remito Electronico ARBA"
_public_methods_ = ['Conectar', 'PresentarRemito', 'LeerErrorValidacion',
'LeerValidacionRemito',
Expand Down Expand Up @@ -120,11 +124,11 @@ def PresentarRemito(self, filename, testing=""):
# establecer valores del primer remito (sin eliminarlo)
self.LeerValidacionRemito(pop=False)
return True
except Exception, e:
ex = traceback.format_exception( sys.exc_type, sys.exc_value, sys.exc_traceback)
except Exception as e:
ex = traceback.format_exception( sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2])
self.Traceback = ''.join(ex)
try:
self.Excepcion = traceback.format_exception_only( sys.exc_type, sys.exc_value)[0]
self.Excepcion = traceback.format_exception_only( sys.exc_info()[0], sys.exc_info()[1])[0]
except:
self.Excepcion = u"<no disponible>"
return False
Expand Down Expand Up @@ -168,7 +172,7 @@ def AnalizarXml(self, xml=""):
xml = self.XmlResponse
self.xml = SimpleXMLElement(xml)
return True
except Exception, e:
except Exception as e:
self.Excepcion = u"%s" % (e)
return False

Expand All @@ -183,7 +187,7 @@ def ObtenerTagXml(self, *tags):
xml = xml(tag) # atajo a getitem y getattr
# vuelvo a convertir a string el objeto xml encontrado
return str(xml)
except Exception, e:
except Exception as e:
self.Excepcion = u"%s" % (e)


Expand All @@ -205,7 +209,7 @@ def ObtenerTagXml(self, *tags):
win32com.server.register.UseCommandLine(COT)
sys.exit(0)
elif len(sys.argv)<4:
print "Se debe especificar el nombre de archivo, usuario y clave como argumentos!"
print("Se debe especificar el nombre de archivo, usuario y clave como argumentos!")
sys.exit(1)

cot = COT()
Expand All @@ -226,11 +230,11 @@ def ObtenerTagXml(self, *tags):
if arg.startswith("--prod"):
URL = URL.replace("http://cot.test.arba.gov.ar",
"https://cot.arba.gov.ar")
print "Usando URL:", URL
print("Usando URL:", URL)
break
if arg.startswith("https"):
URL = arg
print "Usando URL:", URL
print("Usando URL:", URL)
break

proxy = None if not "--proxy" in sys.argv else "user:pass@host:1234"
Expand All @@ -239,27 +243,27 @@ def ObtenerTagXml(self, *tags):
cot.PresentarRemito(filename, testing=test_response)

if cot.Excepcion:
print "Excepcion:", cot.Excepcion
print "Traceback:", cot.Traceback
print("Excepcion:", cot.Excepcion)
print("Traceback:", cot.Traceback)

# datos generales:
print "CUIT Empresa:", cot.CuitEmpresa
print "Numero Comprobante:", cot.NumeroComprobante
print "Nombre Archivo:", cot.NombreArchivo
print "Codigo Integridad:", cot.CodigoIntegridad
print("CUIT Empresa:", cot.CuitEmpresa)
print("Numero Comprobante:", cot.NumeroComprobante)
print("Nombre Archivo:", cot.NombreArchivo)
print("Codigo Integridad:", cot.CodigoIntegridad)

print "Error General:", cot.TipoError, "|", cot.CodigoError, "|", cot.MensajeError
print("Error General:", cot.TipoError, "|", cot.CodigoError, "|", cot.MensajeError)

# recorro los remitos devueltos e imprimo sus datos por cada uno:
while cot.LeerValidacionRemito():
print "Numero Unico:", cot.NumeroUnico
print "Procesado:", cot.Procesado
print "COT:", cot.COT
print("Numero Unico:", cot.NumeroUnico)
print("Procesado:", cot.Procesado)
print("COT:", cot.COT)
while cot.LeerErrorValidacion():
print "Error Validacion:", "|", cot.CodigoError, "|", cot.MensajeError
print("Error Validacion:", "|", cot.CodigoError, "|", cot.MensajeError)

# Ejemplos de uso ObtenerTagXml
if False:
print "cuit", cot.ObtenerTagXml('cuitEmpresa')
print "p0", cot.ObtenerTagXml('validacionesRemitos', 'remito', 0, 'procesado')
print "p1", cot.ObtenerTagXml('validacionesRemitos', 'remito', 1, 'procesado')
print("cuit", cot.ObtenerTagXml('cuitEmpresa'))
print("p0", cot.ObtenerTagXml('validacionesRemitos', 'remito', 0, 'procesado'))
print("p1", cot.ObtenerTagXml('validacionesRemitos', 'remito', 1, 'procesado'))
7 changes: 4 additions & 3 deletions formatos/formato_cot.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
# Ejemplos iniciales gracias a "Matias Gieco matigro@gmail.com"

"Módulo para analizar el formato de un remito electrónico (COT)"
from __future__ import print_function

__author__ = "Mariano Reingart (reingart@gmail.com)"
__copyright__ = "Copyright (C) 2010 Mariano Reingart"
Expand Down Expand Up @@ -102,9 +103,9 @@
for l in f:
reg = l[0:2]
if reg in registros:
print "Registro: ", registros[reg]
print("Registro: ", registros[reg])
campos = l.strip("\r").strip("\n").split("|")
for i, campo in enumerate(campos):
print " * %s: |%s|" % (formato[reg][i], campo, )
print(" * %s: |%s|" % (formato[reg][i], campo, ))
else:
print "registro incorrecto:", l
print("registro incorrecto:", l)
34 changes: 19 additions & 15 deletions formatos/formato_csv.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,11 @@
# for more details.

"Módulo para manejo de archivos CSV (planillas de cálculo)"
from __future__ import print_function

from builtins import zip
from builtins import range
from past.builtins import basestring
__author__ = "Mariano Reingart (reingart@gmail.com)"
__copyright__ = "Copyright (C) 2010 Mariano Reingart"
__license__ = "GPL 3.0"
Expand Down Expand Up @@ -73,8 +77,8 @@ def aplanar(regs):
fila['pdf'] = reg.get('pdf', "")

# datos adicionales (escalares):
for k, v in reg.items():
if k not in MAP_ENC and isinstance(k, (basestring, int, long)):
for k, v in list(reg.items()):
if k not in MAP_ENC and isinstance(k, (basestring, int)):
fila[k] = v


Expand Down Expand Up @@ -149,7 +153,7 @@ def aplanar(regs):
]

# filtro y ordeno las columnas
l = [k for f in filas for k in f.keys()]
l = [k for f in filas for k in list(f.keys())]
s = set(l) - set(cols)
cols = cols + list(s)

Expand Down Expand Up @@ -204,7 +208,7 @@ def max_li(colname):
'dato_d': ('dato_d%s' % li) in dic and dic.pop('dato_d%s' % li),
'dato_e': ('dato_e%s' % li) in dic and dic.pop('dato_e%s' % li),

} for li in xrange(1, max_li("cantidad"))
} for li in range(1, max_li("cantidad"))
if dic['cantidad%s' % li] is not None]

# descartar filas espurias vacias al final
Expand All @@ -219,26 +223,26 @@ def max_li(colname):
'base_imp': dic.pop('tributo_base_imp_%s' % li),
'alic': dic.pop('tributo_alic_%s' % li),
'importe': dic.pop('tributo_importe_%s' % li),
} for li in xrange(1, max_li("tributo_id_"))
} for li in range(1, max_li("tributo_id_"))
if dic['tributo_id_%s' % li]]

reg['ivas'] = [{
'iva_id': dic.pop('iva_id_%s' % li),
'base_imp': dic.pop('iva_base_imp_%s' % li),
'importe': dic.pop('iva_importe_%s' % li),
} for li in xrange(1, max_li("iva_id_"))
} for li in range(1, max_li("iva_id_"))
if dic['iva_id_%s' % li]]

reg['permisos'] = [{
'id_permiso': dic.pop('id_permiso_%s' % li),
'dst_merc': dic.pop('dst_merc_%s' % li),
} for li in xrange(1, max_li("id_permiso_"))
} for li in range(1, max_li("id_permiso_"))
if dic['id_permiso_%s' % li]]

reg['opcionales'] = [{
'opcional_id': dic.pop('opcional_id_%s' % li),
'valor': dic.pop('opcional_valor_%s' % li),
} for li in xrange(1, max_li("opcional_id_"))
} for li in range(1, max_li("opcional_id_"))
if dic['opcional_id_%s' % li]]

reg['cbtes_asoc'] = [{
Expand All @@ -247,7 +251,7 @@ def max_li(colname):
'cbte_nro': dic.pop('cbte_asoc_nro_%s' % li),
'cbte_cuit': dic.pop('cbte_asoc_cuit_%s' % li),
'cbte_fecha': dic.pop('cbte_asoc_fecha_%s' % li),
} for li in xrange(1, max_li("cbte_asoc_tipo_"))
} for li in range(1, max_li("cbte_asoc_tipo_"))
if dic['cbte_asoc_tipo_%s' % li]]

reg['forma_pago'] = dic.pop('forma_pago')
Expand All @@ -257,7 +261,7 @@ def max_li(colname):
'campo': campo,
'valor': valor,
'pagina': '',
} for campo, valor in dic.items()
} for campo, valor in list(dic.items())
]


Expand All @@ -275,7 +279,7 @@ def escribir(filas, fn="salida.csv", delimiter=";"):
# TODO: filas = aplanar(regs)
for fila in filas:
# convertir a ISO-8859-1 (evita error de encoding de csv writer):
fila = [celda.encode("latin1") if isinstance(celda, unicode) else celda
fila = [celda.encode("latin1") if isinstance(celda, str) else celda
for celda in fila]
csv_writer.writerow(fila)
f.close()
Expand All @@ -293,15 +297,15 @@ def escribir(filas, fn="salida.csv", delimiter=";"):
##import pdb; pdb.set_trace()
filas = leer("facturas-wsfev1-bis.csv")
regs1 = desaplanar(filas)
print filas
print(filas)
filas1 = aplanar(regs1)
print filas1
print filas1 == filas
print(filas1)
print(filas1 == filas)
escribir(filas1, "facturas-wsfev1-bis-sal.csv")
escribir(filas1, "facturas-wsfev1-bis-sal.xlsx")
filas2 = leer("facturas-wsfev1-bis-sal.xlsx")
for fila1, fila2 in zip(filas1, filas2):
for celda1, celda2 in zip(fila1, fila2):
if celda1 != celda2:
print celda1, celda2
print(celda1, celda2)

20 changes: 11 additions & 9 deletions formatos/formato_dbf.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
# for more details.

"Módulo para manejo de Facturas Electrónicas en tablas DBF (dBase, FoxPro, Clipper et.al.)"
from __future__ import print_function

from builtins import str
__author__ = "Mariano Reingart (reingart@gmail.com)"
__copyright__ = "Copyright (C) 2011 Mariano Reingart"
__license__ = "GPL 3.0"
Expand Down Expand Up @@ -92,7 +94,7 @@ def dar_nombre_campo(clave):

def leer(archivos=None, carpeta=None):
"Leer las tablas dbf y devolver una lista de diccionarios con las facturas"
if DEBUG: print "Leyendo DBF..."
if DEBUG: print("Leyendo DBF...")
if archivos is None: archivos = {}
regs = {}
formatos = [('Encabezado', ENCABEZADO, None),
Expand All @@ -110,7 +112,7 @@ def leer(archivos=None, carpeta=None):
# construir ruta absoluta si se especifica carpeta
if carpeta is not None:
filename = os.path.join(carpeta, filename)
if DEBUG: print "leyendo tabla", nombre, filename
if DEBUG: print("leyendo tabla", nombre, filename)
tabla = dbf.Table(filename, codepage=CODEPAGE)
for reg in tabla:
r = {}
Expand Down Expand Up @@ -139,7 +141,7 @@ def leer(archivos=None, carpeta=None):

def escribir(regs, archivos=None, carpeta=None):
"Grabar en talbas dbf la lista de diccionarios con la factura"
if DEBUG: print "Creando DBF..."
if DEBUG: print("Creando DBF...")
if not archivos: filenames = {}

for reg in regs:
Expand All @@ -157,7 +159,7 @@ def escribir(regs, archivos=None, carpeta=None):
# construir ruta absoluta si se especifica carpeta
if carpeta is not None:
filename = os.path.join(carpeta, filename)
if DEBUG: print "leyendo tabla", nombre, filename
if DEBUG: print("leyendo tabla", nombre, filename)
tabla = dbf.Table(filename, campos)

for d in l:
Expand All @@ -168,13 +170,13 @@ def escribir(regs, archivos=None, carpeta=None):
v = reg['id']
else:
v = d.get(clave, None)
if DEBUG: print clave,v, tipo
if DEBUG: print(clave,v, tipo)
if v is None and tipo == A:
v = ''
if (v is None or v=='') and tipo in (I, N):
v = 0
if tipo == A:
if isinstance(v, unicode):
if isinstance(v, str):
v = v.encode('utf8', 'ignore')
elif isinstance(v, str):
v = v.decode('latin1', 'ignore').encode('utf8', 'ignore')
Expand All @@ -187,7 +189,7 @@ def escribir(regs, archivos=None, carpeta=None):

def ayuda():
"Imprimir ayuda con las tablas DBF y definición de campos"
print "=== Formato DBF: ==="
print("=== Formato DBF: ===")
tipos_registro = [
('Encabezado', ENCABEZADO),
('Detalle Item', DETALLE),
Expand All @@ -199,10 +201,10 @@ def ayuda():
]
for msg, formato in tipos_registro:
filename = "%s.dbf" % msg.lower()[:8]
print "==== %s (%s) ====" % (msg, filename)
print("==== %s (%s) ====" % (msg, filename))
claves, campos = definir_campos(formato)
for campo in campos:
print " * Campo: %s" % (campo,)
print(" * Campo: %s" % (campo,))


if __name__ == "__main__":
Expand Down
3 changes: 2 additions & 1 deletion formatos/formato_json.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
# for more details.

"Módulo para manejo de archivos JSON"
from __future__ import print_function

__author__ = "Mariano Reingart (reingart@gmail.com)"
__copyright__ = "Copyright (C) 2011 Mariano Reingart"
Expand All @@ -24,7 +25,7 @@
try:
import simplejson as json
except:
print "para soporte de JSON debe instalar simplejson"
print("para soporte de JSON debe instalar simplejson")


def leer(fn="entrada.json"):
Expand Down
Loading

0 comments on commit 1d4bb71

Please sign in to comment.