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()
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
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
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'])
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'])
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()
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)
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()