Пример #1
0
 def pedir_unidad(self, productoCompra):
     """
     Pide la unidad del descuento y comprueba que sea correcta.
     Recibe el producto de compra para mostrar el valor por defecto.
     """
     txt = """
                                                                             
     Introduzca las unidades para el descuento de materiales.                
                                                                             
     Por ejemplo:                                                            
         %  (porcentaje en las unidades del material                         
                  por peso de producto terminado).                           
         ud / 5 ud   (unidad del material por cada 5 unidades                
                      de producto terminado).                                
         m / kg  (metro de material por kilo de producto).                   
         kg / 5.5 m (kg de material por cada 5.5 metros de producto).        
                                                                             
     NOTA: La unidad del materal que se descuenta debe ser la misma          
           que consta en catálogo, pedidos de compra, etc.                   
                                                                             
     """ 
     defecto = "%s / ud" % (productoCompra.unidad)
     res = utils.dialogo_entrada(titulo = "INTRODUZCA UNIDAD", 
                                 texto = txt, 
                                 padre = self.wids['ventana'], 
                                 valor_por_defecto = defecto)
     if not comprobar_unidad(res):
         utils.dialogo(titulo = "FORMATO INCORRECTO", 
                       texto = "El texto introducido %s no tiene el formato correcto." % (res), 
                       padre = self.wids['ventana'])
         res = None
     return res
Пример #2
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).
        """
        from formularios import reports
        import tempfile

        exportar_a_csv_a = None

        if utils.dialogo(titulo = "FILTRAR EXISTENCIAS NULAS", 
                         texto = "¿Desea filtrar ignorando los productos con"
                                 " existencias a cero?"):
            func_informe = geninformes.repuestos_no_nulos
        else:
            func_informe = geninformes.repuestos
        if utils.dialogo(titulo = "EXPORTAR A CSV", 
                         texto = "A continuación se generará el informe en "
                                 "PDF.\n¿Desa también que se exporte a CSV?", 
                         defecto = "No", 
                         tiempo = 10): 
            exportar_a_csv_a = os.path.join(tempfile.gettempdir(), 
                                            "%s_repuestos" % (
                                    mx.DateTime.localtime().strftime("%Y%m%d")))
        pdfs = func_informe(exportar_a_csv_a = exportar_a_csv_a)
        for pdf in pdfs:
            reports.abrir_pdf(pdf)
Пример #3
0
 def aceptar(self, boton):
     res = None
     model, itr = self.wids['tv_logic'].get_selection().get_selected()
     if itr != None:
         ide = model[itr][-1]
         res = pclases.LogicMovimientos.get(ide)
         self.wids['ventana'].destroy()
     else:
         utils.dialogo(titulo = "¿CERRAR?", 
                       texto = "No ha seleccionado ningún asiento.\n¿Desea cerrar la ventana?",
                       padre = self.wids['ventana'])
     self.objeto = res
     return res
Пример #4
0
 def borrar_albaran(self, boton):
     """
     Elimina el albarán de la BD y revierte las existencias de
     las entradas.
     """
     if utils.dialogo('Se eliminará el albarán actual y todas sus relaciones con ventas, pedidos, etc.\n¿Está seguro?',
                      'BORRAR ALBARÁN',
                      padre = self.wids['ventana']):
         albaran = self.objeto
         if len([ldc for ldc in albaran.lineasDeCompra if ldc.silo != None]) > 0:
             res = utils.dialogo(titulo = "DESCARGAR SILOS",
                                 texto = "¿Anular también las cargas en silo implicados en el albarán?",
                                 cancelar = True,
                                 icono = gtk.STOCK_DIALOG_WARNING,
                                 defecto = False)
         else:
             res = False
         if res != gtk.RESPONSE_CANCEL:
             if res:
                 for ldc in albaran.lineasDeCompra:
                     if ldc.silo != None:
                         cs = ldc.cargaSilo
                         ldc.cargaSilo = None
                         cs.destroy(usuario = self.usuario, ventana = __file__)
             for linea in albaran.lineasDeCompra:
                 producto = linea.productoCompra
                 if linea.productoCompra.controlExistencias:
                     # XXX DEBUG
                     #print linea.productoCompra.existencias
                     # XXX EODEBUG
                     producto.sync()
                     producto.existencias -= linea.cantidad
                     if producto.existencias < 0:
                         producto.existencias = 0
                         # En este caso, si la cantidad absoluta de
                         # existencias es cero, como debería ser un campo
                         # calculado pongo a cero las existencias de todos
                         # los almacenes para ese producto (pues ese
                         # debería ser el origen del cálculo).
                         for sa in producto.stocksAlmacen:
                             sa.existencias = 0
                             sa.syncUpdate()
                     producto.syncUpdate()
                     producto.sync()
                     # XXX DEBUG
                     #print linea.productoCompra.existencias
                     # XXX EODEBUG
             albaran.notificador.set_func(lambda : None)
             albaran.destroy_en_cascada(ventana = __file__)
             self.ir_a_primero()
 def drop_ldv(self, boton):
     """
     Pone a None el idalbaran de la 
     línea de venta seleccionada y 
     a False la confirmación (aumentando
     la cantidad del artículo).
     """
     if (self.wids['tv_ldvs'].get_selection().count_selected_rows() and
        utils.dialogo(titulo = "¿BORRAR LÍNEA?", 
                      texto = "¿Está seguro de borra las líneas seleccion"
                              "adas?\n\nHacerlo cancelará el gasto de rep"
                              "uestos, así como otras operaciones que pud"
                              "ieran estar relacionadas con el mismo.", 
                      padre = self.wids['ventana'])):
         model, paths = self.wids['tv_ldvs'].get_selection().get_selected_rows()
         for path in paths:
             itr = model.get_iter(path)
             if model[itr].parent == None:  # Es una LDV
                 idldv = model[itr][-1]
                 try:
                     ldv = pclases.LineaDeVenta.get(idldv)
                 except pclases.SQLObjectNotFound:   # Ya se ha borrado.
                     pass
                 else:
                     self.desvincular_ldv_del_albaran(ldv)
             self.modificado = True
         self.actualizar_ventana()
Пример #6
0
 def borrar_producto(self, widget):
     """
     Elimina el producto de la tabla pero NO
     intenta eliminar ninguna de sus relaciones,
     de forma que si se incumple alguna 
     restricción de la BD, cancelará la eliminación
     y avisará al usuario.
     """
     producto = self.objeto
     if not utils.dialogo('¿Eliminar el producto?', 'BORRAR', padre = self.wids['ventana']):
         return
     if producto.articulos != [] or producto.precios != []:
         utils.dialogo_info('PRODUCTO NO ELIMINADO', 
                            'El producto está implicado en operaciones que impiden su borrado.', 
                            padre = self.wids['ventana'])
     else:
         producto.notificador.desactivar()
         producto.camposEspecificosEspecial.notificador.desactivar()
         cee = producto.camposEspecificosEspecial
         producto.camposEspecificosEspecial = None
         try:
             producto.destroy(ventana = __file__)
         except:
             producto.camposEspecificosEspecial = cee
             utils.dialogo_info(titulo = "PRODUCTO NO BORRADO", 
                                texto = "El producto no se pudo eliminar",
                                padre = self.wids['ventana'])
             self.actualizar_ventana()
             return
         cee.destroy(ventana = __file__)
         self.objeto = None
         self.ir_a_primero()
Пример #7
0
 def ir_a_anterior(self,widget):
     """
     Hace que el registro anterior (ordenados por ID interno)
     sea el objeto activo
     """
     if self.wids['b_guardar'] != None and self.wids['b_guardar'].get_property('sensitive'):
         # Hay cambios pendientes de guardar.
         if utils.dialogo('Hay cambios pendientes de guardar.\n¿Desea hacerlo ahora?', '¿GUARDAR CAMBIOS?'):
             try:
                 self.guardar(None)
             except:
                 utils.dialogo_info(titulo = 'NO SE PUDO GUARDAR', 
                                    texto = 'Los cambios no se pudieron guardar automáticamente.\nDebe hacerlo de forma manual', 
                                    padre = self.wids['ventana'])
                 return 
     producto = self.objeto
     try:
         anterior = pclases.ProductoVenta.select(pclases.AND(pclases.ProductoVenta.q.camposEspecificosEspecialID != None, pclases.ProductoVenta.q.id < producto.id),orderBy='-id')[0]
     except IndexError:
         utils.dialogo_info(texto = "El elemento seleccionado es el primero registrado en el sistema",
                            titulo="ERROR", 
                            padre = self.wids['ventana'])
         return
     self.objeto = anterior
     self.actualizar_ventana()
Пример #8
0
 def borrar(self, widget):
     """
     Elimina la cuenta de la tabla pero NO
     intenta eliminar ninguna de sus relaciones,
     de forma que si se incumple alguna 
     restricción de la BD, cancelará la eliminación
     y avisará al usuario.
     """
     if not utils.dialogo('¿Eliminar %s?'%self.clase.sqlmeta.table.lower(), 
                          'BORRAR', 
                          padre = self.wids['ventana']):
         return
     self.objeto.notificador.desactivar()
     try:
         for cliente in self.objeto.clientes:
             cliente.tarifa = None
         for precio in self.objeto.precios:
             for concepto in precio.conceptos:
                 concepto.destroySelf()
             precio.destroySelf()
         self.objeto.destroySelf()
         #self.objeto.destroy_en_cascada()
     except Exception, e:
         self.logger.error("tarifas.py::borrar -> %s ID %d no se pudo eliminar. Excepción: %s." % (self.objeto.sqlmeta.table, self.objeto.id, e))
         utils.dialogo_info(titulo = "%s NO BORRADO" % self.clase.sqlmeta.table.upper(), 
                            texto = "%s no se pudo eliminar completamente.\n\nSe generó un informe de error en el «log» de la aplicación." % self.clase.sqlmeta.table.title(),
                            padre = self.wids['ventana'])
         self.actualizar_ventana()
         return
Пример #9
0
 def borrar(self, widget):
     """
     Elimina una visita marcada en el Treeview por el usuario.
     """
     sel = self.wids['tv_visitas'].get_selection()
     model, paths = sel.get_selected_rows()
     if paths and utils.dialogo('¿Eliminar las visitas seleccionadas?', 
                                'BORRAR', 
                                padre = self.wids['ventana']):
         paths_a_borrar = []
         for path in paths:
             visita = pclases.getObjetoPUID(model[path][-1])
             dia = visita.fechahora.day
             if (not visita.enviada
                     or (visita.enviada
                         and self.usuario
                         and self.usuario.nivel <= NIVEL_SUPERVISOR)):
                 visita.destroy(ventana = __file__)
                 paths_a_borrar.append(path)
         #self.actualizar_ventana()
         paths_a_borrar.sort(reverse = True)
         for path in paths_a_borrar:
             model.remove(model.get_iter(path))
         visitas_del_dia = self.refresh_commit_button()
         if visitas_del_dia:
             self.wids['calendario'].mark_day(dia)
         else:
             self.wids['calendario'].unmark_day(dia)
         if len(paths_a_borrar) < len(paths):
             utils.dialogo_info(titulo = "VISITAS NO ELIMINADAS",
                     texto = "Algunas visitas no se eliminaron al"
                         " encontrarse ya enviadas.",
                     padre = self.wids['ventana'])
Пример #10
0
 def borrar(self, widget):
     """
     Elimina la cuenta de la tabla pero NO
     intenta eliminar ninguna de sus relaciones,
     de forma que si se incumple alguna 
     restricción de la BD, cancelará la eliminación
     y avisará al usuario.
     """
     cuenta = self.objeto
     if not utils.dialogo('¿Eliminar la cuenta?', 'BORRAR', padre = self.wids['ventana']):
         return
     if cuenta.pagos != []:
         utils.dialogo_info('CUENTA NO ELIMINADA', 
                            'La cuenta está implicada en operaciones que impiden su borrado.', 
                            padre = self.wids['ventana'])
     else:
         cuenta.notificador.desactivar()
         try:
             cuenta.destroy(ventana = __file__)
         except Exception, e:
             self.logger.error("cuentas_destino::borrar -> Cuenta ID %d no se pudo eliminar. Excepción: %s." % (cuenta.id, e))
             utils.dialogo_info(titulo = "CUENTA NO BORRADA", 
                                texto = "La cuenta no se pudo eliminar.\n\nSe generó un informe de error en el «log» de la aplicación.",
                                padre = self.wids['ventana'])
             self.actualizar_ventana()
             return
         self.objeto = None
         self.ir_a_primero()
Пример #11
0
 def imprimir(self, boton):
     """
     Prepara la vista preliminar para la impresión del informe.
     """
     resp = utils.dialogo(titulo = "¿IMPRIMIR DESGLOSE?", 
                          texto = "Puede imprimir un resumen o todo el "
                                  "contenido de la consulta\n"
                                  "¿Desea imprimir toda la información "
                                  "desglosada?", 
                          padre = self.wids['ventana'])
     if resp:
         tv = self.wids['tv_datos']
         tv.expand_all()
         while gtk.events_pending(): gtk.main_iteration(False)
         colstotales = []
     else:
         tv = self.wids['tv_datos']
         tv.collapse_all()
         while gtk.events_pending(): gtk.main_iteration(False)
         from consulta_ventas_por_producto import convertir_a_listview
         tv = convertir_a_listview(tv)
         colstotales = [2, 3, 4]
     strfecha = "De %s a %s" % (self.wids['e_fechainicio'].get_text(), 
                                self.wids['e_fechafin'].get_text())
     abrir_pdf(treeview2pdf(tv, 
                            titulo = "Beneficio sobre tarifa (tickets)", 
                            fecha = strfecha, 
                            numcols_a_totalizar = colstotales))
 def ir_a_siguiente(self,widget):
     """
     Hace que el siguiente registro (ordenados por ID interno)
     sea el objeto activo
     """
     if self.wids['b_guardar'] != None and self.wids['b_guardar'].get_property('sensitive'):
         # Hay cambios pendientes de guardar.
         if utils.dialogo('Hay cambios pendientes de guardar.\n¿Desea hacerlo ahora?', '¿GUARDAR CAMBIOS?'):
             try:
                 self.guardar(None)
             except:
                 utils.dialogo_info(titulo = 'NO SE PUDO GUARDAR', 
                                    texto = 'Los cambios no se pudieron guardar automáticamente.\nDebe hacerlo de forma manual')
                 return 
     producto = self.objeto
     linea = pclases.LineaDeProduccion.select(pclases.OR(
         pclases.LineaDeProduccion.q.nombre.contains('geocompuesto'), 
         pclases.LineaDeProduccion.q.nombre.contains('comercializado')))[0]
     try:
         siguiente = pclases.ProductoVenta.select(pclases.AND(pclases.ProductoVenta.q.camposEspecificosRolloID != None, pclases.ProductoVenta.q.lineaDeProduccionID == linea.id, pclases.ProductoVenta.q.id > producto.id),orderBy='id')[0]
     except IndexError:
         utils.dialogo_info(texto = "El elemento seleccionado es el último"
                                    " registrado en el sistema",
                            titulo = "ERROR", 
                            padre = self.wids['ventana'])
         return
     self.objeto = siguiente
     self.actualizar_ventana()
Пример #13
0
 def borrar_empleado(self, widget):
     """
     Elimina el empleado de la tabla pero NO
     intenta eliminar ninguna de sus relaciones,
     de forma que si se incumple alguna
     restricción de la BD, cancelará la eliminación
     y avisará al usuario.
     """
     empleado = self.objeto
     if not utils.dialogo('Se borrará el empleado actual.\n¿Está seguro?',
             '¿BORRAR EMPLEADO?',
             padre=self.wids['ventana']):
         return
     if empleado:
         empleado.notificador.set_func(lambda: None)
     try:
         borrado = empleado.destroy(ventana=__file__)
         if not borrado:
             raise Exception("%s no se pudo eliminar" % empleado.puid)
     except:
         empleado.sync()
         empleado.sqlmeta._obsolete = False  # Para evitar el «... has
             # become obsolete». El destroy de SQLObject marca este
             # atributo pero no lo devuelve a False ni el sync ni el propio
             # destroy si falla.
         empleado.notificador.set_func(self.aviso_actualizacion)
         utils.dialogo_info('EMPLEADO NO ELIMINADO',
                         'No se pudo eliminar el empleado.\n'
                         'Considere desmarcarlo como activo en su lugar.',
                         padre=self.wids['ventana'])
     else:
         if not borrado:
             empleado.sync()
         self.ir_a_primero()
Пример #14
0
 def set_factura(self, boton):
     """
     Busca un vencimiento de una factura y lo agrega al recibo actual.
     """
     recibo = self.objeto
     if self.cliente == None:
         idcliente = self.buscar_cliente()
         if idcliente == None:
             return
         self.cliente = pclases.Cliente.get(idcliente)
     cliente = self.cliente
     facturas = self.buscar_factura(cliente)
     if facturas == None:
         return
     if len(facturas) == 0:
         if utils.dialogo(titulo = "¿BUSCAR EN FACTURAS PAGADAS?", 
                          texto = "No se han encontrado facturas pendient"
                                  "es de cobro que satisfagan el criterio"
                                  " de búsqueda.\n¿Desea volver a buscar "
                                  "incluyendo facturas pagadas?", 
                          padre = self.wids['ventana']):
             facturas = self.buscar_factura(cliente, filtrar_pagadas = False)
     for factura in facturas:
         vencimiento = self.buscar_vencimiento(factura)
         if vencimiento == None:
             continue
         recibo.fechaVencimiento = vencimiento.fecha
         recibo.fechaLibramiento = factura.fecha
         observaciones = "Recibo bancario número %d con fecha de emisión %s." % (self.objeto.numrecibo, utils.str_fecha(self.objeto.fechaLibramiento))
         vencimiento.observaciones += observaciones
         vencimiento.recibo = recibo
         self.actualizar_ventana()
Пример #15
0
 def crear_muestra_ok_cancel(self, dialogo, respuesta, lote, partida, loteCem):
     if respuesta == gtk.RESPONSE_ACCEPT:
         codigo = dialogo.vbox.get_children()[2].get_text()
         observaciones = dialogo.vbox.get_children()[4].get_text()
         m = pclases.Muestra(lote = lote,
                             loteCem = loteCem,
                             partida = partida,
                             codigo = codigo,
                             observaciones = observaciones,
                             pendiente = True,
                             envio = mx.DateTime.localtime(),
                             recepcion = None)
         pclases.Auditoria.nuevo(m, self.usuario, __file__)
         if utils.dialogo(titulo = "MUESTRA ENVIADA",
                          texto = "Muestra creada, enviada y pendiente para su análisis en laboratorio.\n¿Desea enviar una alerta?",
                          padre = self.wids['ventana']):
             usuarios = [(u.id, u.usuario) for u in pclases.Usuario.select(orderBy = 'usuario')]
             usuario = utils.dialogo_combo(titulo = "SELECCIONE USUARIO",
                                           texto = "Seleccione del desplegable inferior al usuario que quiere alertar acerda de la muestra.",
                                           ops = usuarios,
                                           padre = self.wids['ventana'])
             if usuario != None:
                 user = pclases.Usuario.get(usuario)
                 if m.codigo:
                     msj = "La muestra %s está " % m.codigo
                 else:
                     msj = "Tiene una muestra "
                 msj += "pendiente de analizar."
                 user.enviar_mensaje(msj)
Пример #16
0
 def sugerir_productos(self, txt):
     """
     Intenta sugerir productos según el corrector Norving.
     """
     from lib import spelling
     palabras = []
     for pc in pclases.ProductoCompra.select():
         palabras.append(pc.codigo.lower())
         palabras.append(pc.descripcion.lower())
     for pc in pclases.ProductoVenta.select():
         palabras.append(pc.codigo.lower())
         palabras.append(pc.descripcion.lower())
     palabras = " ".join(palabras)
     corrector = spelling.SpellCorrector(palabras)
     sugerencia = corrector.correct(txt.lower())
     if sugerencia != txt:
         res = utils.dialogo(titulo = "SUGERENCIA DE BÚSQUEDA", 
                 texto="No se encontró «%s», ¿tal vez quiso decir «%s»?" % (
                         txt, sugerencia), 
                 padre = self.wids['ventana'])
         if res:
             res = ([p for p in utils.buscar_productos_compra(sugerencia)]+ 
                    [p for p in utils.buscar_productos_venta(sugerencia)])
         else:
             res = []
     else:
         raise ValueError, "Sin alternativas que sugerir."
     return res
Пример #17
0
 def borrar(self, boton):
     """
     Borra el registro activo.
     """
     if utils.dialogo(titulo = "¿BORRAR?", texto = "¿Desea eliminar el recibo en pantalla?", padre = self.wids['ventana']):
         try:
             for vto in self.objeto.vencimientosCobro:
                 vto.recibo = None
                 txtrcbo = "Recibo bancario número %d con fecha de emisión %s." % (self.objeto.numrecibo, 
                                                                                       utils.str_fecha(self.objeto.fechaLibramiento))
                 if txtrcbo in vto.observaciones:
                     vto.observaciones = vto.observaciones.replace(txtrcbo, "")
                 else:   # Se ha cambiado la fecha o el número del recibo 
                         # después de haber incluido el vencimiento
                     if "Recibo bancario" in vto.observaciones:
                         vto.observaciones = vto.observaciones[:vto.observaciones.index("Recibo bancario")]
                     else:   # No sé lo que habrá hecho el usuario con las observaciones, reinicio al texto de forma de pago original:
                         try:
                             vto.observaciones = vto.get_factura_o_prefactura().cliente.textoformacobro
                         except AttributeError, msg:  # No tiene factura, o la factura no tiene cliente. Dejo las observaciones que tuviera.
                             txterror = "%srecibos::drop_factura -> El vencimientoCobro ID %d no tiene factura, o su factura no tiene cliente. Mensaje de la excepción: %s" % (self.usuario and self.usuario.usuario + ": " or "", vto.id, msg)
                             self.logger.warning(txterror)
             self.objeto.destroy(ventana = __file__)
         except Exception, msg:
             utils.dialogo_info(titulo = "ERROR", texto = "El registro no se pudo eliminar", padre = self.wids['ventana'])
             self.logger.error("%srecibos::borrar -> No se pudo eliminar el recibo ID %d. Excepcion: %s" % 
                 (self.usuario and self.usuario.usuario + ": " or "", self.objeto and self.objeto.id or 0, msg))
Пример #18
0
 def borrar_producto(self, widget):
     """
     Elimina el producto de la tabla pero NO
     intenta eliminar ninguna de sus relaciones,
     de forma que si se incumple alguna
     restricción de la BD, cancelará la eliminación
     y avisará al usuario.
     """
     producto = self.objeto
     if not utils.dialogo('¿Eliminar el producto?', 'BORRAR'):
         return
     if producto.articulos != [] or producto.precios != []:
         utils.dialogo_info('PRODUCTO NO ELIMINADO', 'El producto está implicado en operaciones que impiden su borrado.', padre = self.wids['ventana'])
     else:
         producto.notificador.desactivar()
         campos = producto.camposEspecificosBala
         try:
             producto.destroy(ventana = __file__)
             campos.destroy(ventana = __file__)
         except:
             utils.dialogo_info(titulo = "NO SE PUEDE ELIMINAR",
                                texto = "El producto no se puede eliminar. Verifique que no\ntiene ventas o producción relacionada.",
                                padre = self.wids['ventana'])
         else:
             self.objeto = None
             self.ir_a_primero()
Пример #19
0
 def borrar(self, widget):
     """
     Elimina el objeto de la tabla pero NO
     intenta eliminar ninguna de sus relaciones,
     de forma que si se incumple alguna 
     restricción de la BD, cancelará la eliminación
     y avisará al usuario.
     """
     objeto = self.objeto
     if not utils.dialogo('¿Eliminar el banco?', 
                          'BORRAR', 
                          padre = self.wids['ventana']):
         return
     if objeto.remesas != []:
         utils.dialogo_info('BANCO NO ELIMINADO', 
                            'El banco está implicado en operaciones que '
                            'impiden su borrado.', 
                            padre = self.wids['ventana'])
     else:
         objeto.notificador.desactivar()
         try:
             objeto.destroy(usuario = self.usuario, ventana = __file__)
         except Exception, e:
             self.logger.error("bancos.py::borrar -> PUID %s no se pudo eliminar. Excepción: %s." % (objeto.puid, e))
             utils.dialogo_info(titulo = "BANCO NO BORRADO", 
                                texto = "El banco no se pudo eliminar.\n\nSe generó un informe de error en el «log» de la aplicación.",
                                padre = self.wids['ventana'])
             self.actualizar_ventana()
             return
         self.objeto = None
         self.ir_a_primero()
Пример #20
0
 def borrar(self, widget):
     """
     Elimina el objeto de la tabla pero NO
     intenta eliminar ninguna de sus relaciones,
     de forma que si se incumple alguna 
     restricción de la BD, cancelará la eliminación
     y avisará al usuario.
     """
     XXXobjeto = self.objeto
     if not utils.dialogo("¿Eliminar el XXX?", "BORRAR", padre=self.wids["ventana"]):
         return
     if XXXobjeto.pagos != []:
         utils.dialogo_info(
             "XXX NO ELIMINADO",
             "El XXX está implicado en operaciones que impiden su borrado.",
             padre=self.wids["ventana"],
         )
     else:
         XXXobjeto.notificador.desactivar()
         try:
             XXXobjeto.destroy(ventana=__file__)
         except Exception, e:
             self.logger.error(
                 "XXXskel.py::borrar -> XXX ID %d no se pudo eliminar. Excepción: %s." % (XXXobjeto.id, e)
             )
             utils.dialogo_info(
                 titulo="XXX NO BORRADO",
                 texto="El XXX no se pudo eliminar.\n\nSe generó un informe de error en el «log» de la aplicación.",
                 padre=self.wids["ventana"],
             )
             self.actualizar_ventana()
             return
         self.objeto = None
         self.ir_a_primero()
Пример #21
0
 def borrar(self, widget):
     """
     Elimina el objeto de la tabla pero NO
     intenta eliminar ninguna de sus relaciones,
     de forma que si se incumple alguna 
     restricción de la BD, cancelará la eliminación
     y avisará al usuario.
     """
     remesa = self.objeto
     if not utils.dialogo('¿Eliminar la remesa?', 
                          'BORRAR', 
                          padre = self.wids['ventana']):
         return
     if remesa.efectos:
         utils.dialogo_info('REMESA NO ELIMINADA', 
                            'La remesa está implicada en operaciones '
                            'que impiden su borrado.', 
                            padre = self.wids['ventana'])
     else:
         remesa.notificador.desactivar()
         try:
             remesa.destroy(ventana = __file__)
         except Exception, e:
             self.logger.error("remesas.py::borrar -> Remesa ID %d no se pudo eliminar. Excepción: %s." % (remesa.id, e))
             utils.dialogo_info(titulo = "REMESA NO BORRADA", 
                                texto = "La remesa no se pudo eliminar.\n"
                                        "\nSe generó un informe de error "
                                        "en el «log» de la aplicación.",
                                padre = self.wids['ventana'])
             self.actualizar_ventana()
             return
         self.objeto = None
         self.ir_a_primero()
Пример #22
0
 def drop(self, w):
     model, itr = self.wids['tv_pruebas'].get_selection().get_selected()
     if itr != None and utils.dialogo(titulo = 'BORRAR PRUEBA', texto = '¿Está seguro?'):
         ide = model[itr][-1]
         prueba = claseprueba.get(ide)
         prueba.destroy(ventana = __file__)
         self.rellenar_pruebas()
Пример #23
0
 def drop_consumo_por_producto(self, boton):
     """
     Elimina el consumo o consumos seleccionados en el TreeView.
     """
     texto = """
     Si ha seleccionado un consumo se eliminará el consumo completo.             
     Si seleccionó uno o varios productos, se eliminarán del consumo al          
     que pertenece, por lo que ya no empleará el material relacionado            
     cuando se fabriquen artículos del mismo.                                    
                                                                                 
     ¿Está seguro de querer continuar?                                           
                                                                                 
     """
     model, paths = self.wids['tv_consumos'].get_selection().get_selected_rows()
     if paths and utils.dialogo(titulo = "¿ELIMINAR?", texto = texto, padre = self.wids['ventana']):
         for path in paths:
             if model[path].parent == None:
                 id_consumo = model[path][-1]
                 consumo_adicional_por_producto = pclases.ConsumoAdicional.get(id_consumo)
                 try:
                     for p in consumo_adicional_por_producto.productosVenta:
                         consumo_adicional_por_producto.removeProductoVenta(p)
                     consumo_adicional_por_producto.destroy(ventana = __file__)
                 except psycopg_ProgrammingError, msg:
                     utils.dialogo_info(titulo = "ERROR: INFORME A LOS DESARROLLADORES", 
                                        texto = "Ocurrió un error al eliminar el consumo.\nDEBUG: Traza de la excepción:\n%s" % (msg), 
                                        padre = self.wids['ventana'])
             else:
                 id_consumo = model[path].parent[-1]
                 idproductov = model[path][-1]
                 consumo_adicional_por_producto = pclases.ConsumoAdicional.get(id_consumo)
                 productov = pclases.ProductoVenta.get(idproductov)
                 consumo_adicional_por_producto.removeProductoVenta(productov)
         self.rellenar_consumos_adicionales_por_producto()
Пример #24
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).
     """
     if utils.dialogo(titulo = "¿EXPORTAR A CSV?", 
                      texto = "¿Quiere generar también un archivo CSV por "
                              "cada almacén?", 
                      defecto = False, 
                      tiempo = 15):
         csv = True 
         ruta_csv = tempfile.NamedTemporaryFile(suffix = ".csv").name
     else:
         csv = False
         ruta_csv = None
     from formularios import reports
     reports.abrir_pdf(geninformes.existencias_productos(
         'balas', 
         "%s, %s" % (utils.str_fecha(time.localtime()), 
                     time.strftime("%H:%M")), 
         ruta_csv = ruta_csv))
     if pclases.Almacen.select(pclases.Almacen.q.activo==True).count() > 1:
         for a in pclases.Almacen.select(pclases.Almacen.q.activo == True):
             if csv:
                 ruta_csv = tempfile.NamedTemporaryFile(
                     suffix = "_%s.csv" % a.nombre, 
                     delete = False).name
             reports.abrir_pdf(
                 geninformes.existencias_productos(
                     'balas', 
                     "%s, %s" % (
                         utils.str_fecha(time.localtime()), 
                         time.strftime("%H:%M")), 
                     almacen = a, 
                     ruta_csv = ruta_csv))
     if utils.dialogo(titulo = "¿IMPRIMIR DESGLOSE?", 
                      texto = "¿Desea imprimir un desglose por lote de la"
                              " fibra en almacén?      \n\nNOTA: Puede "
                              "tardar algún tiempo.", 
                      defecto = "No"):
         reports.abrir_pdf(
             geninformes.existencias_fibra_por_lote("%s, %s" % (
                 utils.str_fecha(time.localtime()), 
                 time.strftime("%H:%M"))))
Пример #25
0
 def rellenar_widgets(self):
     """
     Introduce la información del proveedor 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.
     """
     proveedor = self.objeto
     if proveedor != None:
         orden = utils.combo_get_value(self.wids["cb_orden"])
         if orden == "Orden cronológico":
             proveedores = pclases.Proveedor.select(orderBy="id")
         elif orden == "Orden alfabético":
             proveedores = pclases.Proveedor.select(orderBy="nombre")
         proveedores_count = proveedores.count()
         yo_index = pclases.SQLlist(proveedores).index(self.objeto) + 1
         self.wids["ventana"].set_title(
             "Proveedores - %s (%d de %d)" % (proveedor.nombre, yo_index, proveedores_count)
         )
         # Aprovechando que todo son "text" y los "entry" se llaman casi
         # igual:
         for c in proveedor.sqlmeta.columnList:
             if c.name != "tipoDeProveedorID":
                 textobj = getattr(proveedor, c.name)
                 # Reparo los Nones que haya en la BD
                 if textobj == None:
                     proveedor.notificador.set_func(lambda: None)
                     textobj = ""
                     setattr(proveedor, c.name, textobj)
                     proveedor.notificador.set_func(self.aviso_actualizacion)
                 self.escribir_valor(self.wids["e_%s" % c.name], textobj)
             else:
                 utils.combo_set_from_db(self.wids["cb_tipo_de_proveedor"], proveedor.tipoDeProveedorID)
         self.rellenar_cuentas()
         self.rellenar_tipos_de_material()
         self.objeto.make_swap()
         try:
             doc_from_db = self.objeto.get_documentoDePago().documento
         except AttributeError:
             doc_from_db = None
         if doc_from_db and doc_from_db != self.objeto.documentodepago:
             if utils.dialogo(
                 titulo="CORREGIR DOCUMENTO DE PAGO",
                 texto="El cliente actual tiene como documento de pago:\n"
                 "«%s». Se aconseja usar «%s».\n"
                 "¿Corregirlo automáticamente?\n\n"
                 "(Responda «No» si la forma de pago es correcta \n"
                 "o prefiere corregirlo manualmente)" % (self.objeto.documentodepago, doc_from_db),
                 padre=self.wids["ventana"],
             ):
                 self.objeto.documentodepago = doc_from_db
                 self.objeto.syncUpdate()
                 self.wids["e_documentodepago"].set_text(self.objeto.documentodepago)
         ### Botones anterior/siguiente
         self.actualizar_botones_anterior_siguiente()
Пример #26
0
 def drop(self, w):
     model, itr = self.wids['tv_pruebas'].get_selection().get_selected()
     if itr != None and utils.dialogo(titulo = 'BORRAR PRUEBA', texto = '¿Está seguro?'):
         id1, id2 = [int(i) for i in model[itr][-1].split(":")]
         prueba = pclases.PruebaGranza.get(id1)
         prueba.destroy(ventana = __file__)
         if id2 > 0:
             prueba = pclases.PruebaGranza.get(id2)
             prueba.destroy(ventana = __file__)
         self.rellenar_pruebas()
Пример #27
0
 def desconfirmar(self, boton):
     if utils.dialogo(titulo = "¿DESCONFIRMAR EFECTO?", 
             texto = "Se desconfirmará el efecto y borrará la\n" 
                     "fecha de cobro estimada y de aceptación.", 
             padre = self.wids['ventana']):
         self.objeto.aceptada = False
         self.objeto.fechaCobro = None
         self.objeto.fechaPrevista = None
         self.objeto.syncUpdate()
         self.actualizar_ventana()
Пример #28
0
 def drop_concentracion(self, boton):
     if not utils.dialogo(titulo = "¿BORRAR?", 
             texto = "Se eliminará la fila seleccionada. ¿Continuar?", 
             padre = self.wids['ventana']):
         return
     model,path=self.wids['tv_concentracion'].get_selection().get_selected()
     puid = model[path][-1]
     cr = pclases.getObjetoPUID(puid)
     cr.destroy(usuario = self.usuario, ventana = __file__)
     self.rellenar_tabla_concentraciones()
Пример #29
0
 def salir(self, 
           boton, 
           event = None, 
           mostrar_ventana = True, 
           ventana = None):
     """
     Muestra una ventana de confirmación y 
     sale de la ventana cerrando el bucle
     local de gtk_main.
     Si mostrar_ventana es False, sale directamente
     sin preguntar al usuario.
     """
     res = False
     if event == None:
         # Me ha invocado el botón
         if (not mostrar_ventana 
             or utils.dialogo('¿Desea cerrar el menú principal?', 
                              'SALIR', 
                              padre = ventana, 
                              icono = gtk.STOCK_QUIT)):
             if ventana:
                 ventana.destroy()
             else:
                 try:
                     self.ventana.destroy()
                 except:
                     pass
             self.logger.warning("LOGOUT: %s" % (self.usuario.usuario))
             apagar_equipo()
             res = False
         else:
             res = True
     else:
         res = (not mostrar_ventana 
                or not utils.dialogo('¿Desea cerrar el menú principal?', 
                                     'SALIR', 
                                     padre = ventana, 
                                     icono = gtk.STOCK_QUIT))
         if not res: 
             self.logger.warning("LOGOUT: %s" % (self.usuario.usuario))
             apagar_equipo()
     return res
Пример #30
0
def comprobar_y_preguntar_si_guardar(ventana_padre):
    """
    Comprueba si hay cambios pendientes de guardar y guarda 
    si se responde que sí.
    """
    if (ventana_padre.wids['b_guardar_obs'].get_property("sensitive") and 
        ventana_padre.wids['txt_observaciones'].get_property("sensitive") and 
        utils.dialogo(titulo = "¿GUARDAR?", 
                      texto = "Hay cambios pendientes de guardar.\n¿Desea hacerlo ahora?", 
                      padre = ventana_padre.wids['ventana'])):
        ventana_padre.guardar_obs(None)