def actualizar_porcentaje_tarifa(self, celleditable, path, nuevotexto): """ Se recibe la celda que ha cambiado. El contenido se toma como nuevo precio para la tarifa actual y el producto de la fila a la que pertenezca la fila. """ idprecio = self.wids['tabla_productos'].get_model()[path][-1] precio = pclases.Precio.get(idprecio) producto = precio.producto tarifa = self.objeto # OJO: No se debería devolver ni más ni menos de un producto. try: porcentaje = utils.parse_porcentaje(nuevotexto, True) except ValueError: utils.dialogo_info(titulo = 'VALOR INCORRECTO', texto = 'El texto tecleado (%s) no es un porcentaje correcto' % (nuevotexto), padre = self.wids['ventana']) else: nuevoprecio = producto.preciopordefecto * (1 + porcentaje) tarifa.asignarTarifa(producto, float(nuevoprecio)) #self.actualizar_ventana() model = self.wids['tabla_productos'].get_model() model[path][-3] = precio.precio model[path][-2] = "%s %%" % (porcentaje * 100)
def cambiar_descuento_ldc(self, cell, path, texto): try: descuento = utils.parse_porcentaje(texto, True) except: utils.dialogo_info(titulo = "ERROR", texto = "La cantidad %s no es un número válido." % (texto), padre = self.wids['ventana']) return model = self.wids['tv_ldvs'].get_model() idldc = model[path][-1] ldc = pclases.LineaDeCompra.get(idldc) ldc.descuento = descuento self.rellenar_widgets()
def cambiar_descuento_srv(self, cell, path, texto): """ Cambia el descuento del servicio. """ try: descuento = utils.parse_porcentaje(texto, fraccion = True) except ValueError: utils.dialogo_info(titulo = "ERROR", texto = 'El texto "%s" no es un número.'%texto, padre = self.wids['ventana']) else: model = self.wids['tv_servicios'].get_model() srv = pclases.Servicio.get(model[path][-1]) srv.descuento = descuento self.rellenar_tablas()
def guardar(self, widget): """ Guarda el contenido de los entry y demás widgets de entrada de datos en el objeto y lo sincroniza con la BD. """ # Desactivo el notificador momentáneamente self.objeto.notificador.activar(lambda: None) # Actualizo los datos del objeto for colname in self.dic_campos: col = self.clase._SO_columnDict[colname] try: valor_ventana = self.leer_valor(col, self.dic_campos[colname]) if valor_ventana == -1 and colname == "comercialID": valor_ventana = None setattr(self.objeto, colname, valor_ventana) except (ValueError, mx.DateTime.RangeError, TypeError): if colname == "numpresupuesto": txt = self.wids[self.dic_campos[colname]].get_text() if txt.strip() != "": utils.dialogo_info(titulo = "NÚMERO INCORRECTO", texto = "El texto «%s» es incorrecto."\ "\n\nDebe usar solo números." % txt, padre = self.wids['ventana']) else: setattr(self.objeto, colname, None) pass # TODO: Avisar al usuario o algo. El problema es que no hay una forma "limpia" de obtener el valor que ha fallado. try: dto = utils.parse_porcentaje(self.wids['e_descuento'].get_text(), fraccion = True) except (TypeError, ValueError): utils.dialogo_info(titulo = "VALOR INCORRECTO", texto = "Escriba un valor correcto par"\ "a el porcentaje de descuento global", padre = self.wids['ventana']) else: self.objeto.descuento = dto # Fuerzo la actualización de la BD y no espero a que SQLObject lo haga por mí: self.objeto.syncUpdate() self.objeto.sync() # Vuelvo a activar el notificador self.objeto.notificador.activar(self.aviso_actualizacion) self.actualizar_ventana() self.wids['b_guardar'].set_sensitive(False)
def convertir_a_flotante(valor, vdefecto = 0.0, col = None): """ Devuelve el valor por defecto "vdefecto" en caso de excepción. Antes de lanzarla, prueba como número flotante y como flotante con símbolo de porcentaje. Fuerza la comprobación de porcentaje si col es distinto de None y está entre las columnas a tratar así. """ from utils import _float, parse_porcentaje try: if col != None and col.name in NOMBRES_COLUMNAS_PORCENTAJE: raise Exception, "Forzando comprobación de porcentaje." return _float(valor) except: try: # 5 decimales de precisión es bastante para un porcentaje. Es lo # que uso también para mostrar en pantalla (ver el getter arriba). return round(parse_porcentaje(valor, fraccion = True), 5) except: return vdefecto
def cambiar_precio_tarifa(self, cell, path, texto, numcol): # Chequeo permiso de escritura para camibar precios, existencias y demás: try: ventana = pclases.Ventana.select(pclases.Ventana.q.fichero == "productos.py")[0] if self.usuario and (not self.usuario.get_permiso(ventana).escritura or self.usuario.nivel >= 2): utils.dialogo_info(titulo = "USUARIO SIN PRIVILEGIOS", texto = "Necesita permiso de escritura para modificar el precio.", padre = self.wids['ventana']) return except IndexError: if self.usuario and self.usuario.nivel >= 2: utils.dialogo_info(titulo = "USUARIO SIN PRIVILEGIOS", texto = "No tiene permisos suficientes para modificar el precio.", padre = self.wids['ventana']) return model = self.wids['tv_datos'].get_model() id = model[path][-1] if "PC" in model[path][0]: producto = pclases.ProductoCompra.get(id) elif "PV" in model[path][0]: producto = pclases.ProductoVenta.get(id) else: return try: precio = utils._float(texto) except ValueError: try: porcentaje = utils.parse_porcentaje(texto, True) precio = producto.precioDefecto * (1.0 + porcentaje) * 1.18 except ValueError: utils.dialogo_info(titulo = "ERROR DE FORMATO", texto = "El texto %s no es correcto." % (texto), padre = self.wids['ventana']) return tarifa = self.__tarifas[numcol - 5] precio_tarifa, porcentaje = calcular_precio(precio, producto.precioDefecto) tarifa.asignarTarifa(producto, precio_tarifa) precio_tarifa *= 1.18 model[path][numcol] = "%s (%s %%)" % (utils.float2str(precio_tarifa), utils.float2str(porcentaje, 1))
def leer_valor(self, widget): """ Intenta leer el valor como si fuera un Entry. Si no lo consigue lo hace suponiendo que es un TextView. Devuelve el valor leído _como cadena_. """ try: if isinstance(widget, gtk.CheckButton): res = widget.get_active() elif hasattr(widget, "child"): res = widget.child.get_text() else: res = widget.get_text() if "iva" in widget.name: # es feo, lo sé. try: res = utils.parse_porcentaje(res, fraccion = True) except ValueError: res = 0.18 except AttributeError: buffer = widget.get_buffer() res = buffer.get_text(buffer.get_start_iter(), buffer.get_end_iter()) return res
def cambiar_descuento_ldp(self, cell, path, texto): """ Cambia el descuento de la LDP conforme al texto recibido. """ try: descuento = utils.parse_porcentaje(texto, fraccion = True) except: utils.dialogo_info(titulo = "ERROR", texto = 'El texto "%s" no es un número válido.' % (texto), padre = self.wids['ventana']) else: model = self.wids['tv_ldps'].get_model() ldp = pclases.LineaDePedido.get(model[path][-1]) if ldp.descuento != descuento: ldp.descuento = descuento if ldp.get_lineas_de_venta() != [] \ and utils.dialogo( titulo = "¿CAMBIAR PRODUCTOS SERVIDOS?", texto = """ Al cambiar el descuento 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 descuento 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.descuento = ldp.descuento self.rellenar_tablas()