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
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)
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
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()
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()
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()
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
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'])
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()
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()
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()
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()
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)
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
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))
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()
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()
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()
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()
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()
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()
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"))))
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()
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()
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()
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()
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
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)