Beispiel #1
0
    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()