def add_controls(self): """ Añade los widgets de componen la ventana. A saber: 1 botón de cancelar. 1 botón de iniciar/cerrar que se pondrá insensitivo una vez se pulse y se activará con el texto "Cerrar" cuando acaben todas las tareas. 1 barra de progreso global. 1 VBox que contiene: 1 HBox por cada tarea que contiene: 1 Una flecha que se activa cuando la tarea se inicia y se desactiva después de completarse. 1 CheckBox que se pone a True cuando la tarea finaliza, a False si no se completa y en Z si no se ha iniciado aún. 1 Label con la descripción de la tarea. ... y sal al gusto. """ botonera = gtk.HBox(homogeneous = True) self.cancel = gtk.Button("Cancelar") self.cancel.connect("clicked", self.cancelar) botonera.pack_start(self.cancel, False) self.startstop = gtk.Button("Iniciar") self.startstop.connect("clicked", self.iniciar_o_cerrar) botonera.pack_start(self.startstop, False) self.lista = gtk.VBox() self.widgets_tareas = [] # Lista de tuplas con flecha y checkbox. for tarea in self.tareas: if len(tarea['nombre']) > 140: tarea['nombre'] = utils.wrap(tarea['nombre'], 140) self.widgets_tareas.append((gtk.Arrow(gtk.ARROW_RIGHT, gtk.SHADOW_NONE), gtk.CheckButton(tarea['nombre'], False), gtk.CheckButton())) tarea['widgets'] = self.widgets_tareas[-1] vbox = gtk.HBox() vbox.pack_start(tarea['widgets'][0], False) vbox.pack_start(tarea['widgets'][1]) vbox.pack_start(tarea['widgets'][2], False) tarea['widgets'][0].set_sensitive(False) tarea['widgets'][1].set_inconsistent(True) tarea['widgets'][1].set_property("can-focus", False) tarea['widgets'][1].connect("clicked", lambda w: w.set_active(w.get_active())) tarea['widgets'][2].set_active(True) self.lista.pack_start(vbox) vbox_out = gtk.VBox() vbox_out.pack_start(self.lista, padding = 10) self.progreso = gtk.ProgressBar() vbox_out.pack_start(self.progreso, False, padding = 10) vbox_out.pack_start(botonera, False, padding = 10) self.barra_estado = gtk.Statusbar() label_statusbar = self.barra_estado.get_children()[0].child font = pango.FontDescription("Monospace oblique 7") label_statusbar.modify_font(font) label_statusbar.modify_fg(gtk.STATE_NORMAL, label_statusbar.get_colormap().alloc_color("darkgray")) vbox_out.pack_end(self.barra_estado, False) self.window.add(vbox_out) self.window.show_all()
def rellenar_tabla_por_proveedor(self, resultados): """ Rellena el model con los items de la consulta """ model = self.wids['tv_datos'].get_model() model.clear() totfact = totsiniva = totbeneficio = totbeneficio_cobro = 0.0 self.wids['tv_datos'].freeze_child_notify() self.wids['tv_datos'].set_model(None) totcobrado = totpendiente = 0.0 total_costo = total_costo_cobrado = 0.0 padres = {} for material in resultados: for fecha in resultados[material]: for ldv in resultados[material][fecha]: # Para que coincidan los totales con la suma de las # columnas y por coherencia con todas las cifras de la # ventana, es necesario redondear a 2 decimales. subtotal = round(ldv.get_subtotal(iva = True), 2) subtotal_siva = round(ldv.get_subtotal(iva = False), 2) beneficio = round(ldv.calcular_beneficio(), 2) costo = round(ldv.calcular_precio_costo()*ldv.cantidad, 2) if ldv.facturaVenta: fac_alb_tic = ldv.facturaVenta.numfactura cobradofra = ldv.facturaVenta.calcular_cobrado() pendientefra = ldv.facturaVenta.calcular_pendiente_cobro() try: fraccion = cobradofra / (cobradofra + pendientefra) except ZeroDivisionError: fraccion = 1.0 cobrado = subtotal * fraccion pendiente = subtotal - cobrado beneficio_cobro = beneficio * fraccion costo_cobrado = costo * fraccion elif ldv.albaranSalida: fac_alb_tic = ldv.albaranSalida.numalbaran cobrado = 0.0 pendiente = subtotal beneficio_cobro = 0.0 costo_cobrado = 0.0 elif ldv.ticket: fac_alb_tic = "Ticket %d" % ldv.ticket.numticket cobrado = subtotal pendiente = 0.0 beneficio_cobro = beneficio costo_cobrado = costo # Los tickets se asume que se cobran siempre, por # tanto el costo de los productos sobre lo cobrado # es del 100%. else: fac_alb_tic = "" cobrado = pendiente = beneficio_cobro = 0.0 costo_cobrado = 0.0 desc_producto = utils.wrap(ldv.producto.descripcion, 40) try: beneficio_costo = 100.0 * beneficio / costo except ZeroDivisionError: beneficio_costo = 0.0 proveedor = ldv.get_proveedor() try: padre = padres[proveedor] except KeyError: padre = padres[proveedor] = model.append(None, (proveedor and proveedor.nombre or "Sin proveedor", "-", utils.float2str(0.0), utils.float2str(0.0), utils.float2str(0.0), proveedor and proveedor.get_puid() or "" )) model.append(padre, (desc_producto, fac_alb_tic, utils.float2str(subtotal), utils.float2str(subtotal_siva), "%s (%s%%)" % ( utils.float2str(beneficio), utils.float2str( beneficio_costo)), ldv.get_puid() )) # Actualizo totales en memoria y en nodos padre TreeView totfact += subtotal totsiniva += subtotal_siva totbeneficio += beneficio totbeneficio_cobro += beneficio_cobro totcobrado += cobrado totpendiente += pendiente total_costo += costo total_costo_cobrado += costo_cobrado model[padre][2] = utils.float2str( utils._float(model[padre][2]) + subtotal) model[padre][3] = utils.float2str( utils._float(model[padre][3]) + subtotal_siva) model[padre][4] = utils.float2str( utils._float(model[padre][4]) + beneficio) self.rellenar_totales(totfact, totsiniva, totbeneficio, totcobrado, totpendiente, totbeneficio_cobro, total_costo, total_costo_cobrado) self.wids['tv_datos'].set_model(model) self.wids['tv_datos'].thaw_child_notify()
def rellenar_tabla_por_ticket(self, resultados): """ Rellena el model con los items de la consulta """ model = self.wids['tv_datos'].get_model() model.clear() totfact = totsiniva = totbeneficio = totbeneficio_cobro = 0.0 self.wids['tv_datos'].freeze_child_notify() self.wids['tv_datos'].set_model(None) totcobrado = totpendiente = 0.0 total_costo = total_costo_cobrado = 0.0 tratados = {} for material in resultados: for fecha in resultados[material]: if fecha: str_fecha = utils.str_fecha(fecha) else: str_fecha = "" for ldv in resultados[material][fecha]: # Para que coincidan los totales con la suma de las # columnas y por coherencia con todas las cifras de la # ventana, es necesario redondear a 2 decimales. subtotal = round(ldv.get_subtotal(iva = True), 2) subtotal_siva = round(ldv.get_subtotal(iva = False), 2) beneficio = round(ldv.calcular_beneficio(), 2) costo = round(ldv.calcular_precio_costo()*ldv.cantidad, 2) fac_alb_tic = "Ticket %d" % ldv.ticket.numticket cobrado = subtotal pendiente = 0.0 beneficio_cobro = beneficio costo_cobrado = costo # Los tickets se asume que se cobran siempre, por # tanto el costo de los productos sobre lo cobrado # es del 100%. desc_producto = utils.wrap(ldv.producto.descripcion, 40) try: beneficio_costo = 100.0 * beneficio / costo except ZeroDivisionError: beneficio_costo = 0.0 if ldv.ticket not in tratados: padre_ticket = model.append(None, (str_fecha, ldv.ticket.numticket, "0", "0", "0", "")) tratados[ldv.ticket] = padre_ticket else: padre_ticket = tratados[ldv.ticket] model.append(padre_ticket, (desc_producto, fac_alb_tic, utils.float2str(subtotal), utils.float2str(subtotal_siva), "%s (%s%%)" % ( utils.float2str(beneficio), utils.float2str( beneficio_costo)), "LDV:%d" % ldv.id)) # Actualizo totales en memoria y en nodos padre TreeView totfact += subtotal totsiniva += subtotal_siva totbeneficio += beneficio totbeneficio_cobro += beneficio_cobro totcobrado += cobrado totpendiente += pendiente total_costo += costo total_costo_cobrado += costo_cobrado model[padre_ticket][2] = utils.float2str( utils._float(model[padre_ticket][2]) + subtotal) model[padre_ticket][3] = utils.float2str( utils._float(model[padre_ticket][3]) + subtotal_siva) model[padre_ticket][4] = utils.float2str( utils._float(model[padre_ticket][4]) + beneficio) self.rellenar_totales(totfact, totsiniva, totbeneficio, totcobrado, totpendiente, totbeneficio_cobro, total_costo, total_costo_cobrado) self.wids['tv_datos'].set_model(model) self.wids['tv_datos'].thaw_child_notify()
def rellenar_tabla_por_oferta(self, vpro): """ Rellena el model de la lista de ofertas. Recibe la ventana de progreso. """ model = self.wids['tv_datos'].get_model() model.clear() tot = len(self.por_oferta.keys()) i = 0.0 try: vpro.set_valor(i/tot, "Mostrando listado de ofertas...") except ZeroDivisionError: return # No hay ofertas que mostrar. presupuestos = self.por_oferta.keys() presupuestos.sort(key = lambda p: p.id, reverse = True) for p in presupuestos: vpro.set_valor(i/tot, "Mostrando listado de ofertas... (%d)" % p.id) presupuesto = self.por_oferta[p] # Él mismo en la práctica. nombreobra = (presupuesto.obra and presupuesto.obra.nombre or presupuesto.nombreobra) #if len(nombreobra) > 33: # nombreobra = nombreobra[:33] + "..." if len(nombreobra) > 80: nombreobra = utils.wrap(nombreobra, 80) nombre_comercial = (presupuesto.comercial and presupuesto.comercial.get_nombre_completo() or "Sin comercial relacionado") estado = presupuesto.get_str_estado().replace("\n", " ") if presupuesto.validado: estado += " (%s)" % presupuesto.get_str_validacion() total_presupuesto = presupuesto.calcular_importe_total() for ldp in presupuesto.lineasDePresupuesto: if ldp.productoVenta: #unidad = " " + ldp.productoVenta.unidad nombre_producto = ldp.productoVenta.descripcion try: precio_kilo = utils.float2str(ldp.precioKilo) except ValueError: # No tiene precio_kilo = "" else: #unidad = "" nombre_producto = ldp.descripcion precio_kilo = "" cantidad = utils.float2str(ldp.cantidad) #+ unidad Me jode poder operar si exporto a hoja de cálculo precio_unitario = utils.float2str(ldp.precio) fila = ("%d (%s € IVA incl.)" % (presupuesto.id, utils.float2str(total_presupuesto)), utils.str_fecha(presupuesto.fecha), presupuesto.cliente and presupuesto.cliente.nombre or presupuesto.nombrecliente, nombre_producto, cantidad, precio_unitario, precio_kilo, nombreobra, nombre_comercial, utils.float2str(ldp.get_subtotal()), presupuesto.puid) model.append(fila) i += 1 # Y ahora la gráfica. if self.wids['notebook1'].get_current_page() == 0: self.graficar_por_oferta()
def rellenar_tabla(self, resultados): """ Rellena el model con los items de la consulta """ model = self.wids['tv_datos'].get_model() model.clear() totfact = totsiniva = totbeneficio = totbeneficio_cobro = 0.0 self.wids['tv_datos'].freeze_child_notify() self.wids['tv_datos'].set_model(None) totcobrado = totpendiente = 0.0 total_costo = total_costo_cobrado = 0.0 for material in resultados: if material != None: nombre_mat = material.descripcion else: nombre_mat = "" padre_mat = model.append(None, (nombre_mat, "", "0", "0", "0", "M:%d" % (material and material.id or -1))) for fecha in resultados[material]: if fecha: str_fecha = utils.str_fecha(fecha) else: str_fecha = "" padre_fec = model.append(padre_mat, (str_fecha, "", "0", "0", "0", "")) for ldv in resultados[material][fecha]: subtotal = ldv.get_subtotal(iva = True) subtotal_siva = ldv.get_subtotal(iva = False) beneficio = ldv.calcular_beneficio() costo = ldv.calcular_precio_costo() * ldv.cantidad if ldv.facturaVenta: fac_alb_tic = ldv.facturaVenta.numfactura cobradofra = ldv.facturaVenta.calcular_cobrado() pendientefra = ldv.facturaVenta.calcular_pendiente_cobro() try: fraccion = cobradofra / (cobradofra + pendientefra) except ZeroDivisionError: fraccion = 1.0 cobrado = subtotal * fraccion pendiente = subtotal - cobrado beneficio_cobro = beneficio * fraccion costo_cobrado = costo * fraccion elif ldv.albaranSalida: fac_alb_tic = ldv.albaranSalida.numalbaran cobrado = 0.0 pendiente = subtotal beneficio_cobro = 0.0 costo_cobrado = 0.0 elif ldv.ticket: fac_alb_tic = "Ticket %d" % ldv.ticket.numticket cobrado = subtotal pendiente = 0.0 beneficio_cobro = beneficio costo_cobrado = costo # Los tickets se asume que se cobran siempre, por # tanto el costo de los productos sobre lo cobrado # es del 100%. else: fac_alb_tic = "" cobrado = pendiente = beneficio_cobro = 0.0 costo_cobrado = 0.0 desc_producto = utils.wrap(ldv.producto.descripcion, 40) try: beneficio_costo = 100.0 * beneficio / costo except ZeroDivisionError: beneficio_costo = 0.0 model.append(padre_fec, (desc_producto, fac_alb_tic, utils.float2str(subtotal), utils.float2str(subtotal_siva), "%s (%s%%)" % ( utils.float2str(beneficio), utils.float2str( beneficio_costo)), "LDV:%d" % ldv.id)) # Actualizo totales en memoria y en nodos padre TreeView totfact += subtotal totsiniva += subtotal_siva totbeneficio += beneficio totbeneficio_cobro += beneficio_cobro totcobrado += cobrado totpendiente += pendiente total_costo += costo total_costo_cobrado += costo_cobrado model[padre_fec][2] = utils.float2str( utils._float(model[padre_fec][2]) + subtotal) model[padre_fec][3] = utils.float2str( utils._float(model[padre_fec][3]) + subtotal_siva) model[padre_fec][4] = utils.float2str( utils._float(model[padre_fec][4]) + beneficio) model[padre_mat][2] = utils.float2str( utils._float(model[padre_mat][2]) + subtotal) model[padre_mat][3] = utils.float2str( utils._float(model[padre_mat][3]) + subtotal_siva) model[padre_mat][4] = utils.float2str( utils._float(model[padre_mat][4]) + beneficio) self.rellenar_totales(totfact, totsiniva, totbeneficio, totcobrado, totpendiente, totbeneficio_cobro, total_costo, total_costo_cobrado) self.wids['tv_datos'].set_model(model) self.wids['tv_datos'].thaw_child_notify()