def imprimir(self, boton): """ Prepara la vista preliminar para la impresión del informe. """ pagina_activa = self.wids['notebook'].get_current_page() if pagina_activa == 0: tv = self.wids['tv_por_producto'] titulo = "Existencias por almacén" else: pagina = 0 almacenes = pclases.Almacen.select(pclases.Almacen.q.activo==True, orderBy = "id") for a in almacenes: pagina += 1 if pagina == pagina_activa: tv = self.wids['tv_%d' % a.id] titulo = "Existencias por almacén: %s" % a.nombre from informes.treeview2pdf import treeview2pdf from formularios.reports import abrir_pdf strfecha = "%s - %s" % (utils.str_fecha(mx.DateTime.localtime()), utils.str_hora(mx.DateTime.localtime())) fichpdf = treeview2pdf(tv, titulo = titulo, fecha = strfecha) abrir_pdf(fichpdf)
def setter_textview(objeto, col, w): """ Muestra el valor del atributo "col" del objeto "objeto" en el textview "w". """ valor = getattr(objeto, col.name) if isinstance(col, sqlobject.col.SODateCol): valor = str_fecha(valor) elif isinstance(col, sqlobject.col.SODateTimeCol): valor = str_fechahoralarga(valor) elif isinstance(col, sqlobject.col.SOTimeCol): valor = str_hora(valor) elif isinstance(col, sqlobject.col.SOFloatCol): # XXX # HACK: Workaround. Los valores que son porcentaje (descuentos e IVA) # se deben mostrar con el símbolo "%", pero la única manera de # distinguir esas columnas es mirar el nombre. if col.name in NOMBRES_COLUMNAS_PORCENTAJE: valor = "%s %%" % float2str(valor * 100, precision=5, autodec=True) # XXX else: valor = float2str(valor, autodec=False) # Si autodec=True y es número redondo > 1000 escribe 1.000 y el # getter lo interpreta como flotante. if not isinstance(valor, str): valor = str(valor) buf = w.get_buffer() buf.set_text(valor)
def buscar_rollos(self, boton): """ Busca los rollos de la partida actual a los que se les ha extraído muestra. """ if self.partida != None: rollos = [r for r in self.partida.rollos if r.muestra or "muestra" in r.observaciones.lower()] if rollos == []: utils.dialogo_info(titulo = "NO SE ENCONTRARON ROLLOS", texto = "No se econtraron muestras de rollos en los " "partes implicados.", padre = self.wids['ventana']) else: filas = [(r.id, r.codigo, r.observaciones, "%s %s" % (utils.str_fecha(r.fechahora), utils.str_hora(r.fechahora)) ) for r in rollos] idrollo = utils.dialogo_resultado(filas, titulo = 'ROLLOS CON MUESTRA EN LA PARTIDA %s' % ( self.partida.codigo), cabeceras = ('ID', 'Código', 'Observaciones', 'Fecha y hora de fabricación'), padre = self.wids['ventana']) if idrollo != None and idrollo > 0: rollo = pclases.Rollo.get(idrollo) from formularios import trazabilidad_articulos trazabilidad_articulos.TrazabilidadArticulos( usuario = self.usuario, objeto = rollo)
def agregar_linea(self, model, linea): """ Inserta en el model la línea recibida. """ fecha = utils.str_fecha(linea[0]) hora = utils.str_hora(linea[1]) tipo = linea[2] usuario = linea[3] texto = linea[4] numlinea = linea[5] return model.append((fecha, hora, tipo, usuario, texto, numlinea))
def imprimir_totales(self, boton): """ Exporta a PDF el TreeView de detalle. """ tv = self.wids['tv_datos'] from informes.treeview2pdf import treeview2pdf from formularios.reports import abrir_pdf strfecha = "%s - %s" % (utils.str_fecha(mx.DateTime.localtime()), utils.str_hora(mx.DateTime.localtime())) abrir_pdf(treeview2pdf(tv, titulo = "Valoración de productos de compra en almacén. TOTALES.", fecha = strfecha, apaisado = False))
def edit_hora(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: hora = utils.parse_hora(newtext) except (ValueError, TypeError): parent = tv.parent while parent != None: parent = parent.parent utils.dialogo_info(titulo = "ERROR EN HORA", texto = "El texto «%s» no es una hora válida." % (newtext), padre = parent) else: setattr(objeto, atributo, hora) objeto.syncUpdate() model[path][numcol] = utils.str_hora(getattr(objeto, atributo))
def rellenar_widgets(self): """ Vuelca el contenido del log en el model. """ self.log = self.abrir_log() model = self.wids['tv_datos'].get_model() self.wids['tv_datos'].freeze_child_notify() self.wids['tv_datos'].set_model(None) model.clear() last_iter = None if self.log: try: for linea in self.filtrar_lineas(self.log): last_iter = self.agregar_linea(model, linea) # self.cerrar_log(log) except IOError: # Log cerrado, fichero rotado o lo que sea... import time time.sleep(1) fecha = utils.str_fecha(mx.DateTime.localtime()) hora = utils.str_hora(mx.DateTime.localtime()) tipo = "ERROR" usuario = self.usuario texto = "IOError [errno 22] Al abrir leer el log" numlinea = "" linea = [fecha, hora, tipo, usuario, texto, numlinea] self.agregar_linea(model, linea) self.log = self.abrir_log() # Intento reabrirlo para que # el check_log encuentre más líneas en el nuevo fichero log else: self.mostrar_error(model) self.agregar_eof(model) self.wids['tv_datos'].set_model(model) self.wids['tv_datos'].thaw_child_notify() self.mover_a_ultima_fila(last_iter) tamanno = os.path.getsize(self.fichero_log) return tamanno
def col2value(objeto, col): """ Convierte el valor del objeto a un formato legible en función de su tipo de datos. """ valor = getattr(objeto, col.name) if isinstance(col, pclases.SODateCol): # Es DATE. return utils.str_fecha(valor) elif isinstance(col, pclases.SOStringCol): # TEXT return valor elif isinstance(col, pclases.SOFloatCol): # FLOAT return utils.float2str(valor, autodec = True) elif isinstance(col, pclases.SOIntCol): # INT return valor elif isinstance(col, pclases.SOBoolCol): # BOOLEAN return valor elif isinstance(col, pclases.SOForeignKey): # Clave ajena. return valor # and valor.id or "" elif isinstance(col, pclases.SOCol): # Es TIMESTAMP o TIME if "timestamp" in str(col) or ("fecha" in col.name and "hora" in col.name): return utils.str_fechahora(valor) else: return utils.str_hora(valor)
def rellenar_tabla(self, lista, defectuosos, gtxcs, producto): """ Rellena el model con el listado de rollos correspondiente. OJO: Los rollos defectuosos se listan, pero no se cuentan para los totales. Los rollos de Gtx C van aparte siempre. """ from ventana_progreso import VentanaProgreso vpro = VentanaProgreso(padre = self.wids['ventana']) model = self.wids['tv_rollos'].get_model() model.clear() metros_almacen = 0 rollos_almacen = 0 metros_fabricados = 0 kilosc_fabricados = kilosc = 0.0 rollosc_fabricados = rollosc = 0 i = 0.0 # tot = len(lista) tot = lista.count() + defectuosos.count() + gtxcs.count() vpro.mostrar() # XXX Primer intento de acelerar los treeview self.wids['tv_rollos'].freeze_child_notify() self.wids['tv_rollos'].set_model(None) # XXX for a in defectuosos: metros2 = a.superficie metros_fabricados += metros2 vpro.set_valor(i/tot, 'Añadiendo rollo %s...' % a.codigo) if a.albaranSalida != None and a.albaranSalida.fecha <= self.fin: # FILTRO LOS ALBARANES FUERA DEL RANGO SUPERIOR DE FECHAS PARA # QUE APAREZCAN COMO QUE ESTABAN EN ALMACÉN ANTES DE ESE DÍA. try: info_albaran = self.cache_albaranes[a.albaranSalida] except KeyError: info_albaran = "%s (%s - %s)" % (a.albaranSalida.numalbaran, utils.str_fecha(a.albaranSalida.fecha), a.albaranSalida.get_str_tipo()) self.cache_albaranes[a.albaranSalida] = info_albaran model.append((a.codigo, utils.str_fecha(a.rolloDefectuoso.fechahora), "CLIC PARA VER", a.partida.codigo, info_albaran, utils.float2str(a.get_largo(), autodec = True), a.almacen and a.almacen.nombre or "", a.id)) else: model.append((a.codigo, utils.str_fecha(a.rolloDefectuoso.fechahora), utils.str_fecha(a.rolloDefectuoso.fechahora), a.partida.codigo, '-', utils.float2str(a.get_largo(), autodec = True), a.almacen and a.almacen.nombre or "", a.id)) i += 1 for a in gtxcs: vpro.set_valor(i/tot, 'Añadiendo rollo %s...' % a.codigo) rollosc_fabricados += 1 kilosc_fabricados += a.peso if a.albaranSalida != None and a.albaranSalida.fecha <= self.fin: # FILTRO LOS ALBARANES FUERA DEL RANGO SUPERIOR DE FECHAS PARA # QUE APAREZCAN COMO QUE ESTABAN EN ALMACÉN ANTES DE ESE DÍA. try: info_albaran = self.cache_albaranes[a.albaranSalida] except KeyError: info_albaran = "%s (%s - %s)" % (a.albaranSalida.numalbaran, utils.str_fecha(a.albaranSalida.fecha), a.albaranSalida.get_str_tipo()) self.cache_albaranes[a.albaranSalida] = info_albaran model.append((a.codigo, utils.str_fecha(a.rolloC.fechahora), utils.str_hora(a.rolloC.fechahora), "N/A", info_albaran, "%s kg" % utils.float2str(a.peso), a.almacen and a.almacen.nombre or "", a.id)) # Si tienen albarán hay un caso en que cuentan para almacén: if a.albaranSalida and a.albaranSalida.es_de_movimiento(): kilosc += a.peso rollosc += 1 else: model.append((a.codigo, utils.str_fecha(a.rolloC.fechahora), utils.str_hora(a.rolloC.fechahora), "N/A", '-', "%s kg" % utils.float2str(a.peso), a.almacen and a.almacen.nombre or "", a.id)) kilosc += a.peso rollosc += 1 i += 1 for t in lista: metros2 = t.productoVenta.camposEspecificosRollo.metrosLineales * t.productoVenta.camposEspecificosRollo.ancho metros_fabricados += metros2 vpro.set_valor(i/tot, 'Añadiendo rollo %s...' % t.rollo.codigo) if t.albaranSalida != None and t.albaranSalida.fecha <= self.fin: # FILTRO LOS ALBARANES FUERA DEL RANGO SUPERIOR DE FECHAS PARA # QUE APAREZCAN COMO QUE ESTABAN EN ALMACÉN ANTES DE ESE DÍA. try: info_albaran = self.cache_albaranes[t.albaranSalida] except KeyError: info_albaran = "%s (%s - %s)" % (t.albaranSalida.numalbaran, utils.str_fecha(t.albaranSalida.fecha), t.albaranSalida.get_str_tipo()) self.cache_albaranes[t.albaranSalida] = info_albaran model.append((t.rollo.codigo, utils.str_fecha(t.rollo.fechahora), # ----------------------------------------------------- # t.rollo.articulos[0].parteDeProduccion and utils.str_fecha(t.rollo.articulos[0].parteDeProduccion.fecha) or '', # utils.str_fecha(t.rollo.fechahora), "CLIC PARA VER", # ----------------------------------------------------- t.rollo.partida.codigo, info_albaran, utils.float2str(t.get_largo(), autodec = True), t.almacen and t.almacen.nombre or "", t.id)) # Si tienen albarán hay un caso en que cuentan para almacén: if t.albaranSalida and t.albaranSalida.es_de_movimiento(): metros_almacen += metros2 rollos_almacen += 1 else: model.append((t.rollo.codigo, utils.str_fecha(t.rollo.fechahora), # ----------------------------------------------------- # t.rollo.articulos[0].parteDeProduccion and utils.str_fecha(t.rollo.articulos[0].parteDeProduccion.fecha) or '', utils.str_fecha(t.rollo.fechahora), # ----------------------------------------------------- t.rollo.partida.codigo, '-', utils.float2str(t.get_largo(), autodec = True), t.almacen and t.almacen.nombre or "", t.id)) metros_almacen += metros2 rollos_almacen += 1 i += 1 # XXX Primer intento de acelerar los treeview self.wids['tv_rollos'].set_model(model) self.wids['tv_rollos'].thaw_child_notify() # XXX vpro.ocultar() # self.wids['e_total_almacen'].set_text(str(metros_almacen)+' m²') # self.wids['e_total_fabricado'].set_text(str(metros_fabricados)+' m²') if producto.es_rolloC(): self.wids['e_total_almacen'].set_text('%s kg (%d rollos)' % (utils.float2str(kilosc, 2), rollosc)) self.wids['e_total_fabricado'].set_text('%s kg (%d rollos)' % (utils.float2str(kilosc_fabricados, 2), rollosc_fabricados)) else: self.wids['e_total_almacen'].set_text('%s m² (%d rollos)' % (utils.float2str(metros_almacen, 0), rollos_almacen)) self.wids['e_total_fabricado'].set_text('%s m² (%d rollos)' % (utils.float2str(metros_fabricados, 0), tot))