def get_nombre_archivo_from_tv(tv): """ Devuelve el nombre del archivo que se generará a partir del nombre del widget TreeView. """ nomtreeview = tv.get_name().replace(" ", "_") nomarchivo = os.path.join(gettempdir(), "%s_%s.csv" % (nomtreeview, geninformes.give_me_the_name_baby())) return nomarchivo
def go_from_presupuesto(presupuesto): """ Construye el PDF a partir de un objeto presupuesto y no de sus datos sueltos. """ try: dde = pclases.DatosDeLaEmpresa.select()[0] lineas_empresa = [dde.nombre, dde.direccion, "%s %s (%s), %s" % (dde.cp, dde.ciudad, dde.provincia, dde.pais), "Telf.: %s" % (dde.telefono)] if dde.fax: lineas_empresa.append("Fax: %s" % (dde.fax)) if dde.email: lineas_empresa.append(dde.email) except IndexError: lineas_empresa = [] lineas_contenido = presupuesto.lineasDePedido + presupuesto.servicios datos_cliente = [] if presupuesto.personaContacto != "": datos_cliente.append("A la atención de %s" % (presupuesto.personaContacto)) datos_cliente.append(presupuesto.nombrecliente) datos_cliente.append(presupuesto.direccion) listadireccion = [presupuesto.cp, presupuesto.ciudad] if presupuesto.ciudad.strip() != presupuesto.provincia.strip(): listadireccion.append(presupuesto.provincia) listadireccion.append(presupuesto.pais) segunda_linea_direccion = " ".join([token.strip() for token in listadireccion if token.strip() != ""]) datos_cliente.append(segunda_linea_direccion) if presupuesto.telefono.strip() != "": datos_cliente.append("Tlf.: %s" % (presupuesto.telefono)) if presupuesto.fax.strip() != "": datos_cliente.append("Fax.: %s" % (presupuesto.fax)) fecha_entradilla = utils.str_fecha(presupuesto.fecha) try: dde = pclases.DatosDeLaEmpresa.select()[0] iva = dde.iva except IndexError: iva = 0.18 totales = {"orden": ["Base imponible", "IVA %d%%" % (iva * 100), "TOTAL"], "Base imponible": utils.float2str(presupuesto.calcular_base_imponible()), "IVA %d%%" % (iva * 100): utils.float2str(presupuesto.calcular_total_iva()), "TOTAL": utils.float2str(presupuesto.calcular_importe_total()) } if presupuesto.descuento: fila_descuento = "Descuento %s %%" % ( utils.float2str(presupuesto.descuento*100, autodec = True)) totales['orden'].insert(0, fila_descuento) totales[fila_descuento] = utils.float2str( presupuesto.calcular_subtotal(incluir_descuento = False) * presupuesto.descuento * -1) fila_subtotal = "Subtotal" totales['orden'].insert(0, fila_subtotal) totales[fila_subtotal] = utils.float2str( presupuesto.calcular_subtotal(incluir_descuento = False)) total_irpf = presupuesto.calcular_total_irpf() if total_irpf != 0: try: dde = pclases.DatosDeLaEmpresa.select()[0] irpf = dde.irpf except IndexError: irpf = None texto_irpf = "IRPF" if irpf: texto_irpf += " (%d%%)" % (irpf*100) totales[texto_irpf] = utils.float2str(total_irpf) totales["orden"].insert(-2, texto_irpf) try: dde = pclases.DatosDeLaEmpresa.select()[0] logo = dde.get_ruta_completa_logo() except IndexError: logo = None if presupuesto.validez: validez = presupuesto.validez else: validez = None nomarchivo = os.path.join(gettempdir(), "presupuesto_%s.pdf" % give_me_the_name_baby()) go("Presupuesto %s (%s)" % (presupuesto.cliente.nombre, utils.str_fecha(presupuesto.fecha)), nomarchivo, lineas_empresa, datos_cliente, lineas_contenido, fecha_entradilla, totales, presupuesto.texto, presupuesto.despedida, ruta_logo = logo, validez = validez, numpresupuesto = presupuesto.numpresupuesto) return nomarchivo
def go_from_albaranSalida(albaranSalida, kilos = None, imprimir_recogida = True): """ Construye el PDF a partir de un objeto albaranSalida y no de sus datos sueltos. «kilos» es un texto que se imprimirá en el cuadro correspondiente. Si es none intenta calcularlo. «imprimir_recogida» es un booleano. Si es False no genera la última página. """ cliente = albaranSalida.cliente datos_cliente = {"código": cliente.id, "cif": cliente.cif, "razón social": cliente.nombre, "dirección": cliente.direccion, "población": cliente.ciudad, "provincia": cliente.provincia} if cliente.cp and cliente.cp.strip(): datos_cliente["población"] = (cliente.cp + " - " + datos_cliente["población"]) if kilos is None: try: kilos = utils.float2str( sum([ldv.producto.calcular_kilos() * ldv.cantidad for ldv in albaranSalida.lineasDeVenta])) except (TypeError, ValueError): kilos = "" datos_albaran = {"fecha": utils.str_fecha(albaranSalida.fecha), "número": albaranSalida.numalbaran, "kilos": kilos, "bultos": utils.float2str( sum([ldv.cantidad for ldv in albaranSalida.lineasDeVenta]), autodec = True)} iva = cliente.iva lineas_contenido = [(ldv.producto.codigo, ldv.producto.descripcion, ldv.cantidad, #ldv.precio * (1.0 - ldv.descuento) * (1 + iva), # CWT: Ahora prefiere los precios sin IVA. ldv.precio * (1.0 - ldv.descuento), ldv.pedidoVenta and ldv.pedidoVenta.numpedido or "") for ldv in albaranSalida.lineasDeVenta] totales = [albaranSalida.calcular_total(iva_incluido = False), iva, albaranSalida.calcular_total(iva_incluido = True)] try: dde = pclases.DatosDeLaEmpresa.select()[0] datos_de_la_empresa = [os.path.join("..", "imagenes", dde.logo), dde.nombre + (dde.cif and " (" + dde.str_cif_o_nif() +": " + dde.cif + ")" or ""), dde.direccion, "%s %s (%s), %s" % (dde.cp, dde.ciudad, dde.provincia, dde.pais), ] if dde.fax: if dde.fax.strip() == dde.telefono.strip(): datos_de_la_empresa.append("Telf. y fax: %s" % dde.telefono) else: datos_de_la_empresa.append("Telf.: %s" % (dde.telefono)) datos_de_la_empresa.append("Fax: %s" % (dde.fax)) if dde.email: datos_de_la_empresa.append(dde.email) titular = dde.nombreContacto except IndexError: datos_de_la_empresa = [None] titular = "" nomarchivo = os.path.join(gettempdir(), "albaranSalida_%s.pdf" % give_me_the_name_baby()) return go("Albaran de salida - Carta de portes %s (%s)" % ( albaranSalida.cliente.nombre, utils.str_fecha(albaranSalida.fecha)), nomarchivo, datos_cliente, datos_albaran, lineas_contenido, totales, datos_de_la_empresa, titular, imprimir_recogida)
def imprimir(self, boton): # OJO: Como no hay catálogo de pruebas en la base de datos, las # unidades, métodos y descripciones de las pruebas sobre geotextiles # están HARCODED aquí. # PLAN: Meter todo esto en el tablas.sql, como debe de ser. data_prueba = { "Resistencia longitudinal": {"descripción": "Resistencia a la tracción DM", "método": "EN ISO 10319", "unidad": "kN/m"}, "Resistencia transversal": {"descripción": "Resistencia a la tracción DT", "método": "EN ISO 10319", "unidad": "kN/m"}, "Alargamiento longitudinal": {"descripción": "Alargamiento DM", "método": "EN ISO 10319", "unidad": "%"}, "Alargamiento transversal": {"descripción": "Alargamiento DT", "método": "EN ISO 10319", "unidad": "%"}, "Perforación": {"descripción": "Resistencia a la perforación dinámica (Caída de cono)", "método": "EN ISO 13433", "unidad": "mm"}, "Resistencia a la compresión": {"descripción": "Resistencia al punzonado estático (CBR a perforación)", "método": "EN ISO 12236", "unidad": "kN"}, "Apertura de poros": {"descripción": "Medida de apertura (Porometría 090)", "método": "EN ISO 12956", "unidad": "mm"}, "Punzonado piramidal": {"descripción": "Resistencia al punzonado piramidal", "método": "NF G38-019", "unidad": "kN"}, "Permeabilidad": {"descripción": "Permeabilidad perpendicular al agua", "método": "EN ISO 11058", "unidad": "l/m²/s"}, "Gramaje": {"descripción": "Gramaje", "método": "EN ISO 9864", "unidad": "g/m²"}, "Espesor": {"descripción": "Espesor bajo 2 kPa", "método": "EN ISO 9863-1", "unidad": "mm"} } if not self.objeto: return #tv = self.wids['tv_datos'] #from treeview2pdf import treeview2pdf from informes import abrir_pdf #strfecha = "%s - %s" % (utils.str_fecha(mx.DateTime.localtime()), # utils.str_hora(mx.DateTime.localtime())) #abrir_pdf(treeview2pdf(tv, # titulo = "Certificado de calidad de albarán %s" % ( # self.objeto.numalbaran), # fecha = strfecha, # apaisado = False)) path_informes = os.path.join("..", "informes") if path_informes not in sys.path: sys.path.append(path_informes) import informe_certificado_calidad from geninformes import give_me_the_name_baby from time import sleep dic_productos = {} model = self.wids['tv_datos'].get_model() for fila in model: producto = pclases.getObjetoPUID(fila[-1]) dic_productos[producto] = {} for hijo in fila.iterchildren(): caracteristica = hijo[0] valor = hijo[-2] dic_productos[producto][caracteristica] = { "descripción": data_prueba[caracteristica]["descripción"], "método": data_prueba[caracteristica]["método"], "unidad": data_prueba[caracteristica]["unidad"], "valor": valor} for producto in dic_productos: dic_valores = dic_productos[producto] if producto.es_rollo(): orden = ("Resistencia longitudinal", "Resistencia transversal", "Alargamiento longitudinal", "Alargamiento transversal", "Perforación", "Resistencia a la compresión", "Apertura de poros", "Permeabilidad", "Gramaje", "Espesor", "Punzonado piramidal") nomfich = informe_certificado_calidad.go( "certcalidad_%s.pdf" % give_me_the_name_baby(), producto, dic_valores, pclases.DatosDeLaEmpresa.select()[0], self.objeto, orden = orden) sleep(1) abrir_pdf(nomfich)
def go_from_albaranSalida(albaranSalida): """ Construye el PDF a partir de un objeto albaranSalida y no de sus datos sueltos. """ cliente = albaranSalida.cliente datos_cliente = {"código": cliente.id, "cif": cliente.cif, "razón social": cliente.nombre, "dirección": cliente.direccion, "población": cliente.ciudad, "provincia": cliente.provincia} if cliente.cp and cliente.cp.strip(): datos_cliente["población"] = (cliente.cp + " - " + datos_cliente["población"]) datos_albaran = {"fecha": utils.str_fecha(albaranSalida.fecha), "número": albaranSalida.numalbaran, "codcliente": albaranSalida.cliente and `albaranSalida.cliente.id` or ""} iva = cliente.iva lineas_contenido = [(ldv.producto.codigo, ldv.producto.descripcion, ldv.cantidad, ldv.precio * (1.0 - ldv.descuento) * (1 + iva), ldv.pedidoVenta and ldv.pedidoVenta.numpedido or "") for ldv in albaranSalida.lineasDeVenta] totales = [albaranSalida.calcular_total(iva_incluido = False), iva, albaranSalida.calcular_total(iva_incluido = True)] try: dde = pclases.DatosDeLaEmpresa.select()[0] datos_de_la_empresa = [os.path.join("..", "imagenes", dde.logo), dde.nombre + (dde.cif and " (" + dde.str_cif_o_nif() +": " + dde.cif + ")" or ""), dde.direccion, "%s %s (%s), %s" % (dde.cp, dde.ciudad, dde.provincia, dde.pais), ] if dde.fax: if dde.fax.strip() == dde.telefono.strip(): datos_de_la_empresa.append("Telf. y fax: %s" % dde.telefono) else: datos_de_la_empresa.append("Telf.: %s" % (dde.telefono)) datos_de_la_empresa.append("Fax: %s" % (dde.fax)) if dde.email: datos_de_la_empresa.append(dde.email) except IndexError: lineas_empresa = [None] nomarchivo = os.path.join(gettempdir(), "albaranSalida_%s.pdf" % give_me_the_name_baby()) return go("Albaran de salida %s (%s)" % ( albaranSalida.cliente.nombre, utils.str_fecha(albaranSalida.fecha)), nomarchivo, datos_cliente, datos_albaran, lineas_contenido, totales, datos_de_la_empresa)
def go_from_facturaVenta(facturaVenta): """ Construye el PDF a partir de un objeto facturaVenta y no de sus datos sueltos. """ cliente = facturaVenta.cliente datos_cliente = {"código": cliente.id, "cif": cliente.cif, "razón social": cliente.nombre, "dirección": cliente.direccion, "población": cliente.ciudad, "provincia": cliente.provincia} if cliente.cp and cliente.cp.strip(): datos_cliente["población"] = (cliente.cp + " - " + datos_cliente["población"]) datos_factura = {"fecha": utils.str_fecha(facturaVenta.fecha), "número": facturaVenta.numfactura, "codcliente": facturaVenta.cliente and `facturaVenta.cliente.id` or ""} iva = cliente.iva # TODO: ¿Usar el float2str_autoprecision? lineas_contenido = [(ldv.producto.codigo, ldv.producto.descripcion, ldv.cantidad, ldv.precio * (1.0 - ldv.descuento) * (1 + iva)) for ldv in facturaVenta.lineasDeVenta] lineas_contenido += [("", srv.concepto, srv.cantidad, srv.precio * (1.0 - srv.descuento) * (1 + iva)) for srv in facturaVenta.servicios] totales = [facturaVenta.calcular_base_imponible(), iva, facturaVenta.calcular_total()] try: dde = pclases.DatosDeLaEmpresa.select()[0] datos_de_la_empresa = [os.path.join("..", "imagenes", dde.logo), dde.nombre + (dde.cif and " (" + dde.str_cif_o_nif() +": " + dde.cif + ")" or ""), dde.direccion, "%s %s (%s), %s" % (dde.cp, dde.ciudad, dde.provincia, dde.pais), ] if dde.fax: if dde.fax.strip() == dde.telefono.strip(): datos_de_la_empresa.append("Telf. y fax: %s" % dde.telefono) else: datos_de_la_empresa.append("Telf.: %s" % (dde.telefono)) datos_de_la_empresa.append("Fax: %s" % (dde.fax)) if dde.email: datos_de_la_empresa.append(dde.email) except IndexError: lineas_empresa = [None] nomarchivo = os.path.join(gettempdir(), "facturaVenta_%s.pdf" % give_me_the_name_baby()) vencimientos = [] forma_de_pago = [] vtos = facturaVenta.vencimientosCobro[:] vtos.sort(lambda v1, v2: (v1.fecha < v2.fecha and 1) or (v1.fecha > v2.fecha and -1) or 0) for v in vtos: strvto = "%s (%s €)" % (utils.str_fecha(v.fecha), utils.float2str(v.importe)) vencimientos.append(strvto) forma_de_pago.append(v.observaciones) observaciones = ["Importa la presente factura:", numerals.numerals(totales[-1], moneda = "EUROS", fraccion = "CÉNTIMOS").upper()] if facturaVenta.observaciones: observaciones.append(facturaVenta.observaciones) return go("Factura de venta %s (%s)" % ( facturaVenta.cliente.nombre, utils.str_fecha(facturaVenta.fecha)), nomarchivo, datos_cliente, datos_factura, lineas_contenido, totales, datos_de_la_empresa, observaciones, vencimientos, forma_de_pago)
def etiqueta_rollos_portrait(rollos, mostrar_marcado = True): """ Construye una etiqueta """ # Voy a tratar de reescribir esto regla en mano a ver si consigo # cuadrarlo bien en la etiquetadora GEMINI. height = 12.55 * cm width = 8.4 * cm # Escala ancho = 7.2 alto = 11.3 scale = height / alto # Medidas en papel. brand = (0.4 * scale, (alto - 2.0) * scale) logo = (3.8 * scale, (alto - 2.8) * scale) marcado = ((7.2/2) * scale, (alto - 3.0) * scale) column1 = .35 * scale column2 = logo[0] lineas = map(lambda x: (alto - x) * scale, [3.4 + (i*.6) for i in range(13)]) # Datos data = {'brand': "EkoTex", "c100": "UK Distributor", "c108": "Product Name", "c109": "Roll Number", "c110": "Product Dimensions", "c111": "Polymer", "c112": "Product Classification", "c200": "Geosynthetics Limited", "c201": "Fleming Road", "c202": "Harrowbrook Ind Est", "c203": "Hinckley", "c204": "Leicestershire", "c205": "LE10 3 DU", "c206": "Tel 01455 617139", "c207": "Fax 01455 617140", "c211": "Polypropylene", "c212": "GTX-N", "marcado": "0799-CPD", # Hay que incluirle el logotipo CE delante. } data["logo"] = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "imagenes", "logo_ekotex.png")) # Ruta absoluta # a la imagen del logotipo. logo_marcado = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "imagenes", "CE.png")) # Creo la hoja nomarchivo = os.path.join(gettempdir(), "etiqEkotex_%s.pdf" % give_me_the_name_baby()) c = canvas.Canvas(nomarchivo, pagesize = (width, height)) for rollo in rollos: try: data["c208"] = rollo['objeto'].productoVenta.nombre data["c209"] = rollo['objeto'].numrollo cer = rollo['objeto'].productoVenta.camposEspecificosRollo except AttributeError: # No se ha creado el objeto todavía. Es None. data["c208"] = rollo['productoVenta'].nombre data["c209"] = rollo['nrollo'] cer = rollo['productoVenta'].camposEspecificosRollo data["c210"] = "%sm x %dm" % (float2str(cer.ancho, autodec = True, separador_decimales = "."), cer.metrosLineales) rectangulo(c, (0.3 * cm, 0.3 * cm), (width - 0.3 * cm, height - 0.3 * cm)) c.setFont("Helvetica-Bold", 16) c.drawString(brand[0], brand[1], escribe(data['brand'])) c.setFont("Helvetica-Bold", 10) c.drawString(column1, lineas[0], escribe(data['c100'])) c.drawString(column1, lineas[8], escribe(data['c108'])) c.drawString(column1, lineas[9], escribe(data['c109'])) c.drawString(column1, lineas[10], escribe(data['c110'])) c.drawString(column1, lineas[11], escribe(data['c111'])) c.drawString(column1, lineas[12], escribe(data['c112'])) c.drawString(column2, lineas[0], escribe(data['c200'])) c.drawString(column2, lineas[1], escribe(data['c201'])) c.drawString(column2, lineas[2], escribe(data['c202'])) c.drawString(column2, lineas[3], escribe(data['c203'])) c.drawString(column2, lineas[4], escribe(data['c204'])) c.drawString(column2, lineas[5], escribe(data['c205'])) c.drawString(column2, lineas[6], escribe(data['c206'])) c.drawString(column2, lineas[7], escribe(data['c207'])) c.drawString(column2, lineas[8], escribe(data['c208'])) c.drawString(column2, lineas[9], escribe(data['c209'])) c.drawString(column2, lineas[10], escribe(data['c210'])) c.drawString(column2, lineas[11], escribe(data['c211'])) c.drawString(column2, lineas[12], escribe(data['c212'])) c.drawImage(data['logo'], logo[0], logo[1], 2.5 * cm, 2.5 * cm) if mostrar_marcado and not rollo['defectuoso']: c.drawImage(logo_marcado, marcado[0] - ((0.30*cm + c.stringWidth(data['marcado']) ) / 2), marcado[1], width = 0.35 * cm, height = 6) c.setFont("Helvetica-Bold", 8) c.drawCentredString(marcado[0] + ((0.35*cm) / 2), marcado[1], escribe(data["marcado"])) #c.setPageRotation(-90) #c.rotate(-90) c.showPage() c.save() return nomarchivo