Exemplo n.º 1
0
 def rellenar_widgets(self):
     """
     Introduce la información de la cuenta actual
     en los widgets.
     No se chequea que sea != None, así que
     hay que tener cuidado de no llamar a 
     esta función en ese caso.
     """
     adaptadores = self.adaptador.get_adaptadores()
     for col in adaptadores.keys():
         if col.name == "comision":
             # UGLY AND DIRTY HACK: Es para no tocar la clase Adapter. Aquí la comisión es en ninerito, no en porcentaje.
             self.wids['e_comision'].set_text(utils.float2str(self.objeto.comision, autodec = True, precision = 2))
         else:
             adaptadores[col]['mostrar'](self.objeto)
     self.rellenar_tabla_origenes()
     subtotal = self.rellenar_tabla_ldvs()
     self.objeto.make_swap()
     self.wids['ventana'].set_title(self.objeto.get_info())
     numsalbs = utils.unificar([ldv.albaranSalida.numalbaran for ldv in 
                                self.objeto.lineasDeVenta])
     numsalbs = ", ".join(numsalbs)
     self.wids['e_peds_albs'].set_text(numsalbs)
     self.rellenar_totales(subtotal)
     self.rellenar_vencimientos()
Exemplo n.º 2
0
def buscar_contadores(anno):
    """
    Devuelve todos los contadores que hayan facturado algo en el año recibido.
    """
    FV = pclases.FacturaVenta
    fras = FV.select(pclases.AND(
        FV.q.fecha >= mx.DateTime.DateTimeFrom(anno, 1, 1), 
        FV.q.fecha <= mx.DateTime.DateTimeFrom(anno, 12, 31)))
    conts = utils.unificar([fra.get_contador() for fra in fras])
    return conts
Exemplo n.º 3
0
 def get_plazo_pagado(self):
     """
     Devuelve el número de días transcurrido entre la fecha de la factura
     y el día en que se hizo realmente el pago (o se hará, si es un
     vencimiento futuro).
     Si el pago no se ha hecho, devuelve None
     """
     plazos = utils.unificar([c.calc_plazo_pago_real()
                              for c in self.cobros])
     # Devuelvo el mayor de los plazos porque esta función va a servir
     # para medir la desviación respecto a la forma de pago original y
     # queremos saber el peor de los casos.
     try:
         plazo = max(plazos)
     except ValueError:
         plazo = None
     return plazo
Exemplo n.º 4
0
 def guardar(self, widget):
     """
     Guarda el contenido de los entry y demás widgets de entrada
     de datos en el objeto y lo sincroniza con la BD.
     """
     albaran = self.objeto
         # Campos del objeto que hay que guardar:
     numalbaran = self.wids['e_numalbaran'].get_text()
     fecha = self.wids['e_fecha'].get_text()
     # Desactivo el notificador momentáneamente
     albaran.notificador.set_func(lambda: None)
     # Actualizo los datos del objeto
     albaran.numalbaran = numalbaran
     proveedor_id = utils.combo_get_value(self.wids['cmbe_proveedor'])
     try:
         proveedor = pclases.Proveedor.get(proveedor_id)
     except:
         proveedor = None
     error_proveedor = False
     proveedores_de_pedidos = utils.unificar(
         [p.proveedor for p in albaran.get_pedidos()])
     if proveedores_de_pedidos and proveedor not in proveedores_de_pedidos:
         # Si el proveedor es diferente al del pedido, no dejo guardarlo.
         proveedor = albaran.proveedor
         error_proveedor = True
     albaran.proveedor = proveedor
     albaran.almacen = utils.combo_get_value(self.wids['cbe_almacenID'])
     try:
         albaran.fecha = utils.parse_fecha(fecha)
     except:
         albaran.fecha = mx.DateTime.localtime()
         utils.dialogo_info(titulo = "ERROR GUARDANDO FECHA",
                            texto = "La fecha %s no es correcta." % (fecha),
                            padre = self.wids['ventana'])
     # Fuerzo la actualización de la BD y no espero a que SQLObject lo
     # haga por mí:
     albaran.syncUpdate()
     # Vuelvo a activar el notificador
     albaran.notificador.set_func(self.aviso_actualizacion)
     self.actualizar_ventana()
     self.wids['b_guardar'].set_sensitive(False)
     if error_proveedor:
         utils.dialogo_info(titulo = "PROVEEDOR NO GUARDADO",
             texto = "El proveedor no se guardó porque no coincide con\n"\
                     "el del pedido del que procede.",
             padre = self.wids['ventana'])
Exemplo n.º 5
0
 def actualizar_grafica(self):
     data = OrderedDict()
     #productos = self.servido_por_producto.keys()[:]
     #productos.sort()
     # Voy a sacar la lista de productos del TV para seguir el mismo orden
     puidsproductos = utils.unificar([fila[-1].split(";")[1] 
                         for fila in self.wids['tv_datos'].get_model()])
     # Es que he "empaquetado" los PUID de pedido y producto combinados.
     productos = [pclases.getObjetoPUID(puidp) for puidp in puidsproductos]
     for p in productos:
         data[p.descripcion] = self.servido_por_producto[p]
     padre = self.wids['grafica'].parent
     padre.remove(self.wids['grafica'])
     try:
         self.wids['grafica'] = gtkcairoplot.GtkCairoPlot(
                 gtkcairoplot.HORIZONTAL, data, self.wids['ventana'])
     except ValueError:
         # Menos de 2 series de datos. No dibujo nada.
         self.wids['grafica'] = gtk.DrawingArea()
     else:
         self.wids['grafica'].show_all()
     finally:
         padre.pack_start(self.wids['grafica'])
Exemplo n.º 6
0
 def __init__(self, objeto = None, usuario = None):
     """
     Constructor. objeto puede ser un objeto de pclases con el que
     comenzar la ventana (en lugar del primero de la tabla, que es
     el que se muestra por defecto).
     """
     self.usuario = usuario
     global fin
     Ventana.__init__(self, 'consulta_vencimientos_pago.glade', objeto,
                      usuario = usuario)
     connections = {'b_salir/clicked': self.salir,
                    'b_buscar/clicked': self.buscar,
                    'b_imprimir/clicked': self.imprimir,
                    'b_fecha_inicio/clicked': self.set_inicio,
                    'b_fecha_fin/clicked': self.set_fin, 
                    'b_csv/clicked': self.exportar, 
                    'ch_formapago/toggled': 
                         lambda ch: self.wids['cb_formapago'].set_sensitive(
                             ch.get_active()), 
                    }
     self.wids['cb_formapago'].set_sensitive(
             self.wids['ch_formapago'].get_active())
     formaspago = [p.documentodepago.strip().split(" ")[0] 
                   for p in pclases.Proveedor.select()]
     formaspago = filtrar_tildes_lista(formaspago)
     formaspago = [e.lower() for e in formaspago]
     formaspago = utils.unificar(formaspago)
     formaspago.sort()
     self.formaspago = zip(range(len(formaspago)), formaspago)
     utils.rellenar_lista(self.wids['cb_formapago'], self.formaspago)
     self.add_connections(connections)
     utils.rellenar_lista(self.wids['cmbe_proveedor'],
             [(c.id, c.nombre) 
                 for c in pclases.Proveedor.select(orderBy='nombre')])
     cols = (('Factura','gobject.TYPE_STRING', False, True, False, None),
             ('Visto bueno','gobject.TYPE_STRING', False, True, False, None),
             ('Fecha vto.','gobject.TYPE_STRING', False, True, False, None),
             ('Importe','gobject.TYPE_STRING', False, False, False, None),
             ('Pendiente','gobject.TYPE_STRING', False, False, False, None),
             ('Fecha fra.','gobject.TYPE_STRING', False, True, False, None),
             ('Observaciones/Forma de pago','gobject.TYPE_STRING',
                 False, True, False, None),
             ('Proveedor', 'gobject.TYPE_STRING', False, True, True, None),
             ('Doc. de pago del proveedor', 'gobject.TYPE_STRING', 
                 False, True, True, None),
             ('id','gobject.TYPE_STRING',False,False,False,None))
     utils.preparar_listview(self.wids['tv_datos'], cols)
     self.wids['tv_datos'].get_selection().set_mode(gtk.SELECTION_MULTIPLE)
     self.wids['tv_datos'].connect("row-activated", self.abrir_factura)
     self.colorear(self.wids['tv_datos'])
     col = self.wids['tv_datos'].get_column(3)
     for cell in col.get_cell_renderers():
         cell.set_property("xalign", 1)
     col = self.wids['tv_datos'].get_column(4)
     for cell in col.get_cell_renderers():
         cell.set_property("xalign", 1)
     self.wids['tv_datos'].connect('button_release_event',
                                   self.button_clicked) 
     cols = (('Año y mes','gobject.TYPE_STRING', False,True, True, None),
             ('Total','gobject.TYPE_STRING', False, True, False, None),
             ('nada','gobject.TYPE_STRING', False, False, False, None))
     utils.preparar_treeview(self.wids['tv_totales'], cols)
     col = self.wids['tv_totales'].get_column(1)
     for cell in col.get_cell_renderers():
         cell.set_property("xalign", 1)
     temp = time.localtime()
     self.fin = mx.DateTime.DateTimeFrom(day = temp[2], 
                                         month = temp[1], 
                                         year = temp[0])
     self.wids['e_fechafin'].set_text(utils.str_fecha(temp))
     gtk.main()
Exemplo n.º 7
0
 def buscar(self,boton):
     """
     Lista los productos bajo mínimos
     """
     self.resultado = []
     if self.wids['r_compra'].get_active():
         proveedorid = utils.combo_get_value(self.wids['cbe_proveedor'])
         if proveedorid == 0 or proveedorid is None:
             proveedor = None
         else:
             proveedor = pclases.Proveedor.get(proveedorid)
         self.wids['b_crear_pedido'].set_sensitive(True)
         if not proveedor:
             self.resultado = pclases.ProductoCompra.select(
                 pclases.AND(
                     pclases.ProductoCompra.q.existencias 
                         < pclases.ProductoCompra.q.minimo, 
                     pclases.ProductoCompra.q.controlExistencias == True, 
                     pclases.ProductoCompra.q.obsoleto == False), 
                     orderBy = 'descripcion')
         else:
             PC = pclases.ProductoCompra
             PDC = pclases.PedidoCompra
             LDPDC = pclases.LineaDePedidoDeCompra
             ADE = pclases.AlbaranEntrada
             FDC = pclases.FacturaCompra
             LDC = pclases.LineaDeCompra
             tiene_pedidos_del_proveedor = pclases.AND(
                 PC.q.id == LDPDC.q.productoCompraID, 
                 LDPDC.q.pedidoCompraID == PDC.q.id, 
                 PDC.q.proveedorID == proveedor.id)
             tiene_albaranes_del_proveedor = pclases.AND(
                 PC.q.id == LDC.q.productoCompraID, 
                 LDC.q.albaranEntradaID == ADE.q.id, 
                 ADE.q.proveedorID == proveedor.id)
             tiene_facturas_del_proveedor = pclases.AND(
                 PC.q.id == LDC.q.productoCompraID, 
                 LDC.q.facturaCompraID == FDC.q.id, 
                 FDC.q.proveedorID == proveedor.id)
             self.resultado0 = PC.select(pclases.AND(
                 PC.q.existencias < PC.q.minimo, 
                 PC.q.controlExistencias == True, 
                 PC.q.obsoleto == False, 
                 tiene_pedidos_del_proveedor, 
                 ))
             self.resultado1 = PC.select(pclases.AND(
                 PC.q.existencias < PC.q.minimo, 
                 PC.q.controlExistencias == True, 
                 PC.q.obsoleto == False, 
                 tiene_albaranes_del_proveedor, 
                 ))
             self.resultado2 = PC.select(pclases.AND(
                 PC.q.existencias < PC.q.minimo, 
                 PC.q.controlExistencias == True, 
                 PC.q.obsoleto == False, 
                 tiene_facturas_del_proveedor
                 ))
             self.resultado = list(self.resultado0)
             self.resultado += [r for r in self.resultado1 
                                if r not in self.resultado]
             self.resultado += [r for r in self.resultado2 
                                if r not in self.resultado]
             self.resultado = utils.unificar(self.resultado)
         self.rellenar_tabla(self.resultado, False)
     else:
         self.wids['b_crear_pedido'].set_sensitive(False)
         # NOTA: Se cuenta el mínimo como UNIDADES (bala completa o 
         #       rollo completo), no en kilos ni m².
         productos = pclases.ProductoVenta.select("""
             producto_venta.minimo > (
                 SELECT COUNT(*) 
                 FROM articulo 
                 WHERE articulo.producto_venta_id = producto_venta.id 
                       AND articulo.albaran_salida_id = NULL)""")
         for p in productos:
             articulos_en_almacen = pclases.Articulo.select(
                 pclases.AND(pclases.Articulo.q.productoVentaID == p.id,
                             pclases.Articulo.q.albaranSalidaID == None))
             self.resultado.append((p, articulos_en_almacen.count()))
         self.rellenar_tabla(self.resultado,True)
Exemplo n.º 8
0
    def __init__(self, objeto=None, usuario=None):
        """
        Constructor. objeto puede ser un objeto de pclases con el que
        comenzar la ventana (en lugar del primero de la tabla, que es
        el que se muestra por defecto).
        """
        self.usuario = usuario
        global fin
        Ventana.__init__(self, "consulta_pagos_realizados.glade", objeto, usuario=usuario)
        connections = {
            "b_salir/clicked": self.salir,
            "b_buscar/clicked": self.buscar,
            "b_imprimir/clicked": self.imprimir,
            "b_fecha_inicio/clicked": self.set_inicio,
            "b_fecha_fin/clicked": self.set_fin,
            "b_csv/clicked": self.exportar,
            "ch_formapago/toggled": lambda ch: self.wids["cb_formapago"].set_sensitive(ch.get_active()),
        }
        self.wids["cb_formapago"].set_sensitive(self.wids["ch_formapago"].get_active())
        formaspago = [p.documentodepago.strip().split(" ")[0] for p in pclases.Proveedor.select()]
        formaspago = filtrar_tildes_lista(formaspago)
        formaspago = [e.lower() for e in formaspago]
        formaspago = utils.unificar(formaspago)
        formaspago.sort()
        self.formaspago = zip(range(len(formaspago)), formaspago)
        utils.rellenar_lista(self.wids["cb_formapago"], self.formaspago)
        self.add_connections(connections)
        utils.rellenar_lista(
            self.wids["cmbe_proveedor"], [(c.id, c.nombre) for c in pclases.Proveedor.select(orderBy="nombre")]
        )

        cols = (
            ("Factura", "gobject.TYPE_STRING", False, True, False, None),
            ("Fecha fra.", "gobject.TYPE_STRING", False, True, False, None),
            ("Importe", "gobject.TYPE_STRING", False, False, False, None),
            ("Proveedor", "gobject.TYPE_STRING", False, True, True, None),
            ("Observaciones/Forma de pago", "gobject.TYPE_STRING", False, True, False, None),
            ("Emisión pago", "gobject.TYPE_STRING", False, True, True, None),
            ("Vencimiento fra.", "gobject.TYPE_STRING", False, True, True, None),
            ("Vencimiento pago", "gobject.TYPE_STRING", False, True, True, None),
            ("id", "gobject.TYPE_STRING", False, False, False, None),
        )
        utils.preparar_listview(self.wids["tv_datos"], cols)
        self.wids["tv_datos"].get_selection().set_mode(gtk.SELECTION_MULTIPLE)
        self.wids["tv_datos"].connect("row-activated", self.abrir_factura)
        col = self.wids["tv_datos"].get_column(2)
        for cell in col.get_cell_renderers():
            cell.set_property("xalign", 1)
        cols = (
            ("Año y mes", "gobject.TYPE_STRING", False, True, True, None),
            ("Total", "gobject.TYPE_STRING", False, True, False, None),
            ("nada", "gobject.TYPE_STRING", False, False, False, None),
        )
        utils.preparar_treeview(self.wids["tv_totales"], cols)
        col = self.wids["tv_totales"].get_column(1)
        for cell in col.get_cell_renderers():
            cell.set_property("xalign", 1)
        temp = time.localtime()
        self.fin = mx.DateTime.DateTimeFrom(day=temp[2], month=temp[1], year=temp[0])
        self.wids["e_fechafin"].set_text(utils.str_fecha(temp))
        self.wids["ventana"].set_title("Consulta de pagos realizados")
        # O migro de una vez a GTK3 o... o no sé. Pero no puedo seguir
        # sin el diseñador de interfaces glade. Es un coñazo hacerlo por
        # código. Aquí van los totales:
        self.crear_tabla_totales()
        self.wids["ch_pendientes"].set_property("visible", False)
        self.colorear(self.wids["tv_datos"])
        gtk.main()