Esempio n. 1
0
 def salir(self, boton, event=None, mostrar_ventana=False):
     """
     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.
     """
     try:
         b_guardar = self.wids['b_guardar']
     except KeyError:
         b_guardar = None
     if  b_guardar != None and b_guardar.get_property('sensitive'):
         # Hay cambios pendientes de guardar.
         if utils.dialogo('Hay cambios pendientes de guardar.\n¿Desea hace'
                          'rlo ahora?', 
                          '¿GUARDAR CAMBIOS?', 
                          padre = self.wids['ventana'], 
                          icono = gtk.STOCK_SAVE, 
                          #defecto = "Sí"):  # CWT: A veces en BlancoPe 
                             # abren la ventana de productos para buscar 
                             # un precio y le dan al botón antes de que se 
                             # carguen los datos, provocando que se detecte 
                             # como un falso cambio de datos de la ventana 
                             # (todo blanco) respecto a la caché (datos 
                             # reales de la BD). Al darle a ENTER, 
                             # responden Sí por defecto -hasta ahora- y 
                             # sobreescriben con blanco todos los datos del 
                             # registro en la base de datos.
                          defecto = "No"):
             try:
                 self.guardar(None)
             except:
                 utils.dialogo_info(titulo = 'NO SE PUDO GUARDAR', 
                                    texto = 'Los cambios no se pudieron gua'
                                            'rdar automáticamente.\nDebe ha'
                                            'cerlo de forma manual',
                                    padre = self.wids['ventana'])
                 return True # Si devuelvo False, None, etc... continúa la 
                             # cadena de eventos y destruye la ventana.
                             # Devuelvo True para cancelar el cierre de la 
                             # ventana. 
     if event == None:
         # Me ha invocado el botón
         if not mostrar_ventana or \
             utils.dialogo('¿Desea salir de la ventana actual?', 
                          'SALIR', 
                          padre = self.wids['ventana'], 
                          icono = gtk.STOCK_QUIT):
             self.wids['ventana'].destroy()
             return False
         else:
             return True
     else:
         if not mostrar_ventana or not \
                 utils.dialogo('¿Desea salir de la ventana actual?',
                 'SALIR', padre=self.wids['ventana'], icono=gtk.STOCK_QUIT):
             return False
         else:
             return True
Esempio n. 2
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)):
             ventana.destroy()
             self.logger.warning("LOGOUT: %s" % (self.usuario.usuario))
             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))
     return res
Esempio n. 3
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).
        """
        import informes, 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(), 
                                            "csv_repuestos_%s" % (
                                    mx.DateTime.localtime().strftime("%Y%m%d")))
        pdfs = func_informe(exportar_a_csv_a = exportar_a_csv_a)
        for pdf in pdfs:
            informes.abrir_pdf(pdf)
Esempio n. 4
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).
        """
        import informes, 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.existencias_no_nulas
            #informes.abrir_pdf(geninformes.existencias_no_nulas(exportar_a_csv_a = "/tmp/t.csv"))
        else:
            #informes.abrir_pdf(geninformes.existencias())
            func_informe = geninformes.existencias
        # informes.abrir_pdf(geninformes._existencias())
        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(), 
                                            "csv_existencias_%s" % (
                                    datetime.date.today().strftime("%Y%m%d")))
                
        informes.abrir_pdf(func_informe(exportar_a_csv_a = exportar_a_csv_a))
Esempio n. 5
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
Esempio n. 6
0
 def imprimir(self,boton):
     """
     Prepara la vista preliminar para la impresión del informe
     """
     fechastr = self.wids['e_fecha'].get_text()
     fecha = utils.parse_fecha(fechastr)
     fechastr = utils.str_fecha(fecha)
     fechas = pclases.HistorialExistenciasA.get_fechas_cacheadas()
     if fecha not in fechas:
         res = utils.dialogo(
             titulo = "EXISTENCIAS NO CACHEADAS. ¿CONTINUAR?", 
             texto = "La fecha seleccionada no se encuentra precalculada.\n"
                     "Esto implica que el recuento de existencias puede\n"
                     "demorarse incluso horas. Durante este tiempo es \n"
                     "posible que la aplicación no responda.\n\n"
                     "¿Está seguro de que desea continuar?", 
             padre = self.wids['ventana'])
     else:
         res = utils.dialogo(titulo = "¿CONTINUAR?", 
             texto = "La operación puede demorarse durante algún tiempo\n"
                 "y dar la impresión de que la aplicación no responde.\n"
                 "¿Desea continuar?", 
             padre = self.wids['ventana'])
     if not res:
         return
     vpro = ventana_progreso.VentanaProgreso(padre = self.wids['ventana'])
     self.wids['ventana'].window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
     vpro.mostrar()
     act = 0.0
     tot = 2 + pclases.Almacen.select().count()
     msgtexto = 'Calculando existencias a %s.' % fechastr
     vpro.set_valor(act/tot, msgtexto)
     vpro._ventana.realize()
     vpro._ventana.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
     while gtk.events_pending(): gtk.main_iteration(False)
     import informes
     try:
         vpro.set_valor(act/tot, msgtexto)
         informes.abrir_pdf(geninformes.existencias_productos('rollos', 
                            fechastr, hasta = fecha))
         act += 1
         vpro.set_valor(act/tot, msgtexto)
         informes.abrir_pdf(geninformes.existencias_productos('balas', 
                            fechastr, hasta = fecha))
         act += 1
         vpro.set_valor(act/tot, msgtexto)
         for a in pclases.Almacen.select(orderBy = "id"):
             informes.abrir_pdf(geninformes.existencias_productos('rollos', 
                                fechastr, hasta = fecha, almacen = a))
             act += 1
             vpro.set_valor(act/tot, msgtexto)
             informes.abrir_pdf(geninformes.existencias_productos('balas', 
                                fechastr, hasta = fecha, almacen = a))
             act += 1
             vpro.set_valor(act/tot, msgtexto)
     finally:
         vpro.ocultar()
         vpro._ventana.window.set_cursor(None)
         self.wids['ventana'].window.set_cursor(None)
Esempio n. 7
0
 def aceptar(self, boton):
     res = None
     model, iter = self.wids['tv_logic'].get_selection().get_selected()
     if iter != None:
         id = model[iter][-1]
         res = pclases.LogicMovimientos.get(id)
         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
 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.destroySelf()
             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()
             self.ir_a_primero()
Esempio n. 9
0
 def salir(self, boton, event = None, mostrar_ventana = True):
     """
     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.
     """
     try:
         b_guardar = self.wids['b_guardar']
     except KeyError:
         b_guardar = None
     if  b_guardar != None and b_guardar.get_property('sensitive'):
         # Hay cambios pendientes de guardar.
         if utils.dialogo('Hay cambios pendientes de guardar.\n¿Desea hace'
                          'rlo ahora?', 
                          '¿GUARDAR CAMBIOS?', 
                          padre = self.wids['ventana'], 
                          icono = gtk.STOCK_SAVE, 
                          defecto = "Sí"):
             try:
                 self.guardar(None)
             except:
                 utils.dialogo_info(titulo = 'NO SE PUDO GUARDAR', 
                                    texto = 'Los cambios no se pudieron gua'
                                            'rdar automáticamente.\nDebe ha'
                                            'cerlo de forma manual',
                                    padre = self.wids['ventana'])
                 return True # Si devuelvo False, None, etc... continúa la 
                             # cadena de eventos y destruye la ventana.
                             # Devuelvo True para cancelar el cierre de la 
                             # ventana. 
     if event == None:
         # Me ha invocado el botón
         if not mostrar_ventana or \
            utils.dialogo('¿Desea salir de la ventana actual?', 
                          'SALIR', 
                          padre = self.wids['ventana'], 
                          icono = gtk.STOCK_QUIT):
             self.wids['ventana'].destroy()
             return False
         else:
             return True
     else:
         return not mostrar_ventana or \
                not utils.dialogo('¿Desea salir de la ventana actual?', 
                                  'SALIR', 
                                  padre = self.wids['ventana'],
                                  icono = gtk.STOCK_QUIT)
Esempio n. 10
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)
         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)
 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',
                                    padre = self.wids['ventana'])
                 return 
     producto = self.objeto
     try:
         siguiente = 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 último registrado en el sistema",
                            titulo="ERROR",
                            padre = self.wids['ventana'])
         return
     self.objeto = siguiente
     self.actualizar_ventana()
Esempio n. 12
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)
     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)
     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", 
                            fecha = strfecha, 
                            extra_data = (
                                 ["Facturado: ", 
                                  self.wids['e_total'].get_text()], 
                                 ["Facturación sin IVA: ", 
                                  self.wids['e_siniva'].get_text()],
                                 ["Beneficio neto: ", 
                                  self.wids['e_beneficio'].get_text()])))
Esempio n. 13
0
 def borrar(self, widget):
     """
     Elimina el pagare en pantalla.
     """
     pagare = self.objeto
     if pagare != None:
         if utils.dialogo(titulo = 'BORRAR PAGARÉ', 
                 texto = '¿Está seguro de eliminar el pagare actual?', 
                 padre = self.wids['ventana']):
             pagare.notificador.set_func(lambda : None)
             try:
                 for c in pagare.cobros:
                     c.destroySelf()
                 pagare.destroySelf()
                 self.objeto = None
                 self.ir_a_primero()
             except:
                 txt = """
                 El pagare no se eliminó completamente.                          
                 Tal vez el pagaré o los vencimientos de facturas                
                 relacionados estén siendo referenciados por otros               
                 elementos de la aplicación. Contacte con el administrador.      
                 Información de depuración: 
                 """
                 for c in pagare.cobros:
                     txt += "ID cobro: %d.\n" % c.id
                 txt += "ID pagaré: %d\n" % pagare.id
                 utils.dialogo_info(titulo = 'ERROR: NO SE PUDO BORRAR',
                                    texto = txt, 
                                    padre = self.wids['ventana'])
Esempio n. 14
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.destroySelf()
                 except pclases.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()
Esempio n. 15
0
 def descargar_de_terminal(self, boton):
     """
     lee los códigos almacenados en el terminal lector de códigos de 
     barras y:
         * si es un diccionario de partidas de carga y números de bala, 
           crea una partida de carga (si no existían) por cada una de 
           las claves del diccionario y relaciona con las mismas las 
           balas de la lista. finalmente, crea un albarán interno con 
           todas esas balas (uno por partida)y abre una ventana de 
           partida de carga (esta) y una de albarán de salida por 
           cada partida de carga y albarán interno procesado con éxito.
         * si es una lista de balas, las agrega a la partida de carga 
           actual y crea el albarán interno.
     """
     self.logger.warning("%sconsumo_balas_partida::descargar_de_terminal -> Iniciando descarga de balas consumidas/a consumir automática." % (self.usuario and self.usuario.usuario + ": " or ""))
     datos = None
     cancelar = False
     while datos == None and not cancelar:
         datos = utils.descargar_phaser(logger = self.logger)
         if datos == None:
             cancelar = not utils.dialogo(titulo = "¿VOLVER A INTENTAR?", 
                                          texto = "Se ha superado el tiempo de espera.\n¿Desea continuar?\n\n(Pulse SÍ para volver a intentar o NO para cancelar la operación.)", 
                                          padre = self.wids['ventana'])
         elif isinstance(datos, (type([]), type(()))):
             self.descargar_y_meter_balas_en_partida_carga_actual(datos)
         elif isinstance(datos, type({})):
             for partida_carga in datos: 
                 if partida_carga == self.objeto:
                     self.descargar_y_meter_balas_en_partida_carga_actual(datos[partida_carga])
                 else:
                     self.descargar_y_meter_balas_en_partida_carga(partida_carga, datos[partida_carga])
Esempio n. 16
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.destroySelf()
             campos.destroySelf()
         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()
Esempio n. 17
0
 def cambiar_precio_ldp(self, cell, path, texto):
     """
     Cambia el precio de la LDP conforme al texto recibido.
     """
     try:
         precio = utils._float(texto)
     except:
         utils.dialogo_info(titulo = "ERROR", 
                            texto = 'El texto "%s" no es un número.' % (texto), 
                            padre = self.wids['ventana'])
     else:
         model = self.wids['tv_ldps'].get_model()
         ldp = pclases.LineaDePedido.get(model[path][-1])
         if ldp.precio != precio:
             ldp.precio = precio
             if ldp.get_lineas_de_venta() != [] \
                and utils.dialogo(titulo = "¿CAMBIAR PRECIO PRODUCTOS SERVIDOS?", 
                              texto = """
             Al cambiar el precio de una parte del presupuesto ofertado,             
             se cambian automáticamente los precios de los pedidos                   
             involucrados. También puede cambiar los albaranes y facturas            
             si el pedido ya ha sido servido.                                        
                                                                                     
             ¿Desea cambiar el precio de todos los artículos servidos                
             de este producto?                                                       
                                                                                     
             Si lo hace, se cambiará también en la factura en caso de                
             que se haya facturado el albarán o albaranes                            
             correspondientes.                                                       
             """, 
                             padre = self.wids['ventana']):
                 for ldv in ldp.get_lineas_de_venta():
                     ldv.precio = ldp.precio
         self.rellenar_tablas()
Esempio n. 18
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()
Esempio n. 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.
     """
     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.destroySelf()
         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()
Esempio n. 20
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.destroySelf()
         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))
Esempio n. 21
0
 def drop(self, w):
     model, iter = self.wids["tv_pruebas"].get_selection().get_selected()
     if iter != None and utils.dialogo(titulo="BORRAR PRUEBA", texto="¿Está seguro?"):
         id = model[iter][-1]
         prueba = pclases.PruebaTenacidad.get(id)
         prueba.destroySelf()
         self.rellenar_pruebas()
Esempio n. 22
0
 def set_partida(self, boton):
     """
     Hace activa una partida seleccionada para agregarle balas, imprimir su consumo, etc...
     """
     try:
         max_partida = pclases.PartidaCarga._connection.queryOne("SELECT MAX(numpartida) FROM partida_carga")[0]
         max_partida = "%d" % (max_partida + 1)
     except:
         max_partida = ""
     codigo = utils.dialogo_entrada(titulo = '¿NÚMERO DE PARTIDA?', 
                                    texto = 'Introduzca el número de partida de carga:', 
                                    padre = self.wids['ventana'], 
                                    valor_por_defecto = max_partida)
     if codigo == None:
         return 
     try:
         try:
             codigo = int(codigo.upper().replace("PC", ""))
             partida = pclases.PartidaCarga.select(pclases.PartidaCarga.q.numpartida == codigo)[0]
         except ValueError:
             partida = pclases.PartidaCarga.select(pclases.PartidaCarga.q.codigo == codigo)[0]
         self.objeto = partida
         self.actualizar_ventana()
     except TypeError:
         return
     except IndexError:
         codigo = `codigo`       # CHAPU
         if codigo.strip() != "" and utils.dialogo(titulo='¿CREAR PARTIDA?', 
                                                   texto='No se encontró la partida %s.\n¿Desea crear una nueva?' % (codigo), 
                                                   padre = self.wids['ventana']):
             self.nueva_partida(codigo)
 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.destroySelf()
         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.destroySelf()
         self.objeto = None
         self.ir_a_primero()
Esempio n. 24
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:
         self.objeto.destroySelf()
     except Exception, e:
         self.logger.error("grupos_alumnos.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.\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
Esempio n. 25
0
 def drop(self, w):
     model, iter = self.wids['tv_pruebas'].get_selection().get_selected()
     if iter != None and utils.dialogo(titulo = 'BORRAR PRUEBA', texto = '¿Está seguro?'):
         id = model[iter][-1]
         prueba = claseprueba.get(id)
         prueba.destroySelf()
         self.rellenar_pruebas()
Esempio n. 26
0
 def sugerir_productos(self, txt):
     """
     Intenta sugerir productos según el corrector Norving.
     """
     dirutils = os.path.join("..", "utils")
     if dirutils not in sys.path:
         sys.path.append(dirutils)
     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
Esempio n. 27
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.destroySelf()
         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()
 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 __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 PDF que se cree a continuación?", 
                      defecto = False, 
                      tiempo = 15):
         csv = True 
         ruta_csv = tempfile.NamedTemporaryFile(suffix = ".csv").name
     else:
         csv = False
         ruta_csv = None
     import informes
     informes.abrir_pdf(geninformes.existencias_productos(
         'rollos', 
         "%s, %s" % (utils.str_fecha(time.localtime()), 
                     time.strftime("%H:%M")), 
         ruta_csv = ruta_csv))
     if pclases.Almacen.select().count() > 1:
         for a in pclases.Almacen.select():
             if csv:
                 ruta_csv = tempfile.NamedTemporaryFile(
                     suffix = "_%s.csv" % a.nombre, 
                     delete = False).name
             informes.abrir_pdf(
                 geninformes.existencias_productos('rollos', "%s, %s" % (
                         utils.str_fecha(time.localtime()), 
                         time.strftime("%H:%M")), 
                     almacen = a, 
                     ruta_csv = ruta_csv))
Esempio n. 30
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 != None: empleado.notificador.set_func(lambda : None)
     actividades = empleado.actividades[:]
     documentos = empleado.documentos[:]
     fotos = empleado.fotos[:]
     grupos = empleado.gruposAlumnos[:]
     for lista in (actividades, documentos, fotos, grupos):
         for objeto in lista:
             objeto.empleado = None
     try:
         empleado.destroySelf()
     except: 
         utils.dialogo_info('EMPLEADO NO ELIMINADO', 
                            'No se pudo eliminar el empleado.', 
                            padre = self.wids['ventana'])
         for lista in (actividades, documentos, fotos, grupos):
             for objeto in lista:
                 objeto.empleado = empleado
     else:
         self.ir_a_primero()