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)
Exemple #2
0
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)
Exemple #4
0
 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))
Exemple #5
0
 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))
Exemple #6
0
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))
Exemple #7
0
 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
Exemple #8
0
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) 
Exemple #9
0
    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))