def escribir_factura(dic, archivo, agrega=False): if '/json' in sys.argv: import json json.dump([dic], archivo, sort_keys=True, indent=4) else: dic['tipo_reg'] = 0 archivo.write(escribir(dic, ENCABEZADO)) if 'tributos' in dic: for it in dic['tributos']: it['tipo_reg'] = 1 archivo.write(escribir(it, TRIBUTO)) if 'iva' in dic: for it in dic['iva']: it['tipo_reg'] = 2 archivo.write(escribir(it, IVA)) if 'cbtes_asoc' in dic: for it in dic['cbtes_asoc']: it['tipo_reg'] = 3 archivo.write(escribir(it, CMP_ASOC)) if 'opcionales' in dic: for it in dic['opcionales']: it['tipo_reg'] = 6 archivo.write(escribir(it, OPCIONAL)) if '/dbf' in sys.argv: formatos = [ ('Encabezado', ENCABEZADO, [dic]), ('Tributo', TRIBUTO, dic.get('tributos', [])), ('Iva', IVA, dic.get('iva', [])), ('Comprobante Asociado', CMP_ASOC, dic.get('cbtes_asoc', [])), ('Datos Opcionales', OPCIONAL, dic.get("opcionales", [])), ] guardar_dbf(formatos, agrega, conf_dbf)
def escribir_factura(dic, archivo, agrega=False): if '/json' in sys.argv: import json json.dump([dic], archivo, sort_keys=True, indent=4) else: dic['tipo_reg'] = 0 archivo.write(escribir(dic, ENCABEZADO)) if 'tributos' in dic: for it in dic['tributos']: it['tipo_reg'] = 1 archivo.write(escribir(it, TRIBUTO)) if 'iva' in dic: for it in dic['iva']: it['tipo_reg'] = 2 archivo.write(escribir(it, IVA)) if 'cbtes_asoc' in dic: for it in dic['cbtes_asoc']: it['tipo_reg'] = 3 archivo.write(escribir(it, CMP_ASOC)) if 'opcionales' in dic: for it in dic['opcionales']: it['tipo_reg'] = 6 archivo.write(escribir(it, OPCIONAL)) if '/dbf' in sys.argv: formatos = [('Encabezado', ENCABEZADO, [dic]), ('Tributo', TRIBUTO, dic.get('tributos', [])), ('Iva', IVA, dic.get('iva', [])), ('Comprobante Asociado', CMP_ASOC, dic.get('cbtes_asoc', [])), ('Datos Opcionales', OPCIONAL, dic.get("opcionales", [])), ] guardar_dbf(formatos, agrega, conf_dbf)
def escribir_factura(dic, archivo, agrega=False): dic['tipo_reg'] = TIPOS_REG[0] dic['cbte_nro'] = dic.get('cbt_desde') archivo.write(escribir(dic, ENCABEZADO, contraer_fechas=True)) if 'tributos' in dic: for it in dic['tributos']: it['tipo_reg'] = TIPOS_REG[1] archivo.write(escribir(it, TRIBUTO)) if 'iva' in dic: for it in dic['iva']: it['tipo_reg'] = TIPOS_REG[2] archivo.write(escribir(it, IVA)) if 'cbtes_asoc' in dic: for it in dic['cbtes_asoc']: it['tipo_reg'] = TIPOS_REG[3] archivo.write(escribir(it, CMP_ASOC)) if 'detalles' in dic: for it in dic['detalles']: it['tipo_reg'] = TIPOS_REG[4] it['importe'] = it['imp_subtotal'] archivo.write(escribir(it, DETALLE)) if '/dbf' in sys.argv: formatos = [('Encabezado', ENCABEZADO, [dic]), ('Tributo', TRIBUTO, dic.get('tributos', [])), ('Iva', IVA, dic.get('iva', [])), ('Comprobante Asociado', CMP_ASOC, dic.get('cbtes_asoc', [])), ('Detalles', DETALLE, dic.get('detalles', []))] guardar_dbf(formatos, agrega, conf_dbf)
def navegar_node_modules(x, y, mensaje): if y == 430: hacer_click(x, y) hacer_click(x, y) if x == 100: hacer_click(x, y) escribir(mensaje)
def escribir_factura(dic, archivo, agrega=False): dic['tipo_reg'] = 0 archivo.write(escribir(dic, ENCABEZADO)) for it in dic['detalles']: it['tipo_reg'] = 1 archivo.write(escribir(it, DETALLE)) if '/dbf' in sys.argv: formatos = [('Encabezado', ENCABEZADO, [dic]), ('Detalles', DETALLE, dic.get('detalles', []))] guardar_dbf(formatos, agrega, conf_dbf)
def escribir_factura(dic, archivo, agrega=False): dic['tipo_reg'] = TIPOS_REG[0] archivo.write(escribir(dic, ENCABEZADO)) for it in dic.get('detalles', []): it['tipo_reg'] = TIPOS_REG[1] archivo.write(escribir(it, DETALLE)) if 'permisos' in dic: for it in dic['permisos']: it['tipo_reg'] = TIPOS_REG[2] archivo.write(escribir(it, PERMISO)) if '/dbf' in sys.argv: formatos = [('Encabezado', ENCABEZADO, [dic]), ('Permisos', PERMISO, dic.get('permisos', [])), ('Comprobante Asociado', CMP_ASOC, dic.get('cbtes_asoc', [])), ('Detalles', DETALLE, dic.get('detalles', []))] guardar_dbf(formatos, agrega, conf_dbf)
def generar_encabezado(items): "Crear archivo de cabecera de facturas emitidas" periodo = items[0]["fecha_cbte"][:6] out = open("CABECERA_%s.txt" % periodo, "w") totales = format_as_dict(CAB_FAC_TIPO2) totales["periodo"] = periodo for key in IMPORTES: totales[key] = Decimal(0) for item in items: vals = format_as_dict(CAB_FAC_TIPO1) vals["fecha_anulacion"] = "" for k in item.keys(): vals[k] = item[k] if k in totales and k in IMPORTES: totales[k] = totales[k] + Decimal(item[k]) vals["tipo_reg"] = "1" vals["ctl_fiscal"] = item.get("ctl_fiscal", " ") # C para controlador vals["cbte_nro_reg"] = vals["cbt_numero"] vals["cant_hojas"] = "01" vals["transporte"] = "0" vals["categoria"] = categorias[item["categoria"].lower()] if vals["imp_moneda_id"] is None: vals["imp_moneda_id"] = "PES" vals["imp_moneda_ctz"] = "1.000" vals["alicuotas_iva"] = max(len(item.get("ivas", [])), 1) if vals["codigo_operacion"] is None: if int(item["tipo_cbte"]) in (19, 20, 21): vals["codigo_operacion"] = "E" else: vals["codigo_operacion"] = " " if vals["imp_tot_conc"] is None: vals["imp_tot_conc"] = "0" s = escribir(vals, CAB_FAC_TIPO1) out.write(s) totales["tipo_reg"] = "2" totales["cant_reg_tipo_1"] = str(len(items)) totales["cuit"] = CUIT s = escribir(totales, CAB_FAC_TIPO2) out.write(s) out.close()
def generar_encabezado(items): "Crear archivo de cabecera de facturas emitidas" periodo = items[0]['fecha_cbte'][:6] out = open("CABECERA_%s.txt" % periodo, "w") totales = format_as_dict(CAB_FAC_TIPO2) totales['periodo'] = periodo for key in IMPORTES: totales[key] = Decimal(0) for item in items: vals = format_as_dict(CAB_FAC_TIPO1) vals['fecha_anulacion'] = '' for k in item.keys(): vals[k] = item[k] if k in totales and k in IMPORTES: totales[k] = totales[k] + Decimal(item[k]) vals['tipo_reg'] = '1' vals['ctl_fiscal'] = item.get('ctl_fiscal', ' ') # C para controlador vals['cbte_nro_reg'] = vals['cbt_numero'] vals['cant_hojas'] = '01' vals['transporte'] = '0' vals['categoria'] = categorias[item['categoria'].lower()] if vals['imp_moneda_id'] is None: vals['imp_moneda_id'] = 'PES' vals['imp_moneda_ctz'] = '1.000' vals['alicuotas_iva'] = max(len(item.get('ivas', [])), 1) if vals['codigo_operacion'] is None: if int(item['tipo_cbte']) in (19, 20, 21): vals['codigo_operacion'] = 'E' else: vals['codigo_operacion'] = ' ' if vals['imp_tot_conc'] is None: vals['imp_tot_conc'] = '0' s = escribir(vals, CAB_FAC_TIPO1) out.write(s) totales['tipo_reg'] = '2' totales['cant_reg_tipo_1'] = str(len(items)) totales['cuit'] = CUIT s = escribir(totales, CAB_FAC_TIPO2) out.write(s) out.close()
def escribir_facturas(encabezados, archivo, agrega=False): if "/json" in sys.argv: import json facturas = [] for dic in encabezados: factura = dic.copy() facturas.append(factura) # ajsutes por compatibilidad hacia atras y con pyfepdf factura["fecha_vto"] = factura.get("fch_venc_cae") if "iva" in factura: factura["ivas"] = factura.get("iva", []) del factura["iva"] json.dump(facturas, archivo, sort_keys=True, indent=4) else: for dic in encabezados: dic["tipo_reg"] = 0 archivo.write(escribir(dic, ENCABEZADO)) if "tributos" in dic: for it in dic["tributos"]: it["tipo_reg"] = 1 archivo.write(escribir(it, TRIBUTO)) if "iva" in dic or "ivas" in dic: for it in dic.get("iva", dic.get("ivas")): it["tipo_reg"] = 2 archivo.write(escribir(it, IVA)) if "cbtes_asoc" in dic: for it in dic["cbtes_asoc"]: it["tipo_reg"] = 3 archivo.write(escribir(it, CMP_ASOC)) if "opcionales" in dic: for it in dic["opcionales"]: it["tipo_reg"] = 6 archivo.write(escribir(it, OPCIONAL)) if "/dbf" in sys.argv: formatos = [ ("Encabezado", ENCABEZADO, encabezados), ("Tributo", TRIBUTO, dic.get("tributos", [])), ("Iva", IVA, dic.get("iva", [])), ("Comprobante Asociado", CMP_ASOC, dic.get("cbtes_asoc", [])), ("Datos Opcionales", OPCIONAL, dic.get("opcionales", [])), ] guardar_dbf(formatos, agrega, conf_dbf)
def escribir_facturas(encabezados, archivo, agrega=False): if '/json' in sys.argv: import json facturas = [] for dic in encabezados: factura = dic.copy() facturas.append(factura) # ajsutes por compatibilidad hacia atras y con pyfepdf factura['fecha_vto'] = factura.get('fch_venc_cae') if 'iva' in factura: factura['ivas'] = factura.get('iva', []) del factura['iva'] json.dump(facturas, archivo, sort_keys=True, indent=4) else: for dic in encabezados: dic['tipo_reg'] = 0 archivo.write(escribir(dic, ENCABEZADO)) if 'tributos' in dic: for it in dic['tributos']: it['tipo_reg'] = 1 archivo.write(escribir(it, TRIBUTO)) if 'iva' in dic or 'ivas' in dic: for it in dic.get('iva', dic.get('ivas')): it['tipo_reg'] = 2 archivo.write(escribir(it, IVA)) if 'cbtes_asoc' in dic: for it in dic['cbtes_asoc']: it['tipo_reg'] = 3 archivo.write(escribir(it, CMP_ASOC)) if 'opcionales' in dic: for it in dic['opcionales']: it['tipo_reg'] = 6 archivo.write(escribir(it, OPCIONAL)) if '/dbf' in sys.argv: formatos = [ ('Encabezado', ENCABEZADO, encabezados), ('Tributo', TRIBUTO, dic.get('tributos', [])), ('Iva', IVA, dic.get('iva', [])), ('Comprobante Asociado', CMP_ASOC, dic.get('cbtes_asoc', [])), ('Datos Opcionales', OPCIONAL, dic.get("opcionales", [])), ] guardar_dbf(formatos, agrega, conf_dbf)
def escribir_facturas(encabezados, archivo, agrega=False): if '/json' in sys.argv: import json facturas = [] for dic in encabezados: factura = dic.copy() facturas.append(factura) # ajsutes por compatibilidad hacia atras y con pyfepdf factura['fecha_vto'] = factura.get('fch_venc_cae') if 'iva' in factura: factura['ivas'] = factura.get('iva', []) del factura['iva'] json.dump(facturas, archivo, sort_keys=True, indent=4) else: for dic in encabezados: dic['tipo_reg'] = 0 archivo.write(escribir(dic, ENCABEZADO)) if 'tributos' in dic: for it in dic['tributos']: it['tipo_reg'] = 1 archivo.write(escribir(it, TRIBUTO)) if 'iva' in dic or 'ivas' in dic: for it in dic.get('iva', dic.get('ivas')): it['tipo_reg'] = 2 archivo.write(escribir(it, IVA)) if 'cbtes_asoc' in dic: for it in dic['cbtes_asoc']: it['tipo_reg'] = 3 archivo.write(escribir(it, CMP_ASOC)) if 'opcionales' in dic: for it in dic['opcionales']: it['tipo_reg'] = 6 archivo.write(escribir(it, OPCIONAL)) if '/dbf' in sys.argv: formatos = [('Encabezado', ENCABEZADO, encabezados), ('Tributo', TRIBUTO, dic.get('tributos', [])), ('Iva', IVA, dic.get('iva', [])), ('Comprobante Asociado', CMP_ASOC, dic.get('cbtes_asoc', [])), ('Datos Opcionales', OPCIONAL, dic.get("opcionales", [])), ] guardar_dbf(formatos, agrega, conf_dbf)
def generar_detalle(items): "Crear archivo de detalle de facturas emitidas" periodo = items[0]['fecha_cbte'][:6] out = open("DETALLE_%s.txt" % periodo, "w") # recorro las facturas y detalles de artículos vendidos: for item in items: for it in item.get('detalles', [{}]): vals = format_as_dict(DETALLE) # datos generales de la factura: vals['tipo_reg'] = '1' for k in ('tipo_cbte', 'fecha_cbte', 'punto_vta', 'cbt_numero'): vals[k] = item[k] vals['cbte_nro_reg'] = item['cbt_numero'] # no hay varias hojas vals['ctl_fiscal'] = item.get('ctl_fiscal', ' ') # C para controlador vals['anulacion'] = item.get('anulacion', ' ') # datos del artículo: vals['qty'] = it.get('qty', '1') # cantidad vals['pro_umed'] = it.get('umed', '07') # unidad de medida vals['pro_precio_uni'] = it.get('precio', item['imp_neto']) vals['imp_bonif'] = it.get('bonif', '0.00') vals['imp_ajuste'] = it.get('ajuste', '0.00') vals['imp_total'] = it.get('importe', '0.00') # iva if 'iva_id' in it: # mapear alicuota de iva según código usado en MTX iva_id = int(it['iva_id']) if iva_id in (1, 2): alicuota = None else: alicuota = {3: "0.00", 4: "10.5", 5: "21", 6: "27"}[iva_id] if alicuota is None: vals['gravado'] = 'E' else: vals['gravado'] = 'G' vals['alicuota_iva'] = alicuota or '0.00' else: # tomar datos generales: vals['alicuota_iva'] = (Decimal(item['imp_total']) / Decimal(item['imp_neto']) - 1) * 100 if float(item.get('impto_liq', item.get('imp_iva', 0))) == 0: vals['gravado'] = 'E' else: vals['gravado'] = 'G' # diseño libre: código de barras y descripción: vals['codigo'] = it.get('codigo', '') vals['ds'] = it.get('ds', '') s = escribir(vals, DETALLE) out.write(s) out.close()
def generar_detalle(items): "Crear archivo de detalle de facturas emitidas" periodo = items[0]['fecha_cbte'][:6] out = open("DETALLE_%s.txt" % periodo, "w") # recorro las facturas y detalles de artículos vendidos: for item in items: for it in item.get('detalles', [{}]): vals = format_as_dict(DETALLE) # datos generales de la factura: vals['tipo_reg'] = '1' for k in ('tipo_cbte', 'fecha_cbte', 'punto_vta', 'cbt_numero'): vals[k] = item[k] vals['cbte_nro_reg'] = item['cbt_numero'] # no hay varias hojas vals['ctl_fiscal'] = item.get('ctl_fiscal', ' ') # C para controlador vals['anulacion'] = item.get('anulacion', ' ') # datos del artículo: vals['qty'] = it.get('qty', '1') # cantidad vals['pro_umed'] = it.get('umed', '07') # unidad de medida vals['pro_precio_uni'] = it.get('precio', item['imp_neto']) vals['imp_bonif'] = it.get('bonif', '0.00') vals['imp_ajuste'] = it.get('ajuste', '0.00') vals['imp_total'] = it.get('importe', '0.00') # iva if 'iva_id' in it and it['iva_id']: # mapear alicuota de iva según código usado en MTX iva_id = int(it['iva_id']) if iva_id in (1, 2): alicuota = None else: alicuota = {3: "0.00", 4: "10.5", 5: "21", 6: "27"}[iva_id] if alicuota is None: vals['gravado'] = 'E' else: vals['gravado'] = 'G' vals['alicuota_iva'] = alicuota or '0.00' else: # tomar datos generales: vals['alicuota_iva'] = (Decimal(item['imp_total'])/Decimal(item['imp_neto']) - 1) * 100 if float(item.get('impto_liq', item.get('imp_iva', 0))) == 0: vals['gravado'] = 'E' else: vals['gravado'] = 'G' # diseño libre: código de barras y descripción: vals['codigo'] = it.get('codigo', '') vals['ds'] = it.get('ds', '') s = escribir(vals, DETALLE) out.write(s) out.close()
def generar_detalle(items): "Crear archivo de detalle de facturas emitidas" periodo = items[0]["fecha_cbte"][:6] out = open("DETALLE_%s.txt" % periodo, "w") # recorro las facturas y detalles de artículos vendidos: for item in items: for it in item.get("detalles", [{}]): vals = format_as_dict(DETALLE) # datos generales de la factura: vals["tipo_reg"] = "1" for k in ("tipo_cbte", "fecha_cbte", "punto_vta", "cbt_numero"): vals[k] = item[k] vals["cbte_nro_reg"] = item["cbt_numero"] # no hay varias hojas vals["ctl_fiscal"] = item.get("ctl_fiscal", " ") # C para controlador vals["anulacion"] = item.get("anulacion", " ") # datos del artículo: vals["qty"] = it.get("qty", "1") # cantidad vals["pro_umed"] = it.get("umed", "07") # unidad de medida vals["pro_precio_uni"] = it.get("precio", item["imp_neto"]) vals["imp_bonif"] = it.get("bonif", "0.00") vals["imp_ajuste"] = it.get("ajuste", "0.00") vals["imp_total"] = it.get("importe", "0.00") # iva if "iva_id" in it and it["iva_id"]: # mapear alicuota de iva según código usado en MTX iva_id = int(it["iva_id"]) if iva_id in (1, 2): alicuota = None else: alicuota = {3: "0.00", 4: "10.5", 5: "21", 6: "27"}[iva_id] if alicuota is None: vals["gravado"] = "E" else: vals["gravado"] = "G" vals["alicuota_iva"] = alicuota or "0.00" else: # tomar datos generales: vals["alicuota_iva"] = (Decimal(item["imp_total"]) / Decimal(item["imp_neto"]) - 1) * 100 if float(item.get("impto_liq", item.get("imp_iva", 0))) == 0: vals["gravado"] = "E" else: vals["gravado"] = "G" # diseño libre: código de barras y descripción: vals["codigo"] = it.get("codigo", "") vals["ds"] = it.get("ds", "") s = escribir(vals, DETALLE) out.write(s) out.close()
def escribir_archivo(dic, nombre_archivo, agrega=True): archivo = open(nombre_archivo, agrega and "a" or "w") formatos = [('Encabezado', ENCABEZADO, [dic], 0), ('Observacion', OBSERVACION, dic.get('observaciones', []), 'O'), ('Eventos', ERROR, dic.get('eventos', []), 'V'), ('Error', ERROR, dic.get('errores', []), 'E'), ] if '--json' in sys.argv: json.dump(dic, archivo, sort_keys=True, indent=4) elif '--dbf' in sys.argv: guardar_dbf(formatos, agrega, conf_dbf) else: for nombre, formato, registros, tipo_reg in formatos: for it in registros: it['tipo_reg'] = tipo_reg archivo.write(escribir(it, formato)) archivo.close()
def escribir_archivo(cols, items, nombre_archivo, agrega=False): archivo = open(nombre_archivo, agrega and "a" or "w") ext = os.path.splitext(nombre_archivo)[1] if ext == '.csv': csv_writer = csv.writer(archivo, dialect='excel', delimiter=";") csv_writer.writerows([cols]) csv_writer.writerows([[item[k] for k in cols] for item in items]) elif ext == '.json': json.dump(items, archivo, sort_keys=True, indent=4) elif ext == '.dbf': formatos = [('Encabezado', ENCABEZADO, items), ] guardar_dbf(formatos, True, conf_dbf) elif ext == '.txt': for dic in items: dic['tipo_reg'] = 0 archivo.write(escribir(dic, ENCABEZADO)) else: raise RuntimeError("Extension de archivo desconocida: %s" % ext) archivo.close()
def escribir_factura(dic, archivo, agrega=False): if '/dbf' in sys.argv: formatos = [ ('Encabezado', ENCABEZADO, [dic]), ('Tributo', TRIBUTO, dic.get('tributos', [])), ('Iva', IVA, dic.get('iva', [])), ('Comprobante Asociado', CMP_ASOC, dic.get('cbtes_asoc', [])), ('Detalles', DETALLE, dic.get('detalles', [])), ('Forma Pago', FORMA_PAGO, dic.get('formas_pago', [])), ] guardar_dbf(formatos, agrega, conf_dbf) elif '/json' in sys.argv: json.dump(dic, archivo, sort_keys=True, indent=4) else: dic['tipo_reg'] = TIPOS_REG[0] archivo.write(escribir(dic, ENCABEZADO, contraer_fechas=True)) if 'tributos' in dic: for it in dic['tributos']: it['tipo_reg'] = TIPOS_REG[1] archivo.write(escribir(it, TRIBUTO)) if 'iva' in dic: for it in dic['iva']: it['tipo_reg'] = TIPOS_REG[2] archivo.write(escribir(it, IVA)) if 'cbtes_asoc' in dic: for it in dic['cbtes_asoc']: it['tipo_reg'] = TIPOS_REG[3] archivo.write(escribir(it, CMP_ASOC)) if 'detalles' in dic: for it in dic['detalles']: it['tipo_reg'] = TIPOS_REG[4] it['importe'] = it['imp_subtotal'] archivo.write(escribir(it, DETALLE)) if 'forma_pago' in dic: for it in dic['fp']: it['tipo_reg'] = TIPOS_REG[5] archivo.write(escribir(it, FORMA_PAGO))
def escribir_factura(dic, archivo, agrega=False): if '/dbf' in sys.argv: formatos = [('Encabezado', ENCABEZADO, [dic]), ('Tributo', TRIBUTO, dic.get('tributos', [])), ('Iva', IVA, dic.get('iva', [])), ('Comprobante Asociado', CMP_ASOC, dic.get('cbtes_asoc', [])), ('Detalles', DETALLE, dic.get('detalles', [])), ('Forma Pago', FORMA_PAGO, dic.get('formas_pago', [])), ] guardar_dbf(formatos, agrega, conf_dbf) elif '/json' in sys.argv: json.dump(dic, archivo, sort_keys=True, indent=4) else: dic['tipo_reg'] = TIPOS_REG[0] archivo.write(escribir(dic, ENCABEZADO, contraer_fechas=True)) if 'tributos' in dic: for it in dic['tributos']: it['tipo_reg'] = TIPOS_REG[1] archivo.write(escribir(it, TRIBUTO)) if 'iva' in dic: for it in dic['iva']: it['tipo_reg'] = TIPOS_REG[2] archivo.write(escribir(it, IVA)) if 'cbtes_asoc' in dic: for it in dic['cbtes_asoc']: it['tipo_reg'] = TIPOS_REG[3] archivo.write(escribir(it, CMP_ASOC)) if 'detalles' in dic: for it in dic['detalles']: it['tipo_reg'] = TIPOS_REG[4] it['importe'] = it['imp_subtotal'] archivo.write(escribir(it, DETALLE)) if 'forma_pago' in dic: for it in dic['fp']: it['tipo_reg'] = TIPOS_REG[5] archivo.write(escribir(it, FORMA_PAGO))
def main(): "Función principal de pruebas (obtener CAE)" import os, time, sys global WSDL, LOCATION DEBUG = '--debug' in sys.argv ws = TrazaProdMed() ws.Username = '******' ws.Password = '******' if '--prod' in sys.argv and not H**O: WSDL = WSDL_PROD print "Usando WSDL:", WSDL sys.argv.pop(sys.argv.index("--prod")) # Inicializo las variables y estructuras para el archivo de intercambio: transacciones = [] errores = [] formatos = [] if '--formato' in sys.argv: print "Formato:" for msg, formato, lista in formatos: comienzo = 1 print "=== %s ===" % msg print "|| %-25s || %-12s || %-5s || %-4s || %-10s ||" % ( "Nombre", "Tipo", "Long.", "Pos(txt)", "Campo(dbf)") claves = [] for fmt in formato: clave, longitud, tipo = fmt[0:3] clave_dbf = dar_nombre_campo_dbf(clave, claves) claves.append(clave_dbf) print "|| %-25s || %-12s || %5d || %4d || %-10s ||" % ( clave, tipo, longitud, comienzo, clave_dbf) comienzo += longitud sys.exit(0) if '--cargar' in sys.argv: if '--dbf' in sys.argv: leer_dbf(formatos[:1], {}) elif '--json' in sys.argv: for formato in formatos[:1]: archivo = open(formato[0].lower() + ".json", "r") d = json.load(archivo) formato[2].extend(d) archivo.close() else: for formato in formatos[:1]: archivo = open(formato[0].lower() + ".txt", "r") for linea in archivo: d = leer(linea, formato[1]) formato[2].append(d) archivo.close() ws.Conectar("", WSDL) if ws.Excepcion: print ws.Excepcion print ws.Traceback sys.exit(-1) # Datos de pruebas: if '--test' in sys.argv: ws.CrearTransaccion( f_evento=datetime.datetime.now().strftime("%d/%m/%Y"), h_evento=datetime.datetime.now().strftime("%H:%M"), gln_origen="7791234567801", gln_destino="7791234567801", n_remito="R0001-12341234", n_factura="A0001-12341234", vencimiento=(datetime.datetime.now()+datetime.timedelta(30)).strftime("%d/%m/%Y"), gtin="07791234567810", lote=datetime.datetime.now().strftime("%Y"), # R4556567 numero_serial=int(time.time()*10), # A23434 id_evento=1, cuit_medico="30711622507", id_obra_social=465667, apellido="Reingart", nombres="Mariano", tipo_documento="96", n_documento="28510785", sexo="M", calle="San Martin", numero="5656", piso="", depto="1", localidad="Berazategui", provincia="Buenos Aires", n_postal="1700", fecha_nacimiento="20/12/1972", telefono="5555-5555", nro_afiliado="9999999999999", cod_diagnostico="B30", cod_hiv="NOAP31121970", id_motivo_devolucion=1, otro_motivo_devolucion="producto fallado", ) # Opciones principales: if '--cancela' in sys.argv: if '--loadxml' in sys.argv: ws.LoadTestXML("tests/xml/trazaprodmed_cancela_err.xml") # cargo respuesta ws.SendCancelacTransacc(*sys.argv[sys.argv.index("--cancela")+1:]) elif '--cancela_parcial' in sys.argv: ws.SendCancelacTransaccParcial(*sys.argv[sys.argv.index("--cancela_parcial")+1:]) elif '--consulta' in sys.argv: ws.GetTransaccionesWS( *sys.argv[sys.argv.index("--consulta")+1:] ) print "CantPaginas", ws.CantPaginas print "HayError", ws.HayError #print "TransaccionPlainWS", ws.TransaccionPlainWS # parametros comunes de salida (columnas de la tabla): TRANSACCIONES = ws.Transacciones[0].keys() if ws.Transacciones else [] claves = [k for k in TRANSACCIONES] # extiendo la lista de resultado para el archivo de intercambio: transacciones.extend(ws.Transacciones) # encabezado de la tabla: print "||", "||".join(["%s" % clave for clave in claves]), "||" # recorro los datos devueltos (TransaccionPlainWS): while ws.LeerTransaccion(): for clave in claves: print "||", ws.GetParametro(clave), # imprimo cada fila print "||" elif '--catalogo' in sys.argv: ret = ws.GetCatalogoElectronicoByGTIN( *sys.argv[sys.argv.index("--catalogo")+1:] ) for catalogo in ws.params_out.values(): print catalogo # imprimo cada fila else: argv = [argv for argv in sys.argv if not argv.startswith("--")] if not transacciones: if len(argv)>16: ws.CrearTransaccion(*argv[3:]) else: print "ERROR: no se indicaron todos los parámetros requeridos" if ws.Transacciones: try: usuario, password = argv[1:3] except: print "ADVERTENCIA: no se indico parámetros usuario y passoword" usuario = password = "******" ws.InformarProducto(usuario, password) for i, tx in enumerate(transacciones): print "Procesando registro", i tx['codigo_transaccion'] = ws.CodigoTransaccion errores.extend(ws.errores) print "|Resultado %5s|CodigoTransaccion %10s|Errores|%s|" % ( ws.Resultado, ws.CodigoTransaccion, '|'.join(ws.Errores or []), ) else: print "ERROR: no se especificaron productos a informar" if ws.Excepcion: print ws.Traceback if '--grabar' in sys.argv: if '--dbf' in sys.argv: guardar_dbf(formatos, True, {}) elif '--json' in sys.argv: for formato in formatos: archivo = open(formato[0].lower() + ".json", "w") json.dump(formato[2], archivo, sort_keys=True, indent=4) archivo.close() else: for formato in formatos: archivo = open(formato[0].lower() + ".txt", "w") for it in formato[2]: archivo.write(escribir(it, formato[1])) archivo.close()
def main(): "Función principal de pruebas (obtener CAE)" import os, time, sys global WSDL, LOCATION DEBUG = '--debug' in sys.argv ws = TrazaMed() ws.Username = '******' ws.Password = '******' if '--prod' in sys.argv and not H**O: WSDL = "https://trazabilidad.pami.org.ar:9050/trazamed.WebService" print "Usando WSDL:", WSDL sys.argv.pop(sys.argv.index("--prod")) # Inicializo las variables y estructuras para el archivo de intercambio: medicamentos = [] transacciones = [] errores = [] formatos = [('Medicamentos', MEDICAMENTOS, medicamentos), ('Transacciones', TRANSACCIONES, transacciones), ('Errores', ERRORES, errores), ] if '--formato' in sys.argv: print "Formato:" for msg, formato, lista in formatos: comienzo = 1 print "=== %s ===" % msg print "|| %-25s || %-12s || %-5s || %-4s || %-10s ||" % ( "Nombre", "Tipo", "Long.", "Pos(txt)", "Campo(dbf)") claves = [] for fmt in formato: clave, longitud, tipo = fmt[0:3] clave_dbf = dar_nombre_campo_dbf(clave, claves) claves.append(clave_dbf) print "|| %-25s || %-12s || %5d || %4d || %-10s ||" % ( clave, tipo, longitud, comienzo, clave_dbf) comienzo += longitud sys.exit(0) if '--cargar' in sys.argv: if '--dbf' in sys.argv: leer_dbf(formatos[:1], {}) elif '--json' in sys.argv: for formato in formatos[:1]: archivo = open(formato[0].lower() + ".json", "r") d = json.load(archivo) formato[2].extend(d) archivo.close() else: for formato in formatos[:1]: archivo = open(formato[0].lower() + ".txt", "r") for linea in archivo: d = leer(linea, formato[1]) formato[2].append(d) archivo.close() ws.Conectar("", WSDL) if ws.Excepcion: print ws.Excepcion print ws.Traceback sys.exit(-1) # Datos de pruebas: if '--test' in sys.argv: medicamentos.append(dict( f_evento=datetime.datetime.now().strftime("%d/%m/%Y"), h_evento=datetime.datetime.now().strftime("%H:%M"), gln_origen="9999999999918", gln_destino="glnws", n_remito="R000100001234", n_factura="A000100001234", vencimiento=(datetime.datetime.now()+datetime.timedelta(30)).strftime("%d/%m/%Y"), gtin="GTIN1", lote=datetime.datetime.now().strftime("%Y"), numero_serial=int(time.time()*10), id_obra_social=None, id_evento=134, cuit_origen="20267565393", cuit_destino="20267565393", apellido="Reingart", nombres="Mariano", tipo_documento="96", n_documento="26756539", sexo="M", direccion="Saraza", numero="1234", piso="", depto="", localidad="Hurlingham", provincia="Buenos Aires", n_postal="1688", fecha_nacimiento="01/01/2000", telefono="5555-5555", nro_asociado="9999999999999", cantidad=None, desde_numero_serial=None, hasta_numero_serial=None, codigo_transaccion=None, )) if '--testfraccion' in sys.argv: medicamentos.append(dict( f_evento=datetime.datetime.now().strftime("%d/%m/%Y"), h_evento=datetime.datetime.now().strftime("%H:%M"), gln_origen="9999999999918", gln_destino="glnws", n_remito="1234", n_factura="1234", vencimiento=(datetime.datetime.now()+datetime.timedelta(30)).strftime("%d/%m/%Y"), gtin="GTIN1", lote=datetime.datetime.now().strftime("%Y"), numero_serial=int(time.time()*10), id_obra_social=None, id_evento=134, cuit_origen="20267565393", cuit_destino="20267565393", apellido="Reingart", nombres="Mariano", tipo_documento="96", n_documento="26756539", sexo="M", direccion="Saraza", numero="1234", piso="", depto="", localidad="Hurlingham", provincia="Buenos Aires", n_postal="1688", fecha_nacimiento="01/01/2000", telefono="5555-5555", nro_asociado="9999999999999", cantidad=5, desde_numero_serial=None, hasta_numero_serial=None, codigo_transaccion=None, )) if '--testdh' in sys.argv: medicamentos.append(dict( f_evento=datetime.datetime.now().strftime("%d/%m/%Y"), h_evento=datetime.datetime.now().strftime("%H:%M"), gln_origen="9999999999918", gln_destino="glnws", n_remito="1234", n_factura="1234", vencimiento=(datetime.datetime.now()+datetime.timedelta(30)).strftime("%d/%m/%Y"), gtin="GTIN1", lote=datetime.datetime.now().strftime("%Y"), desde_numero_serial=int(time.time()*10)-1, hasta_numero_serial=int(time.time()*10)+1, id_obra_social=None, id_evento=134, nro_asociado="1234", cantidad=None, numero_serial=None, codigo_transaccion=None, )) # Opciones principales: if '--cancela' in sys.argv: if '--loadxml' in sys.argv: ws.LoadTestXML("trazamed_cancela_err.xml") # cargo respuesta ws.SendCancelacTransacc(*sys.argv[sys.argv.index("--cancela")+1:]) elif '--cancela_parcial' in sys.argv: ws.SendCancelacTransaccParcial(*sys.argv[sys.argv.index("--cancela_parcial")+1:]) elif '--confirma' in sys.argv: if '--loadxml' in sys.argv: ws.LoadTestXML("trazamed_confirma.xml") # cargo respuesta ok = ws.SendConfirmaTransacc(usuario="pruebasws", password="******", p_ids_transac="1", f_operacion="31-12-2013") if not ok: raise RuntimeError(ws.Excepcion) ws.SendConfirmaTransacc(*sys.argv[sys.argv.index("--confirma")+1:]) elif '--alerta' in sys.argv: ws.SendAlertaTransacc(*sys.argv[sys.argv.index("--alerta")+1:]) elif '--consulta' in sys.argv: if '--alertados' in sys.argv: ws.GetEnviosPropiosAlertados( *sys.argv[sys.argv.index("--alertados")+1:] ) elif '--movimientos' in sys.argv: ws.GetTransaccionesWS( *sys.argv[sys.argv.index("--movimientos")+1:] ) else: ws.GetTransaccionesNoConfirmadas( *sys.argv[sys.argv.index("--consulta")+1:] #usuario="pruebasws", password="******", #p_id_transaccion_global="1234", #id_agente_informador="1", #id_agente_origen="1", #id_agente_destino="1", #id_medicamento="1", #id_evento="1", #fecha_desde_op="01/01/2015", #fecha_hasta_op="31/12/2013", #fecha_desde_t="01/01/2013", #fecha_hasta_t="31/12/2013", #fecha_desde_v="01/04/2013", #fecha_hasta_v="30/04/2013", #n_factura=5, n_remito=6, #estado=1, #lote=88745, #numero_serial=894124788, ) print "CantPaginas", ws.CantPaginas print "HayError", ws.HayError #print "TransaccionPlainWS", ws.TransaccionPlainWS # parametros comunes de salida (columnas de la tabla): claves = [k for k, v, l in TRANSACCIONES] # extiendo la lista de resultado para el archivo de intercambio: transacciones.extend(ws.TransaccionPlainWS) # encabezado de la tabla: print "||", "||".join(["%s" % clave for clave in claves]), "||" # recorro los datos devueltos (TransaccionPlainWS): while ws.LeerTransaccion(): for clave in claves: print "||", ws.GetParametro(clave), # imprimo cada fila print "||" elif '--catalogo' in sys.argv: ret = ws.GetCatalogoElectronicoByGTIN( *sys.argv[sys.argv.index("--catalogo")+1:] ) for catalogo in ret: print ret # imprimo cada fila else: argv = [argv for argv in sys.argv if not argv.startswith("--")] if not medicamentos: if len(argv)>16: if '--dh' in sys.argv: ws.SendMedicamentosDHSerie(*argv[1:]) elif '--fraccion' in sys.argv: ws.SendMedicamentosFraccion(*argv[1:]) else: ws.SendMedicamentos(*argv[1:]) else: print "ERROR: no se indicaron todos los parámetros requeridos" elif medicamentos: try: usuario, password = argv[1:3] except: print "ADVERTENCIA: no se indico parámetros usuario y passoword" usuario = password = "******" for i, med in enumerate(medicamentos): print "Procesando registro", i del med['codigo_transaccion'] if med.get("cantidad"): del med["desde_numero_serial"] del med["hasta_numero_serial"] ws.SendMedicamentosFraccion(usuario, password, **med) elif med.get("desde_numero_serial"): del med["cantidad"] del med["numero_serial"] ws.SendMedicamentosDHSerie(usuario, password, **med) else: del med["cantidad"] del med["desde_numero_serial"] del med["hasta_numero_serial"] ws.SendMedicamentos(usuario, password, **med) med['codigo_transaccion'] = ws.CodigoTransaccion errores.extend(ws.errores) print "|Resultado %5s|CodigoTransaccion %10s|Errores|%s|" % ( ws.Resultado, ws.CodigoTransaccion, '|'.join(ws.Errores or []), ) else: print "ERROR: no se especificaron medicamentos a informar" if not medicamentos: print "|Resultado %5s|CodigoTransaccion %10s|Errores|%s|" % ( ws.Resultado, ws.CodigoTransaccion, '|'.join(ws.Errores or []), ) if ws.Excepcion: print ws.Traceback if '--grabar' in sys.argv: if '--dbf' in sys.argv: guardar_dbf(formatos, True, {}) elif '--json' in sys.argv: for formato in formatos: archivo = open(formato[0].lower() + ".json", "w") json.dump(formato[2], archivo, sort_keys=True, indent=4) archivo.close() else: for formato in formatos: archivo = open(formato[0].lower() + ".txt", "w") for it in formato[2]: archivo.write(escribir(it, formato[1])) archivo.close()
def main(): "Función principal de pruebas (obtener CAE)" import os, time, sys global WSDL, LOCATION DEBUG = '--debug' in sys.argv ws = TrazaVet() ws.Username = '******' ws.Password = '******' if '--prod' in sys.argv and not H**O: WSDL = "https://servicios.pami.org.ar/trazavet.WebService?wsdl" print "Usando WSDL:", WSDL sys.argv.pop(sys.argv.index("--prod")) if '--proxy' in sys.argv and not H**O: proxy = sys.argv.pop(sys.argv.index("--proxy") + 1) print "Usando proxy:", proxy sys.argv.pop(sys.argv.index("--proxy")) else: proxy = None # Inicializo las variables y estructuras para el archivo de intercambio: transaccion_dto = [] transacciones = [] errores = [] formatos = [('TransaccionDTO', TRANSACCION_DTO, transaccion_dto), ('Transacciones', TRANSACCIONES, transacciones), ('Errores', ERRORES, errores), ] if '--formato' in sys.argv: print "Formato:" for msg, formato, lista in formatos: comienzo = 1 print "=== %s ===" % msg print "|| %-25s || %-12s || %-5s || %-4s || %-10s ||" % ( "Nombre", "Tipo", "Long.", "Pos(txt)", "Campo(dbf)") claves = [] for fmt in formato: clave, longitud, tipo = fmt[0:3] clave_dbf = dar_nombre_campo_dbf(clave, claves) claves.append(clave_dbf) print "|| %-25s || %-12s || %5d || %4d || %-10s ||" % ( clave, tipo, longitud, comienzo, clave_dbf) comienzo += longitud sys.exit(0) if '--cargar' in sys.argv: if '--dbf' in sys.argv: leer_dbf(formatos[:1], {}) elif '--json' in sys.argv: for formato in formatos[:1]: archivo = open(formato[0].lower() + ".json", "r") d = json.load(archivo) formato[2].extend(d) archivo.close() else: for formato in formatos[:1]: archivo = open(formato[0].lower() + ".txt", "r") for linea in archivo: d = leer(linea, formato[1]) formato[2].append(d) archivo.close() ws.Conectar("", WSDL, proxy) if ws.Excepcion: print ws.Excepcion print ws.Traceback sys.exit(-1) # Datos de pruebas: if '--test' in sys.argv: transaccion_dto.append(dict( gln_origen="9876543210982", gln_destino="3692581473693", f_operacion=datetime.datetime.now().strftime("%d/%m/%Y"), f_elaboracion=datetime.datetime.now().strftime("%d/%m/%Y"), f_vto=(datetime.datetime.now()+datetime.timedelta(30)).strftime("%d/%m/%Y"), id_evento=11, cod_producto="88900000000001", n_cantidad=1, n_serie=int(time.time()*10), n_lote=datetime.datetime.now().strftime("%Y"), n_cai="123456789012345", n_cae="", id_motivo_destruccion=0, n_manifiesto="", en_transporte="N", n_remito="1234", motivo_devolucion="", observaciones="prueba", n_vale_compra="", apellidoNombres="Juan Peres", direccion="Saraza", numero="1234", localidad="Hurlingham", provincia="Buenos Aires", n_postal="1688", cuit="20267565393", codigo_transaccion=None, )) # Opciones principales: if '--confirma' in sys.argv: if '--loadxml' in sys.argv: ws.LoadTestXML("trazamed_confirma.xml") # cargo respuesta ok = ws.SendConfirmaTransacc(usuario="pruebasws", password="******", p_ids_transac="1", f_operacion="31-12-2013") if not ok: raise RuntimeError(ws.Excepcion) ws.SendConfirmaTransacc(*sys.argv[sys.argv.index("--confirma")+1:]) elif '--alerta' in sys.argv: ws.SendAlertaTransacc(*sys.argv[sys.argv.index("--alerta")+1:]) elif '--cancela' in sys.argv: ws.SendCancelaTransac(*sys.argv[sys.argv.index("--cancela")+1:]) elif '--consulta' in sys.argv: ws.GetTransacciones( *sys.argv[sys.argv.index("--consulta")+1:] ) print "CantPaginas", ws.CantPaginas print "HayError", ws.HayError #print "TransaccionSenasa", ws.TransaccionSenasa # parametros comunes de salida (columnas de la tabla): claves = [k for k, v, l in TRANSACCIONES] # extiendo la lista de resultado para el archivo de intercambio: transacciones.extend(ws.TransaccionSenasa) # encabezado de la tabla: print "||", "||".join(["%s" % clave for clave in claves]), "||" # recorro los datos devueltos (TransaccionSenasa): while ws.LeerTransaccion(): for clave in claves: print "||", ws.GetParametro(clave), # imprimo cada fila print "||" else: argv = [argv for argv in sys.argv if not argv.startswith("--")] if not transaccion_dto: if len(argv)>10: ws.SaveTransaccion(*argv[1:]) else: print "ERROR: no se indicaron todos los parámetros requeridos" elif transaccion_dto: try: usuario, password = argv[-2:] except: print "ADVERTENCIA: no se indico parámetros usuario y passoword" usuario, password = "******", "Clave2013" for i, dto in enumerate(transaccion_dto): print "Procesando registro", i del dto['codigo_transaccion'] ws.SaveTransaccion(usuario, password, **dto) dto['codigo_transaccion'] = ws.CodigoTransaccion errores.extend(ws.errores) print "|Resultado %5s|CodigoTransaccion %10s|Errores|%s|" % ( ws.Resultado, ws.CodigoTransaccion, '|'.join(ws.Errores or []), ) else: print "ERROR: no se especificaron productos a informar" if not transaccion_dto: print "|Resultado %5s|CodigoTransaccion %10s|Errores|%s|" % ( ws.Resultado, ws.CodigoTransaccion, '|'.join(ws.Errores or []), ) if ws.Excepcion: print ws.Traceback if '--grabar' in sys.argv: if '--dbf' in sys.argv: guardar_dbf(formatos, True, {}) elif '--json' in sys.argv: for formato in formatos: archivo = open(formato[0].lower() + ".json", "w") json.dump(formato[2], archivo, sort_keys=True, indent=4) archivo.close() else: for formato in formatos: archivo = open(formato[0].lower() + ".txt", "w") for it in formato[2]: archivo.write(escribir(it, formato[1])) archivo.close()
def main(): "Función principal de pruebas (obtener CAE)" import os, time, sys global WSDL, LOCATION DEBUG = '--debug' in sys.argv ws = TrazaFito() ws.Username = '******' ws.Password = '******' if '--prod' in sys.argv and not H**O: WSDL = "https://servicios.pami.org.ar/trazaagr.WebService?wsdl" print "Usando WSDL:", WSDL sys.argv.pop(sys.argv.index("--prod")) # Inicializo las variables y estructuras para el archivo de intercambio: transaccion_dto = [] transacciones = [] errores = [] formatos = [('TransaccionDTO', TRANSACCION_DTO, transaccion_dto), ('Transacciones', TRANSACCIONES, transacciones), ('Errores', ERRORES, errores), ] if '--formato' in sys.argv: print "Formato:" for msg, formato, lista in formatos: comienzo = 1 print "=== %s ===" % msg print "|| %-25s || %-12s || %-5s || %-4s || %-10s ||" % ( "Nombre", "Tipo", "Long.", "Pos(txt)", "Campo(dbf)") claves = [] for fmt in formato: clave, longitud, tipo = fmt[0:3] clave_dbf = dar_nombre_campo_dbf(clave, claves) claves.append(clave_dbf) print "|| %-25s || %-12s || %5d || %4d || %-10s ||" % ( clave, tipo, longitud, comienzo, clave_dbf) comienzo += longitud sys.exit(0) if '--cargar' in sys.argv: if '--dbf' in sys.argv: leer_dbf(formatos[:1], {}) elif '--json' in sys.argv: for formato in formatos[:1]: archivo = open(formato[0].lower() + ".json", "r") d = json.load(archivo) formato[2].extend(d) archivo.close() else: for formato in formatos[:1]: archivo = open(formato[0].lower() + ".txt", "r") for linea in archivo: d = leer(linea, formato[1]) formato[2].append(d) archivo.close() ws.Conectar("", WSDL) if ws.Excepcion: print ws.Excepcion print ws.Traceback sys.exit(-1) # Datos de pruebas: if '--test' in sys.argv: transaccion_dto.append(dict( gln_origen="9876543210982", gln_destino="3692581473693", f_operacion=datetime.datetime.now().strftime("%d/%m/%Y"), f_elaboracion=datetime.datetime.now().strftime("%d/%m/%Y"), f_vto=(datetime.datetime.now()+datetime.timedelta(30)).strftime("%d/%m/%Y"), id_evento=11, cod_producto="88900000000001", n_cantidad=1, n_serie=int(time.time()*10), n_lote=datetime.datetime.now().strftime("%Y"), n_cai="123456789012345", n_cae="", id_motivo_destruccion=0, n_manifiesto="", en_transporte="N", n_remito="1234", motivo_devolucion="", observaciones="prueba", n_vale_compra="", apellidoNombres="Juan Peres", direccion="Saraza", numero="1234", localidad="Hurlingham", provincia="Buenos Aires", n_postal="1688", cuit="20267565393", codigo_transaccion=None, )) # Opciones principales: if '--confirma' in sys.argv: if '--loadxml' in sys.argv: ws.LoadTestXML("trazamed_confirma.xml") # cargo respuesta ok = ws.SendConfirmaTransacc(usuario="pruebasws", password="******", p_ids_transac="1", f_operacion="31-12-2013") if not ok: raise RuntimeError(ws.Excepcion) ws.SendConfirmaTransacc(*sys.argv[sys.argv.index("--confirma")+1:]) elif '--alerta' in sys.argv: ws.SendAlertaTransacc(*sys.argv[sys.argv.index("--alerta")+1:]) elif '--cancela' in sys.argv: ws.SendCancelaTransac(*sys.argv[sys.argv.index("--cancela")+1:]) elif '--consulta' in sys.argv: ws.GetTransacciones( *sys.argv[sys.argv.index("--consulta")+1:] ) print "CantPaginas", ws.CantPaginas print "HayError", ws.HayError #print "TransaccionSenasa", ws.TransaccionSenasa # parametros comunes de salida (columnas de la tabla): claves = [k for k, v, l in TRANSACCIONES] # extiendo la lista de resultado para el archivo de intercambio: transacciones.extend(ws.TransaccionSenasa) # encabezado de la tabla: print "||", "||".join(["%s" % clave for clave in claves]), "||" # recorro los datos devueltos (TransaccionSenasa): while ws.LeerTransaccion(): for clave in claves: print "||", ws.GetParametro(clave), # imprimo cada fila print "||" else: argv = [argv for argv in sys.argv if not argv.startswith("--")] if not transaccion_dto: if len(argv)>10: ws.SaveTransaccion(*argv[1:]) else: print "ERROR: no se indicaron todos los parámetros requeridos" elif transaccion_dto: try: usuario, password = argv[-2:] except: print "ADVERTENCIA: no se indico parámetros usuario y passoword" usuario, password = "******", "Clave2013" for i, dto in enumerate(transaccion_dto): print "Procesando registro", i del dto['codigo_transaccion'] ws.SaveTransaccion(usuario, password, **dto) dto['codigo_transaccion'] = ws.CodigoTransaccion errores.extend(ws.errores) print "|Resultado %5s|CodigoTransaccion %10s|Errores|%s|" % ( ws.Resultado, ws.CodigoTransaccion, '|'.join(ws.Errores or []), ) else: print "ERROR: no se especificaron productos a informar" if not transaccion_dto: print "|Resultado %5s|CodigoTransaccion %10s|Errores|%s|" % ( ws.Resultado, ws.CodigoTransaccion, '|'.join(ws.Errores or []), ) if ws.Excepcion: print ws.Traceback if '--grabar' in sys.argv: if '--dbf' in sys.argv: guardar_dbf(formatos, True, {}) elif '--json' in sys.argv: for formato in formatos: archivo = open(formato[0].lower() + ".json", "w") json.dump(formato[2], archivo, sort_keys=True, indent=4) archivo.close() else: for formato in formatos: archivo = open(formato[0].lower() + ".txt", "w") for it in formato[2]: archivo.write(escribir(it, formato[1])) archivo.close()
def GuardarFactura(self): from formatos.formato_sql import escribir escribir([self.factura], self.db) return self.factura['id']
def generar_ventas(items): "Crear archivos de ventas (registros tipo 1 y tipo 2 totales)" periodo = items[0]['fecha_cbte'][:6] out = open("VENTAS_%s.txt" % periodo, "w") totales = format_as_dict(VENTAS_TIPO2) totales['periodo'] = periodo for key in IMPORTES: totales[key] = Decimal(0) # recorro las facturas e itero sobre los subtotales por alicuota de IVA: for item in items: ivas = item.get("ivas", [{}]) for i, iva in enumerate(ivas): vals = format_as_dict(VENTAS_TIPO1) # datos generales de la factura: vals['tipo_reg'] = '1' # copio los campos que no varían para las distintas alicuotas de IVA for k, l, t in VENTAS_TIPO1[1:10] + VENTAS_TIPO1[21:30]: vals[k] = item.get(k) vals['fecha_anulacion'] = '' vals['ctl_fiscal'] = item.get('ctl_fiscal', ' ') # C para controlador vals['anulacion'] = item.get('anulacion', ' ') vals['cbte_nro_reg'] = item['cbt_numero'] vals['cant_hojas'] = '01' vals['transporte'] = '0' vals['categoria'] = categorias[item['categoria'].lower()] if vals['imp_moneda_id'] is None: vals['imp_moneda_id'] = 'PES' vals['imp_moneda_ctz'] = '1.000' # subtotales por alícuota de IVA if 'iva_id' in iva: # mapear alicuota de iva según código usado en MTX iva_id = int(iva['iva_id']) if iva_id == 1: vals['imp_tot_conc'] = iva['base_imp'] alicuota = None elif iva_id == 2: vals['imp_op_ex'] = iva['base_imp'] alicuota = None else: alicuota = {3: "0.00", 4: "10.5", 5: "21", 6: "27"}[iva_id] vals['imp_neto'] = iva['base_imp'] vals['impto_liq'] = iva['importe'] vals['alicuota_iva'] = alicuota or '0.00' else: # tomar datos generales: vals['alicuota_iva'] = (Decimal(item['imp_total']) / Decimal(item['imp_neto']) - 1) * 100 vals['alicuotas_iva'] = '01' if float(item.get('impto_liq', item.get('imp_iva', 0))) == 0: vals['codigo_operacion'] = 'E' else: vals['codigo_operacion'] = ' ' if vals['imp_tot_conc'] is None: vals['imp_tot_conc'] = '0' # acumulo los totales para el registro tipo 2 for k in IMPORTES: totales[k] = totales[k] + Decimal(vals[k] or 0) # otros impuestos (TODO: recorrer tributos) solo ultimo registro: if len(ivas) == i - 1: for k in ('impto_perc', 'imp_iibb', 'impto_perc_mun', 'imp_internos'): if k in item: vals[k] = item[k] totales[k] = totales[k] + Decimal(vals[k] or 0) s = escribir(vals, VENTAS_TIPO1) out.write(s) totales['tipo_reg'] = '2' totales['cant_reg_tipo_1'] = str(len(items)) totales['cuit'] = CUIT s = escribir(totales, VENTAS_TIPO2) out.write(s) out.close()
def escribir_discord(x, y, mensaje): if y == 1100: hacer_click(x, y) escribir(mensaje)
def main(): "Función principal de pruebas (obtener CAE)" import os, time, sys global WSDL, LOCATION DEBUG = '--debug' in sys.argv ws = TrazaProdMed() ws.Username = '******' ws.Password = '******' if '--prod' in sys.argv and not H**O: WSDL = WSDL_PROD print "Usando WSDL:", WSDL sys.argv.pop(sys.argv.index("--prod")) # Inicializo las variables y estructuras para el archivo de intercambio: transacciones = [] errores = [] formatos = [] if '--formato' in sys.argv: print "Formato:" for msg, formato, lista in formatos: comienzo = 1 print "=== %s ===" % msg print "|| %-25s || %-12s || %-5s || %-4s || %-10s ||" % ( "Nombre", "Tipo", "Long.", "Pos(txt)", "Campo(dbf)") claves = [] for fmt in formato: clave, longitud, tipo = fmt[0:3] clave_dbf = dar_nombre_campo_dbf(clave, claves) claves.append(clave_dbf) print "|| %-25s || %-12s || %5d || %4d || %-10s ||" % ( clave, tipo, longitud, comienzo, clave_dbf) comienzo += longitud sys.exit(0) if '--cargar' in sys.argv: if '--dbf' in sys.argv: leer_dbf(formatos[:1], {}) elif '--json' in sys.argv: for formato in formatos[:1]: archivo = open(formato[0].lower() + ".json", "r") d = json.load(archivo) formato[2].extend(d) archivo.close() else: for formato in formatos[:1]: archivo = open(formato[0].lower() + ".txt", "r") for linea in archivo: d = leer(linea, formato[1]) formato[2].append(d) archivo.close() ws.Conectar("", WSDL) if ws.Excepcion: print ws.Excepcion print ws.Traceback sys.exit(-1) # Datos de pruebas: if '--test' in sys.argv: ws.CrearTransaccion( f_evento=datetime.datetime.now().strftime("%d/%m/%Y"), h_evento=datetime.datetime.now().strftime("%H:%M"), gln_origen="7791234567801", gln_destino="7791234567801", n_remito="R0001-12341234", n_factura="A0001-12341234", vencimiento=(datetime.datetime.now() + datetime.timedelta(30)).strftime("%d/%m/%Y"), gtin="07791234567810", lote=datetime.datetime.now().strftime("%Y"), # R4556567 numero_serial=int(time.time() * 10), # A23434 id_evento=1, cuit_medico="30711622507", id_obra_social=465667, apellido="Reingart", nombres="Mariano", tipo_documento="96", n_documento="28510785", sexo="M", calle="San Martin", numero="5656", piso="", depto="1", localidad="Berazategui", provincia="Buenos Aires", n_postal="1700", fecha_nacimiento="20/12/1972", telefono="5555-5555", nro_afiliado="9999999999999", cod_diagnostico="B30", cod_hiv="NOAP31121970", id_motivo_devolucion=1, otro_motivo_devolucion="producto fallado", ) # Opciones principales: if '--cancela' in sys.argv: if '--loadxml' in sys.argv: ws.LoadTestXML( "tests/xml/trazaprodmed_cancela_err.xml") # cargo respuesta ws.SendCancelacTransacc(*sys.argv[sys.argv.index("--cancela") + 1:]) elif '--cancela_parcial' in sys.argv: ws.SendCancelacTransaccParcial( *sys.argv[sys.argv.index("--cancela_parcial") + 1:]) elif '--consulta' in sys.argv: ws.GetTransaccionesWS(*sys.argv[sys.argv.index("--consulta") + 1:]) print "CantPaginas", ws.CantPaginas print "HayError", ws.HayError #print "TransaccionPlainWS", ws.TransaccionPlainWS # parametros comunes de salida (columnas de la tabla): TRANSACCIONES = ws.Transacciones[0].keys() if ws.Transacciones else [] claves = [k for k in TRANSACCIONES] # extiendo la lista de resultado para el archivo de intercambio: transacciones.extend(ws.Transacciones) # encabezado de la tabla: print "||", "||".join(["%s" % clave for clave in claves]), "||" # recorro los datos devueltos (TransaccionPlainWS): while ws.LeerTransaccion(): for clave in claves: print "||", ws.GetParametro(clave), # imprimo cada fila print "||" elif '--catalogo' in sys.argv: ret = ws.GetCatalogoElectronicoByGTIN( *sys.argv[sys.argv.index("--catalogo") + 1:]) for catalogo in ws.params_out.values(): print catalogo # imprimo cada fila else: argv = [argv for argv in sys.argv if not argv.startswith("--")] if not transacciones: if len(argv) > 16: ws.CrearTransaccion(*argv[3:]) else: print "ERROR: no se indicaron todos los parámetros requeridos" if ws.Transacciones: try: usuario, password = argv[1:3] except: print "ADVERTENCIA: no se indico parámetros usuario y passoword" usuario = password = "******" ws.InformarProducto(usuario, password) for i, tx in enumerate(transacciones): print "Procesando registro", i tx['codigo_transaccion'] = ws.CodigoTransaccion errores.extend(ws.errores) print "|Resultado %5s|CodigoTransaccion %10s|Errores|%s|" % ( ws.Resultado, ws.CodigoTransaccion, '|'.join(ws.Errores or []), ) else: print "ERROR: no se especificaron productos a informar" if ws.Excepcion: print ws.Traceback if '--grabar' in sys.argv: if '--dbf' in sys.argv: guardar_dbf(formatos, True, {}) elif '--json' in sys.argv: for formato in formatos: archivo = open(formato[0].lower() + ".json", "w") json.dump(formato[2], archivo, sort_keys=True, indent=4) archivo.close() else: for formato in formatos: archivo = open(formato[0].lower() + ".txt", "w") for it in formato[2]: archivo.write(escribir(it, formato[1])) archivo.close()
def main(): "Función principal de pruebas (obtener CAE)" import os, time, sys global WSDL, LOCATION DEBUG = '--debug' in sys.argv ws = TrazaMed() ws.Username = '******' ws.Password = '******' if '--prod' in sys.argv and not H**O: WSDL = "https://trazabilidad.pami.org.ar:9050/trazamed.WebService" print "Usando WSDL:", WSDL sys.argv.pop(sys.argv.index("--prod")) # Inicializo las variables y estructuras para el archivo de intercambio: medicamentos = [] transacciones = [] errores = [] formatos = [('Medicamentos', MEDICAMENTOS, medicamentos), ('Transacciones', TRANSACCIONES, transacciones), ('Errores', ERRORES, errores), ] if '--formato' in sys.argv: print "Formato:" for msg, formato, lista in formatos: comienzo = 1 print "=== %s ===" % msg print "|| %-25s || %-12s || %-5s || %-4s || %-10s ||" % ( "Nombre", "Tipo", "Long.", "Pos(txt)", "Campo(dbf)") claves = [] for fmt in formato: clave, longitud, tipo = fmt[0:3] clave_dbf = dar_nombre_campo_dbf(clave, claves) claves.append(clave_dbf) print "|| %-25s || %-12s || %5d || %4d || %-10s ||" % ( clave, tipo, longitud, comienzo, clave_dbf) comienzo += longitud sys.exit(0) if '--cargar' in sys.argv: if '--dbf' in sys.argv: leer_dbf(formatos[:1], {}) elif '--json' in sys.argv: for formato in formatos[:1]: archivo = open(formato[0].lower() + ".json", "r") d = json.load(archivo) formato[2].extend(d) archivo.close() else: for formato in formatos[:1]: archivo = open(formato[0].lower() + ".txt", "r") for linea in archivo: d = leer(linea, formato[1]) formato[2].append(d) archivo.close() ws.Conectar("", WSDL) if ws.Excepcion: print ws.Excepcion print ws.Traceback sys.exit(-1) # Datos de pruebas: if '--test' in sys.argv: medicamentos.append(dict( f_evento=datetime.datetime.now().strftime("%d/%m/%Y"), h_evento=datetime.datetime.now().strftime("%H:%M"), gln_origen="9999999999918", gln_destino="glnws", n_remito="R000100001234", n_factura="A000100001234", vencimiento=(datetime.datetime.now()+datetime.timedelta(30)).strftime("%d/%m/%Y"), gtin="GTIN1", lote=datetime.datetime.now().strftime("%Y"), numero_serial=int(time.time()*10), id_obra_social=None, id_evento=134, cuit_origen="20267565393", cuit_destino="20267565393", apellido="Reingart", nombres="Mariano", tipo_documento="96", n_documento="26756539", sexo="M", direccion="Saraza", numero="1234", piso="", depto="", localidad="Hurlingham", provincia="Buenos Aires", n_postal="1688", fecha_nacimiento="01/01/2000", telefono="5555-5555", nro_asociado="9999999999999", cantidad=None, desde_numero_serial=None, hasta_numero_serial=None, codigo_transaccion=None, )) if '--testfraccion' in sys.argv: medicamentos.append(dict( f_evento=datetime.datetime.now().strftime("%d/%m/%Y"), h_evento=datetime.datetime.now().strftime("%H:%M"), gln_origen="9999999999918", gln_destino="glnws", n_remito="1234", n_factura="1234", vencimiento=(datetime.datetime.now()+datetime.timedelta(30)).strftime("%d/%m/%Y"), gtin="GTIN1", lote=datetime.datetime.now().strftime("%Y"), numero_serial=int(time.time()*10), id_obra_social=None, id_evento=134, cuit_origen="20267565393", cuit_destino="20267565393", apellido="Reingart", nombres="Mariano", tipo_documento="96", n_documento="26756539", sexo="M", direccion="Saraza", numero="1234", piso="", depto="", localidad="Hurlingham", provincia="Buenos Aires", n_postal="1688", fecha_nacimiento="01/01/2000", telefono="5555-5555", nro_asociado="9999999999999", cantidad=5, desde_numero_serial=None, hasta_numero_serial=None, codigo_transaccion=None, )) if '--testdh' in sys.argv: medicamentos.append(dict( f_evento=datetime.datetime.now().strftime("%d/%m/%Y"), h_evento=datetime.datetime.now().strftime("%H:%M"), gln_origen="9999999999918", gln_destino="glnws", n_remito="1234", n_factura="1234", vencimiento=(datetime.datetime.now()+datetime.timedelta(30)).strftime("%d/%m/%Y"), gtin="GTIN1", lote=datetime.datetime.now().strftime("%Y"), desde_numero_serial=int(time.time()*10)-1, hasta_numero_serial=int(time.time()*10)+1, id_obra_social=None, id_evento=134, nro_asociado="1234", cantidad=None, numero_serial=None, codigo_transaccion=None, )) # Opciones principales: if '--cancela' in sys.argv: if '--loadxml' in sys.argv: ws.LoadTestXML("trazamed_cancela_err.xml") # cargo respuesta ws.SendCancelacTransacc(*sys.argv[sys.argv.index("--cancela")+1:]) elif '--cancela_parcial' in sys.argv: ws.SendCancelacTransaccParcial(*sys.argv[sys.argv.index("--cancela_parcial")+1:]) elif '--confirma' in sys.argv: if '--loadxml' in sys.argv: ws.LoadTestXML("trazamed_confirma.xml") # cargo respuesta ok = ws.SendConfirmaTransacc(usuario="pruebasws", password="******", p_ids_transac="1", f_operacion="31-12-2013") if not ok: raise RuntimeError(ws.Excepcion) ws.SendConfirmaTransacc(*sys.argv[sys.argv.index("--confirma")+1:]) elif '--alerta' in sys.argv: ws.SendAlertaTransacc(*sys.argv[sys.argv.index("--alerta")+1:]) elif '--consulta' in sys.argv: if '--alertados' in sys.argv: ws.GetEnviosPropiosAlertados( *sys.argv[sys.argv.index("--alertados")+1:] ) elif '--movimientos' in sys.argv: ws.GetTransaccionesWS( *sys.argv[sys.argv.index("--movimientos")+1:] ) else: ws.GetTransaccionesNoConfirmadas( *sys.argv[sys.argv.index("--consulta")+1:] #usuario="pruebasws", password="******", #p_id_transaccion_global="1234", #id_agente_informador="1", #id_agente_origen="1", #id_agente_destino="1", #id_medicamento="1", #id_evento="1", #fecha_desde_op="01/01/2015", #fecha_hasta_op="31/12/2013", #fecha_desde_t="01/01/2013", #fecha_hasta_t="31/12/2013", #fecha_desde_v="01/04/2013", #fecha_hasta_v="30/04/2013", #n_factura=5, n_remito=6, #estado=1, #lote=88745, #numero_serial=894124788, ) print "CantPaginas", ws.CantPaginas print "HayError", ws.HayError #print "TransaccionPlainWS", ws.TransaccionPlainWS # parametros comunes de salida (columnas de la tabla): claves = [k for k, v, l in TRANSACCIONES] # extiendo la lista de resultado para el archivo de intercambio: transacciones.extend(ws.TransaccionPlainWS) # encabezado de la tabla: print "||", "||".join(["%s" % clave for clave in claves]), "||" # recorro los datos devueltos (TransaccionPlainWS): while ws.LeerTransaccion(): for clave in claves: print "||", ws.GetParametro(clave), # imprimo cada fila print "||" elif '--catalogo' in sys.argv: ret = ws.GetCatalogoElectronicoByGTIN( *sys.argv[sys.argv.index("--catalogo")+1:] ) for catalogo in ws.params_out.values(): print catalogo # imprimo cada fila elif '--stock' in sys.argv: ret = ws.GetConsultaStock( *sys.argv[sys.argv.index("--stock")+1:] ) print "\n".join([str(s) for s in ws.params_out.values()]) else: argv = [argv for argv in sys.argv if not argv.startswith("--")] if not medicamentos: if len(argv)>16: if '--dh' in sys.argv: ws.SendMedicamentosDHSerie(*argv[1:]) elif '--fraccion' in sys.argv: ws.SendMedicamentosFraccion(*argv[1:]) else: ws.SendMedicamentos(*argv[1:]) else: print "ERROR: no se indicaron todos los parámetros requeridos" elif medicamentos: try: usuario, password = argv[1:3] except: print "ADVERTENCIA: no se indico parámetros usuario y passoword" usuario = password = "******" for i, med in enumerate(medicamentos): print "Procesando registro", i del med['codigo_transaccion'] if med.get("cantidad"): del med["desde_numero_serial"] del med["hasta_numero_serial"] ws.SendMedicamentosFraccion(usuario, password, **med) elif med.get("desde_numero_serial"): del med["cantidad"] del med["numero_serial"] ws.SendMedicamentosDHSerie(usuario, password, **med) else: del med["cantidad"] del med["desde_numero_serial"] del med["hasta_numero_serial"] ws.SendMedicamentos(usuario, password, **med) med['codigo_transaccion'] = ws.CodigoTransaccion errores.extend(ws.errores) print "|Resultado %5s|CodigoTransaccion %10s|Errores|%s|" % ( ws.Resultado, ws.CodigoTransaccion, '|'.join(ws.Errores or []), ) else: print "ERROR: no se especificaron medicamentos a informar" if not medicamentos: print "|Resultado %5s|CodigoTransaccion %10s|Errores|%s|" % ( ws.Resultado, ws.CodigoTransaccion, '|'.join(ws.Errores or []), ) if ws.Excepcion: print ws.Traceback if '--grabar' in sys.argv: if '--dbf' in sys.argv: guardar_dbf(formatos, True, {}) elif '--json' in sys.argv: for formato in formatos: archivo = open(formato[0].lower() + ".json", "w") json.dump(formato[2], archivo, sort_keys=True, indent=4) archivo.close() else: for formato in formatos: archivo = open(formato[0].lower() + ".txt", "w") for it in formato[2]: archivo.write(escribir(it, formato[1])) archivo.close()
def generar_ventas(items): "Crear archivos de ventas (registros tipo 1 y tipo 2 totales)" periodo = items[0]['fecha_cbte'][:6] out = open("VENTAS_%s.txt" % periodo, "w") totales = format_as_dict(VENTAS_TIPO2) totales['periodo'] = periodo for key in IMPORTES: totales[key] = Decimal(0) # recorro las facturas e itero sobre los subtotales por alicuota de IVA: for item in items: ivas = item.get("ivas", [{}]) for i, iva in enumerate(ivas): vals = format_as_dict(VENTAS_TIPO1) # datos generales de la factura: vals['tipo_reg'] = '1' # copio los campos que no varían para las distintas alicuotas de IVA for k, l, t in VENTAS_TIPO1[1:10] + VENTAS_TIPO1[21:30]: vals[k] = item.get(k) vals['fecha_anulacion'] = '' vals['ctl_fiscal'] = item.get('ctl_fiscal', ' ') # C para controlador vals['anulacion'] = item.get('anulacion', ' ') vals['cbte_nro_reg'] = item['cbt_numero'] vals['cant_hojas'] = '01' vals['transporte'] = '0' vals['categoria'] = categorias[item['categoria'].lower()] if vals['imp_moneda_id'] is None: vals['imp_moneda_id'] = 'PES' vals['imp_moneda_ctz'] = '1.000' # subtotales por alícuota de IVA if 'iva_id' in iva: # mapear alicuota de iva según código usado en MTX iva_id = int(iva['iva_id']) if iva_id == 1: vals['imp_tot_conc'] = iva['base_imp'] alicuota = None elif iva_id == 2: vals['imp_op_ex'] = iva['base_imp'] alicuota = None else: alicuota = {3: "0.00", 4: "10.5", 5: "21", 6: "27"}[iva_id] vals['imp_neto'] = iva['base_imp'] vals['impto_liq'] = iva['importe'] vals['alicuota_iva'] = alicuota or '0.00' else: # tomar datos generales: vals['alicuota_iva'] = (Decimal(item['imp_total'])/Decimal(item['imp_neto']) - 1) * 100 vals['alicuotas_iva'] = '01' if float(item.get('impto_liq', item.get('imp_iva', 0))) == 0: vals['codigo_operacion'] = 'E' else: vals['codigo_operacion'] = ' ' if vals['imp_tot_conc'] is None: vals['imp_tot_conc'] = '0' # acumulo los totales para el registro tipo 2 for k in IMPORTES: totales[k] = totales[k] + Decimal(vals[k] or 0) # otros impuestos (TODO: recorrer tributos) solo ultimo registro: if len(ivas) == i-1: for k in ('impto_perc', 'imp_iibb', 'impto_perc_mun', 'imp_internos'): if k in item: vals[k] = item[k] totales[k] = totales[k] + Decimal(vals[k] or 0) s = escribir(vals, VENTAS_TIPO1) out.write(s) totales['tipo_reg'] = '2' totales['cant_reg_tipo_1'] = str(len(items)) totales['cuit'] = CUIT s = escribir(totales, VENTAS_TIPO2) out.write(s) out.close()
def generar_ventas(items): "Crear archivos de ventas (registros tipo 1 y tipo 2 totales)" periodo = items[0]["fecha_cbte"][:6] out = open("VENTAS_%s.txt" % periodo, "w") totales = format_as_dict(VENTAS_TIPO2) totales["periodo"] = periodo for key in IMPORTES: totales[key] = Decimal(0) # recorro las facturas e itero sobre los subtotales por alicuota de IVA: for item in items: ivas = item.get("ivas", [{}]) for i, iva in enumerate(ivas): vals = format_as_dict(VENTAS_TIPO1) # datos generales de la factura: vals["tipo_reg"] = "1" # copio los campos que no varían para las distintas alicuotas de IVA for k, l, t in VENTAS_TIPO1[1:10] + VENTAS_TIPO1[21:30]: vals[k] = item.get(k) vals["fecha_anulacion"] = "" vals["ctl_fiscal"] = item.get("ctl_fiscal", " ") # C para controlador vals["anulacion"] = item.get("anulacion", " ") vals["cbte_nro_reg"] = item["cbt_numero"] vals["cant_hojas"] = "01" vals["transporte"] = "0" vals["categoria"] = categorias[item["categoria"].lower()] if vals["imp_moneda_id"] is None: vals["imp_moneda_id"] = "PES" vals["imp_moneda_ctz"] = "1.000" # subtotales por alícuota de IVA if "iva_id" in iva: # mapear alicuota de iva según código usado en MTX iva_id = int(iva["iva_id"]) if iva_id == 1: vals["imp_tot_conc"] = iva["base_imp"] alicuota = None elif iva_id == 2: vals["imp_op_ex"] = iva["base_imp"] alicuota = None else: alicuota = {3: "0.00", 4: "10.5", 5: "21", 6: "27"}[iva_id] vals["imp_neto"] = iva["base_imp"] vals["impto_liq"] = iva["importe"] vals["alicuota_iva"] = alicuota or "0.00" else: # tomar datos generales: vals["alicuota_iva"] = (Decimal(item["imp_total"]) / Decimal(item["imp_neto"]) - 1) * 100 vals["alicuotas_iva"] = "01" if float(item.get("impto_liq", item.get("imp_iva", 0))) == 0: vals["codigo_operacion"] = "E" else: vals["codigo_operacion"] = " " if vals["imp_tot_conc"] is None: vals["imp_tot_conc"] = "0" # acumulo los totales para el registro tipo 2 for k in IMPORTES: totales[k] = totales[k] + Decimal(vals[k] or 0) # otros impuestos (TODO: recorrer tributos) solo ultimo registro: if len(ivas) == i - 1: for k in ("impto_perc", "imp_iibb", "impto_perc_mun", "imp_internos"): if k in item: vals[k] = item[k] totales[k] = totales[k] + Decimal(vals[k] or 0) s = escribir(vals, VENTAS_TIPO1) out.write(s) totales["tipo_reg"] = "2" totales["cant_reg_tipo_1"] = str(len(items)) totales["cuit"] = CUIT s = escribir(totales, VENTAS_TIPO2) out.write(s) out.close()