def convertir_a_fechahora(valor, vdefecto=mx.DateTime.localtime()): from formularios.utils import parse_fechahora try: return parse_fechahora(valor) except: return vdefecto
def set_fin(self, boton): temp = utils.mostrar_calendario( fecha_defecto=utils.parse_fechahora( self.wids['e_fechafin'].get_text()), padre=self.wids['ventana']) temp = mx.DateTime.DateFrom(day=temp[0], month=temp[1], year=temp[2]) + mx.DateTime.TimeDelta(hours = 6) self.wids['e_fechafin'].set_text(utils.str_fechahora(temp))
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). """ global fin Ventana.__init__(self, 'consulta_consumo.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, 'e_fechainicio/focus-out-event': utils.act_fechahora, 'e_fechafin/focus-out-event': utils.act_fechahora, "b_exportar/clicked": self.exportar} self.add_connections(connections) cols = (('Producto', 'gobject.TYPE_STRING', False, True, False, None), ('Cantidad consumida', 'gobject.TYPE_STRING', False, True, False, None), ('A', 'gobject.TYPE_STRING', False, True, False, None), ('B', 'gobject.TYPE_STRING', False, True, False, None), ('C', 'gobject.TYPE_STRING', False, True, False, None), ('Media diaria', 'gobject.TYPE_STRING', False, True, False, None), ('ID', 'gobject.TYPE_STRING', False, False, False, None)) utils.preparar_treeview(self.wids['tv_datos'], cols) for ncol in range(1, 4): self.wids['tv_datos'].get_column(ncol).get_cell_renderers()[0].set_property("xalign", 1) self.fin = mx.DateTime.today() + mx.DateTime.TimeDelta(hours = 6) self.wids['e_fechafin'].set_text(utils.str_fechahora(self.fin)) self.wids['e_fechainicio'].set_text( utils.str_fechahora(self.fin - (7 * mx.DateTime.oneDay))) self.inicio = utils.parse_fechahora(self.wids['e_fechainicio'].get_text()) # self.wids['ch_fibra'].set_active(True) self.wids['ch_geotextiles'].set_active(True) gtk.main()
def edit_fechahora(cell, path, newtext, tv, numcol, clase, atributo): """ Cambia el texto del model[path][numcol] y del objeto relacionado que saca a partir del ID de la última columna del model. """ model = tv.get_model() ide = model[path][-1] objeto = clase.get(ide) try: fecha = utils.parse_fechahora(newtext) except (ValueError, TypeError): parent = tv.parent while parent != None: parent = parent.parent utils.dialogo_info(titulo = "ERROR EN FECHA Y HORA", texto = "El texto «%s» no es una fecha y hora válida." % (newtext), padre = parent) else: setattr(objeto, atributo, fecha) objeto.syncUpdate() model[path][numcol] = utils.str_fechahora(getattr(objeto, atributo))
def buscar(self, boton): """ Dadas fecha de inicio y de fin, busca los productos y materia prima consumida en los partes de producción. """ try: fechainicio = self.inicio = utils.parse_fechahora( self.wids['e_fechainicio'].get_text()) except ValueError: fechainicio = self.inicio = None try: fechafin = self.fin = utils.parse_fechahora( self.wids['e_fechafin'].get_text()) except ValueError: fechafin = self.fin = mx.DateTime.today() PDP = pclases.ParteDeProduccion if not self.inicio: pdps = PDP.select(PDP.q.fechahorainicio < self.fin, orderBy='fecha') else: pdps = PDP.select(pclases.AND(PDP.q.fechahorainicio >= self.inicio, PDP.q.fechahorainicio < self.fin), orderBy='fecha') try: dias = ((fechafin - fechainicio) + mx.DateTime.oneDay).days except TypeError: # Alguna de las fechas es None. Uso los partes dias = ((pdps[-1].fecha - pdps[0].fecha) + mx.DateTime.oneDay).days vpro = ventana_progreso.VentanaProgreso(padre=self.wids['ventana']) tot = pdps.count() i = 0.0 vpro.mostrar() linea_gtx, linea_fib = self.get_lineas_produccion() # @UnusedVariable cons_balas = {} cons_rollos = {} cons_cemento = {} partidas_contadas = [] balas_contadas = [] for pdp in pdps: vpro.set_valor(i / tot, 'Analizando partes %s...' % ( utils.str_fecha(pdp.fecha))) if (pdp.es_de_balas() and self.wids['ch_fibra'].get_active()): # Añado consumos de material adicional y materia prima (ambos # son ProductoCompra). for c in pdp.consumos: key = "%d:C" % (c.productoCompraID) if key not in cons_balas: cons_balas[key] = [c.productoCompra.descripcion, c.cantidad, 'N/A', 'N/A', 'N/A', c.productoCompra.id, 'C', c.productoCompra.unidad] else: cons_balas[key][1] += c.cantidad elif (pdp.es_de_bolsas() and self.wids['ch_embolsado'].get_active()): # Consume materiales (productos de compra). for c in pdp.consumos: key = "%d:C" % (c.productoCompraID) if key not in cons_cemento: cons_cemento[key] = [c.productoCompra.descripcion, c.cantidad, 'N/A', 'N/A', 'N/A', c.productoCompra.id, 'C', c.productoCompra.unidad] else: cons_cemento[key][1] += c.cantidad # Y también consume fibra en bigbags: for bb in pdp.bigbags: clase_a = bb.articulo.es_clase_a() clase_b = bb.articulo.es_clase_b() clase_c = bb.articulo.es_clase_c() productoVenta = bb.articulo.productoVenta key = "%d:V" % (productoVenta.id) peso_sin = bb.articulo.peso_sin if key not in cons_cemento: cons_cemento[key] = [ bb.articulo.productoVenta.descripcion, peso_sin, clase_a and peso_sin or 0.0, clase_b and peso_sin or 0.0, clase_c and peso_sin or 0.0, bb.articulo.productoVenta.id, 'V', "kg"] else: cons_cemento[key][1] += peso_sin if clase_a: cons_cemento[key][2] += peso_sin elif clase_b: cons_cemento[key][3] += peso_sin elif clase_c: cons_cemento[key][4] += peso_sin elif (pdp.es_de_rollos() and self.wids['ch_geotextiles'].get_active()): # Añado consumos de material adicional (ProductoCompra). for c in pdp.consumos: key = "%d:C" % (c.productoCompraID) if key not in cons_rollos: cons_rollos[key] = [c.productoCompra.descripcion, c.cantidad, 'N/A', 'N/A', 'N/A', c.productoCompra.id, 'C', c.productoCompra.unidad] else: cons_rollos[key][1] += c.cantidad # Y el consumo de materia prima (ProductoVenta). Se hace por # PARTIDAS, ya que los partes comparten materia prima de # fibra si son de la misma partida. if pdp.articulos != []: if pdp.articulos[0].es_rollo(): partida = pdp.articulos[0].rollo.partida elif pdp.articulos[0].es_rollo_defectuoso(): partida = pdp.articulos[0].rolloDefectuoso.partida else: partida = None # Hay que evitar contar la misma partida dos veces. if (partida is not None and partida not in partidas_contadas and partida.entra_en_cota_superior(fechafin)): partidas_contadas.append(partida) for bala in partida.balas: if bala not in balas_contadas: # Dos partidas # pueden compartir partida de carga y por tanto # balas. Evito contar la misma dos veces. balas_contadas.append(bala) productoVenta = bala.articulos[0].productoVenta key = "%d:V" % (productoVenta.id) #peso_neto_bala = bala.pesobala # En realidad es lo mismo. Pero así más claro: peso_neto_bala = bala.articulo.peso_sin clase_a = bala.articulo.es_clase_a() clase_b = bala.articulo.es_clase_b() clase_c = bala.articulo.es_clase_c() if key not in cons_rollos: cons_rollos[key] = [ productoVenta.descripcion, peso_neto_bala, clase_a and peso_neto_bala or 0.0, clase_b and peso_neto_bala or 0.0, clase_c and peso_neto_bala or 0.0, productoVenta.id, 'V', 'kg'] else: cons_rollos[key][1] += peso_neto_bala if clase_a: cons_rollos[key][2] += peso_neto_bala elif clase_b: cons_rollos[key][3] += peso_neto_bala elif clase_c: cons_rollos[key][4] += peso_neto_bala i += 1 self.resultado = [] for k in cons_balas: cantidad = "%s %s" % (utils.float2str(cons_balas[k][1], 3), cons_balas[k][7]) media = "%s %s/día" % (utils.float2str(cons_balas[k][1] / dias), cons_balas[k][7]) try: str_a = utils.float2str(cons_balas[k][2]) str_b = utils.float2str(cons_balas[k][3]) str_c = utils.float2str(cons_balas[k][4]) except ValueError: str_a = str_b = str_c = cons_balas[k][2] # = 4 y a 5 = N/A self.resultado.append([cons_balas[k][0], cantidad, str_a, str_b, str_c, cons_balas[k][5], cons_balas[k][6], cons_balas[k][7], media]) for k in cons_rollos: cantidad = "%s %s" % (utils.float2str(cons_rollos[k][1], 3), cons_rollos[k][7]) media = "%s %s/día" % (utils.float2str(cons_rollos[k][1] / dias), cons_rollos[k][7]) try: str_a = utils.float2str(cons_rollos[k][2]) str_b = utils.float2str(cons_rollos[k][3]) str_c = utils.float2str(cons_rollos[k][4]) except ValueError: str_a = str_b = str_c = cons_rollos[k][3] # = 4 y a 5 = N/A self.resultado.append([cons_rollos[k][0], cantidad, str_a, str_b, str_c, cons_rollos[k][5], cons_rollos[k][6], cons_rollos[k][7], media]) for k in cons_cemento: cantidad = "%s %s" % (utils.float2str(cons_cemento[k][1], 3), cons_cemento[k][7]) media = "%s %s/día" % (utils.float2str(cons_cemento[k][1] / dias), cons_cemento[k][7]) try: str_a = utils.float2str(cons_cemento[k][2]) str_b = utils.float2str(cons_cemento[k][3]) str_c = utils.float2str(cons_cemento[k][4]) except ValueError: str_a = str_b = str_c = cons_cemento[k][3] # = 4 y a 5 = N/A self.resultado.append([cons_cemento[k][0], cantidad, str_a, str_b, str_c, cons_cemento[k][5], cons_cemento[k][6], cons_cemento[k][7], media]) vpro.ocultar() self.rellenar_tabla(self.resultado)