def nuevo(self, widget): """ Función callback del botón b_nuevo. Pide los datos básicos para crear un nuevo objeto. Una vez insertado en la BD hay que hacerlo activo en la ventana para que puedan ser editados el resto de campos que no se hayan pedido aquí. """ clientes = [(c.id, "%s (%s)" % (c.nombre, c.cif)) for c in pclases.Cliente.select( pclases.Cliente.q.inhabilitado == False, orderBy = "nombre")] idcliente = utils.dialogo_combo("CLIENTE NUEVA FACTURA", "Seleccione un cliente de la lista", clientes, padre = self.wids['ventana']) if idcliente != None: proveedores = [(p.id, "%s (%s)" % (p.nombre, p.cif)) for p in pclases.Proveedor.select( pclases.Proveedor.q.inhabilitado == False, orderBy = "nombre")] idproveedor = utils.dialogo_combo("PROVEEDOR DE LA FACTURA", "Seleccione el proveedor:", proveedores, padre = self.wids['ventana']) if idproveedor != None: series = [(s.id, s.get_next_numfactura()) for s in pclases.SerieFacturasVenta.select( orderBy = "prefijo")] idserie = utils.dialogo_combo("SERIE DE FACTURAS", "Seleccione una serie:", series, self.wids['ventana']) if idserie != None: objeto_anterior = self.objeto if objeto_anterior != None: objeto_anterior.notificador.desactivar() serie = pclases.SerieFacturasVenta.get(idserie) numfactura = serie.get_next_numfactura() self.objeto = self.clase(bloqueada = False, clienteID = idcliente, proveedorID = idproveedor, serieFacturasVentaID = idserie, numfactura = numfactura) numfactura = serie.get_next_numfactura(commit = True) assert numfactura == self.objeto.numfactura self.objeto.notificador.activar(self.aviso_actualizacion) self._objetoreciencreado = self.objeto self.activar_widgets(True) self.actualizar_ventana(objeto_anterior = objeto_anterior) utils.dialogo_info('NUEVO %s CREADO' % self.clase.sqlmeta.table.upper(), 'Se ha creado un nuevo %s.\nA continuación complete la información del misma y guarde los cambios.' % self.clase.sqlmeta.table.lower(), padre = self.wids['ventana'])
def crear_nuevo_albaran(self, widget): """ Función callback del botón b_nuevo. Pide los datos básicos para crear un nuevo objeto. Una vez insertado en la BD hay que hacerlo activo en la ventana para que puedan ser editados el resto de campos que no se hayan pedido aquí. """ albaran = self.objeto global transportista transportista = None # Datos a pedir: numalbaran = utils.dialogo_entrada(texto = 'Introduzca un número para el albarán.', titulo = 'NÚMERO DE ALBARÁN', padre = self.wids['ventana']) if not numalbaran: if numalbaran != None: utils.dialogo_info(titulo = "ATENCIÓN", texto = "No se permiten albaranes de entrada de repuestos sin número.", padre = self.wids['ventana']) return provs = pclases.Proveedor.select(orderBy = 'nombre') lista_provs = [(p.id, p.nombre) for p in provs if not p.inhabilitado] idproveedor = utils.dialogo_combo(titulo = "SELECCIONAR PROVEEDOR", texto = "Seleccione el proveedor de la factura:", ops = lista_provs, padre = self.wids['ventana']) if idproveedor is None: return if albaran != None: albaran.notificador.set_func(lambda : None) almacenes = [(a.id, a.nombre) for a in pclases.Almacen.select( pclases.Almacen.q.activo == True, orderBy = "id")] almacenppal = pclases.Almacen.get_almacen_principal_id_or_none() almo = utils.dialogo_combo(titulo = "ALMACÉN DESTINO", texto = "Seleccione el almacén destino de la mercancía", ops = almacenes, padre = self.wids['ventana'], valor_por_defecto = almacenppal) if not almo: # Cancelar return albaran = pclases.AlbaranEntrada(fecha = mx.DateTime.localtime(), numalbaran = numalbaran, proveedorID = idproveedor, repuestos = True, almacenID = almo) pclases.Auditoria.nuevo(albaran, self.usuario, __file__) utils.dialogo_info('ALBARÁN CREADO', 'El albarán %s ha sido creado.\nComplete la información asociando entradas al mismo.' % str(albaran.numalbaran), padre = self.wids['ventana']) albaran.notificador.set_func(self.aviso_actualizacion) self.objeto = albaran self.actualizar_ventana()
def nuevo(self, widget): """ Función callback del botón b_nuevo. Pide los datos básicos para crear un nuevo objeto. Una vez insertado en la BD hay que hacerlo activo en la ventana para que puedan ser editados el resto de campos que no se hayan pedido aquí. """ empleados = [(e.id, e.nombre +" "+ e.dni) for e in pclases.Empleado.select(orderBy = "nombre")] empleadoid = utils.dialogo_combo(titulo = "SELECCIONE EMPLEADO", texto = "Seleccione un empleado del desplegable:", ops = empleados, padre = self.wids['ventana']) if empleadoid: objeto_anterior = self.objeto if objeto_anterior != None: objeto_anterior.notificador.desactivar() self.objeto = self.clase(empleadoID = empleadoid, campanna = None, parcela = None, actividad = None, salario = None) self.objeto.notificador.activar(self.aviso_actualizacion) self._objetoreciencreado = self.objeto self.activar_widgets(True) self.actualizar_ventana(objeto_anterior = objeto_anterior) utils.dialogo_info('NUEVO %s CREADO' % self.clase.sqlmeta.table.upper(), 'Se ha creado un nuevo %s.\nA continuación complete la información del misma y guarde los cambios.' % self.clase.sqlmeta.table.lower(), padre = self.wids['ventana'])
def build_gasto_salario(padre, empleado = None): """ Verifica que hay una cuenta de gastos para salarios. Si no existe, la crea. Pregunta por el empleado al que le corresponde el salario si no se recibe como parámetro. Si cancela u ocurre un error, devuelve (None, None). Si no, devuelve el gasto creado relacionado con el empleado y el empleado en una tupla (gasto, empleado). Recibe la ventana padre para el diálogo modal. """ res = [None, None] if not empleado: empleados = pclases.Empleado.select(orderBy = "nombre") empleados = [(e.id, "%s, %s" % (e.nombre, e.dni)) for e in empleados] empleadoid = utils.dialogo_combo("SELECCIONE EMPLEADO:", "Seleccione un empleado del desplegable:", empleados, padre = padre) else: empleadoid = empleado.id if empleadoid != None: res[1] = pclases.Empleado.get(empleadoid) try: cuenta = pclases.CuentaGastos.selectBy(descripcion="Salarios")[0] except IndexError: cuenta = pclases.CuentaGastos(descripcion = "Salarios") gasto = pclases.Gasto(cuentaGastos = cuenta, facturaCompra = None, parcela = None, concepto = "Salario %s" % res[1].nombre, importe = 0.0) res[0] = gasto return res
def drop_factura(self, boton = None): """ Elimina la relación entre una factura (en realidad un vencimiento) y el recibo actual. """ if self.objeto != None: ops = [(v.id, "%s: %s € (%s))" % (v.get_factura_o_prefactura() and v.get_factura_o_prefactura().numfactura or "?", utils.float2str(v.importe), utils.str_fecha(v.fecha))) for v in self.objeto.vencimientosCobro] ide = utils.dialogo_combo(titulo = "QUITAR FACTURA", texto = "Seleccione un vencimiento a eliminar del recibo.", padre = self.wids['ventana'], ops = ops) if ide != None: vto = pclases.VencimientoCobro.get(ide) 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: # No tiene factura, o la factura no tiene cliente. Dejo las observaciones que tuviera. self.logger.warning("%srecibos::drop_factura -> El vencimientoCobro ID %d no tiene factura, o su factura no tiene cliente." % (self.usuario and self.usuario.usuario + ": " or "", vto.id)) self.actualizar_ventana()
def imprimir(self, boton): """ Imprime un fax con la información de la transferencia. Solicita un firmante al usuario. El resto de los datos se obtienen de la BD. """ from informes.geninformes import fax_transferencia from formularios.reports import abrir_pdf firmantes = {1: "Otro (texto libre)", 2: "D. Enrique Román Corzo", 3: "D. Enrique Figueroa Yáñez", 4: "D. Enrique Mozo del Río", 5: "D. Fernando Guijarro Lozano"} # TODO: HARCODED claves = firmantes.keys() claves.sort() firmado = utils.dialogo_combo(titulo = "FIRMANTE", texto = 'Seleccione un firmante o elija "otro" y pulse\n«Aceptar» para escribir uno distinto:', ops = ([(k, firmantes[k]) for k in claves]), padre = self.wids['ventana']) if firmado == 1: firmado = utils.dialogo_entrada(titulo = "FIRMANTE", texto = "Introduzca el nombre que aparecerá en la firma:", padre = self.wids['ventana']) elif firmado != None: firmado = firmantes[firmado] if firmado != None: try: e = pclases.DatosDeLaEmpresa.select()[0] t = self.objeto o = t.cuentaOrigen d = t.cuentaDestino p = t.proveedor empresa = o.banco contacto = o.contacto fax = o.fax telefono = o.telefono de = e.nombreContacto asunto = "Transferencia" fecha = utils.str_fecha(t.fecha) beneficiario = p.nombre banco = d.banco #if p.es_extranjero(): # cuenta = "%s %s" % (d.iban, d.swif) #else: # cuenta = d.cuenta cuenta = d.cuenta porcuenta = e.nombre ccc = o.ccc concepto = t.concepto importe = "%s €" % (utils.float2str(t.importe)) swift = d.swif iban = d.iban observaciones = d.observaciones conceptoLibre = t.conceptoLibre except AttributeError, msg: utils.dialogo_info(titulo = "ERROR AL GENERAR FAX", texto = "No se encontraron algunos datos.\n\nVerifique la información y vuelva a intentarlo.", padre = self.wids['ventana']) self.logger.error("transferencias.py::imprimir -> AttributeError: %s" % msg) except IndexError, msg: utils.dialogo_info(titulo = "ERROR AL RECUPERAR DATOS DE LA EMPRESA", texto = "No se encontraron los datos de la empresa.\n\nCompruebe que existe una empresa en la tabla «datos_de_la_empresa».\n\n\n(Contacte con el administrador en caso de duda.)", padre = self.wids['ventana']) self.logger.error("transferencias.py::imprimir -> IndexError: %s" % msg)
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 nuevo(self, widget): """ Función callback del botón b_nuevo. Pide los datos básicos para crear un nuevo objeto. Una vez insertado en la BD hay que hacerlo activo en la ventana para que puedan ser editados el resto de campos que no se hayan pedido aquí. """ fincas = [(f.id, f.nombre) for f in pclases.Finca.select(orderBy = "nombre")] idfinca = utils.dialogo_combo(titulo = "SELECCIONE FINCA", texto = "Seleccione la finca a la que pertenece la nueva parcela:", ops = fincas, padre = self.wids['ventana']) if idfinca != None: objeto_anterior = self.objeto if objeto_anterior != None: objeto_anterior.notificador.desactivar() self.objeto = self.clase(fincaID = idfinca) self.objeto.notificador.activar(self.aviso_actualizacion) self._objetoreciencreado = self.objeto self.activar_widgets(True) self.actualizar_ventana(objeto_anterior = objeto_anterior) utils.dialogo_info('NUEVO %s CREADO' % self.clase.sqlmeta.table.upper(), 'Se ha creado un nuevo %s.\nA continuación complete la información del misma y guarde los cambios.' % self.clase.sqlmeta.table.lower(), padre = self.wids['ventana'])
def add_producto(self, boton): """ OJO: Los repuestos deben tener como tipo de material uno que tenga en su descripción "aceite", "lubricante" o "repuesto". """ tipos = pclases.TipoDeMaterial.select(pclases.OR( pclases.TipoDeMaterial.q.descripcion.contains("repuesto"), pclases.TipoDeMaterial.q.descripcion.contains("aceite"), pclases.TipoDeMaterial.q.descripcion.contains("lubricante"))) if tipos.count() == 0: utils.dialogo_info(titulo = "SIN DATOS", texto = "No hay repuestos dados de alta en los" " tipos de material.", padre = self.wids['ventana']) else: tipos = [(t.id, t.descripcion) for t in tipos] idtipo = utils.dialogo_combo(titulo = "SELECCIONE TIPO", texto = "Seleccione un tipo de material", padre = self.wids['ventana'], ops = tipos) if idtipo != None: prods = pclases.ProductoCompra.select(pclases.AND( pclases.ProductoCompra.q.tipoDeMaterialID == idtipo, pclases.ProductoCompra.q.obsoleto == False)) if prods.count() == 0: utils.dialogo_info(titulo = "SIN DATOS", texto = "No hay repuestos dados de alta con el tipo " "de material «%s»." % ( pclases.TipoDeMaterial.get(idtipo).descripcion), padre = self.wids['ventana']) else: prods = [(p.id, p.descripcion) for p in prods] idprod = utils.dialogo_combo( titulo = "SELECCIONE PRODUCTO", texto = "Seleccione un respuesto:", padre = self.wids['ventana'], ops = prods) if idprod != None: prod = pclases.ProductoCompra.get(idprod) ldv = pclases.LineaDeVenta(facturaVenta = None, pedidoVenta = None, albaranSalida=self.objeto, productoVenta = None, productoCompra = prod, cantidad = 0) pclases.Auditoria.nuevo(ldv, self.usuario, __file__) self.actualizar_ventana()
def nuevo(self, widget): """ Función callback del botón b_nuevo. Pide los datos básicos para crear un nuevo objeto. Una vez insertado en la BD hay que hacerlo activo en la ventana para que puedan ser editados el resto de campos que no se hayan pedido aquí. """ tipos = [(i.id, i.descripcion) for i in pclases.PresupuestoAnual.select()] tipos.insert(0, (0, "Añadir concepto de primer nivel")) tipo = utils.dialogo_combo(titulo = "NUEVO CONCEPTO", texto = "Seleccione tipo:", ops = tipos, padre = self.wids['ventana']) if tipo >= 0: if tipo > 0: pa = pclases.PresupuestoAnual.get(tipo) if "proveedores granza" in pa.descripcion.lower(): # Si es del tipo de proveedores, entonces tengo que # añadir un proveedor de granza. nombre = utils.dialogo_entrada( titulo = "NOMBRE PROVEEDOR", texto = "Introduzca el nombre del proveedor:", padre = self.wids['ventana']) if nombre != None: proveedor = buscar_proveedor(nombre, self.wids['ventana']) if proveedor: # TODO: Check que el proveedor no esté ya en # el presupuesto. c = pclases.ConceptoPresupuestoAnual( presupuestoAnual = pa, descripcion = proveedor.nombre, proveedor = proveedor) pclases.Auditoria.nuevo(c, self.usuario, __file__) else: descripcion = utils.dialogo_entrada( titulo = "NUEVO CONCEPTO", texto = "Introduzca descripción:", padre = self.wids['ventana']) if descripcion: c = pclases.ConceptoPresupuestoAnual( presupuestoAnual = pa, descripcion = descripcion) pclases.Auditoria.nuevo(c, self.usuario, __file__) else: # Concepto de primer nivel descripcion = utils.dialogo_entrada( titulo = "NUEVO CONCEPTO", texto = "Introduzca descripción:", padre = self.wids['ventana']) if descripcion: pa = pclases.PresupuestoAnual(descripcion = descripcion) pclases.Auditoria.nuevo(pa, self.usuario, __file__) self.actualizar_ventana()
def elegir_o_crear_obra(self): """ Crea una nueva obra relacionada con la factura de venta de la ventana. """ obras = pclases.Obra.select(orderBy = "nombre") obras = [o for o in obras if self.objeto.cliente in o.clientes] idobra = utils.dialogo_combo(titulo = "SELECCIONE OBRA", texto = "Es necesario relacionar una obra con la factura."\ "\nSeleccione una del desplegable inferior o cree una "\ "nueva", padre = self.wids['ventana'], ops = [(0, "Crear una obra nueva")] + [(o.id, o.nombre) for o in obras]) if idobra == 0: nombre = utils.dialogo_entrada(titulo = "NOMBRE DE OBRA", texto = "Introduzca el nombre de la obra:", padre = self.wids['ventana']) if not nombre: return None direccion = utils.dialogo_entrada(titulo = "DIRECCIÓN", texto = "Introduzca la dirección de la obra:", padre = self.wids['ventana']) if direccion == None: return None ciudad = utils.dialogo_entrada(titulo = "CIUDAD", texto = "Introduzca la ciudad:", padre = self.wids['ventana']) if ciudad == None: return None cp = utils.dialogo_entrada(titulo = "CÓDIGO POSTAL", texto = "Introduzca el código postal", padre = self.wids['ventana']) if cp == None: return None provincia = utils.dialogo_entrada(titulo = "PROVINCIA", texto = "Introduzca la provincia:", padre = self.wids['ventana']) if provincia == None: return None # De fecha de inicio, fecha de fin de obra y observacione pasamos a # este nivel. Eso se afina en la ventana de obras. obra = pclases.Obra(nombre = nombre, direccion = direccion, cp = cp, ciudad = ciudad, provincia = provincia, fechainicio = None, fechafin = None, observaciones = "Creada desde módulo CRM: detalles de "\ "factura.", generica = False) pclases.Auditoria.nuevo(obra, self.usuario, __file__) obra.addCliente(self.objeto.cliente) elif idobra: obra = pclases.Obra.get(idobra) else: obra = None return obra
def crear_nuevo_pedido(self, widget): """ Asigna la linea sin pedido a un pedido a crear """ model, itr = self.wids['tv_tipos'].get_selection().get_selected() if itr != None: idtipo = model[itr][-1] linea_sin_pedido = pclases.LineaDeVenta.get(idtipo) else: utils.dialogo_info('ERROR','Seleccione una línea para asignarla al pedido', padre = self.wids['ventana']) return numpedido = utils.dialogo_entrada(titulo = 'NÚMERO DE PEDIDO', texto = 'Introduzca el número del pedido que desea crear', padre = self.wids['ventana']) if numpedido != None: try: pclases.PedidoVenta.select(pclases.PedidoVenta.q.numpedido == numpedido)[0] utils.dialogo_info(titulo = 'ERROR', texto = 'No se pudo crear el nuevo pedido. Ya existe un pedido con ese número.', padre = self.wids['ventana']) return except: if linea_sin_pedido.facturaVenta != None: pedido = pclases.PedidoVenta(cliente = linea_sin_pedido.facturaVenta.cliente, numpedido = numpedido, fecha = mx.DateTime.localtime()) pclases.Auditoria.nuevo(pedido, self.usuario, __file__) elif linea_sin_pedido.prefactura != None: pedido = pclases.PedidoVenta(cliente = linea_sin_pedido.prefactura.cliente, numpedido = numpedido, fecha = mx.DateTime.localtime()) pclases.Auditoria.nuevo(pedido, self.usuario, __file__) elif linea_sin_pedido.albaranSalida != None: pedido = pclases.PedidoVenta(cliente = linea_sin_pedido.albaranSalida.cliente, numpedido = numpedido, fecha = mx.DateTime.localtime()) pclases.Auditoria.nuevo(pedido, self.usuario, __file__) else: utils.dialogo_info(titulo='INFO',texto='La línea seleccionada no tiene ni albarán ni factura asociada.\nPor lo que para crear el pedido deber introducir un cliente', padre = self.wids['ventana']) clientes = [] for c in pclases.Cliente.select(orderBy = "nombre"): clientes.append((c.id,c.nombre)) cliente = utils.dialogo_combo(titulo = 'Seleccione cliente',texto = 'Seleccione el cliente para el pedido creado para la línea', ops = clientes) if cliente != None: pedido = pclases.PedidoVenta(cliente = cliente, numpedido = numpedido) pclases.Auditoria.nuevo(pedido, self.usuario, __file__) else: utils.dialogo_info(titulo = 'ERROR', texto= 'No se creó el pedido', padre = self.wids['ventana']) return linea_sin_pedido.pedidoVenta = pedido ldc = pclases.LineaDePedido(presupuesto = None, pedidoVenta = pedido, productoVenta = linea_sin_pedido.productoVenta, productoCompra = linea_sin_pedido.productoCompra, fechahora = mx.DateTime.localtime(), cantidad = linea_sin_pedido.cantidad, precio = linea_sin_pedido.precio, descuento = linea_sin_pedido.descuento, fechaEntrega = None, textoEntrega='') pclases.Auditoria.nuevo(ldc, self.usuario, __file__) self.rellenar_tabla() from formularios import pedidos_de_venta pedidos_de_venta.PedidosDeVenta(objeto = pedido, usuario = self.usuario)
def add_empaquetado(self, boton): # 1.- Pedir envase. envases = [(e.id, "%s (%s kg)" % (e.nombre, utils.float2str(e.kg))) for e in pclases.Envase.select(orderBy = "nombre")] idenvase = utils.dialogo_combo("ENVASE", "Seleccione un envase:", envases, padre = self.wids['ventana']) # 2.- Crear registro. if idenvase: envase = pclases.Envase.get(idenvase) tarrina = self.objeto empaquetado = pclases.Empaquetado(envase = envase, tarrina = tarrina, cantidad = 1) # 3.- Actualizar treeview. self.rellenar_tabla_empaquetado()
def add_concentracion(self, boton): clientes = [(c.id, c.nombre) for c in pclases.Cliente.select( pclases.Cliente.q.inhabilitado == False, orderBy = "nombre") if c not in [cr.cliente for cr in self.objeto.concentracionesRemesa]] clienteid = utils.dialogo_combo(titulo = "SELECCIONE UN CLIENTE", texto = "Seleccione o teclee el nombre de un cliente:", padre = self.wids['ventana'], ops = clientes) if clienteid: cliente = pclases.Cliente.get(clienteid) conc = pclases.ConcentracionRemesa(cliente = cliente, banco = self.objeto, concentracion = 0.0) pclases.Auditoria.nuevo(conc, self.usuario, __file__) self.rellenar_tabla_concentraciones()
def cambiar_contador(self, boton): """ Cambia un contador por otro en todos los clientes que lo tuvieran. """ model, itr = self.wids['tv_tipos'].get_selection().get_selected() if itr != None: idcontador = model[itr][-1] viejo_contador = pclases.Contador.get(idcontador) contadores = [(c.id, c.get_info()) for c in pclases.Contador.select() if c != viejo_contador] idcontador = utils.dialogo_combo(titulo = "SELECCIONE CONTADOR", texto = "Seleccione el contador que sustituirá al actual en los clientes.", ops = contadores, padre = self.wids['ventana']) if idcontador != None: nuevo_contador = pclases.Contador.get(idcontador) clientes = viejo_contador.clientes[:] for cliente in clientes: cliente.contador = nuevo_contador else: utils.dialogo_info('ERROR','Seleccione contador a modificar', padre = self.wids['ventana'])
def borrar(self, widget): """ Elimina un silo. Pregunta con un diálogo combo cuál de ellos borrar. """ opciones = [(s.id, s.nombre) for s in pclases.Silo.select()] idsilo = utils.dialogo_combo(titulo = "SELECCIONAR SILO", texto = "Seleccione silo a eliminar:", ops = opciones, padre = self.wids['ventana']) if idsilo != None: silo = pclases.Silo.get(idsilo) try: silo.destroy(ventana = __file__) except: utils.dialogo_info(titulo = "SILO NO BORRADO", texto = "El silo no se pudo eliminar.\nProbablemente esté implicado en cargas y consumos.", padre = self.wids['ventana']) return self.rellenar_widgets()
def cambiar_mes_acumulado(self, boton): """ Permite seleccionar un mes y un año. Después rellena los totales de nuevo usando ese mes y año para el acumulado del mes. No se almacenan mes y año, de modo que en cuanto se refresque la pantalla volverá al mes y año actual. """ mes_actual = mx.DateTime.today().month meses = zip(range(1, 13), ("enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre")) mes = utils.dialogo_combo(titulo = "MES", texto = "Seleccione mes:", ops = meses, padre = self.wids['ventana'], valor_por_defecto = mes_actual) if mes != None: anno_actual = mx.DateTime.today().year anno = utils.dialogo_entrada(titulo = "AÑO", texto = "Introduzca año:", valor_por_defecto = str(anno_actual), padre = self.wids['ventana']) try: anno = int(anno) except: anno = None if anno != None: if anno < 100: anno += 2000 self.rellenar_totales(None, mes, anno)
def add_ausencia(self, b): fecha = utils.str_fecha( utils.mostrar_calendario(padre = self.wids['ventana'])) dia, mes, anno = map(int, fecha.split('/')) fecha = mx.DateTime.DateTimeFrom(day = dia, month = mes, year = anno) opciones = [] for motivo in pclases.Motivo.select(): opciones.append((motivo.id, "%s %s" % ( motivo.descripcion, motivo.descripcionDias))) idmotivo = utils.dialogo_combo(titulo = "¿MOTIVO?", texto = "Seleccione motivo de ausencia", ops = opciones, padre = self.wids['ventana']) if idmotivo != None: motivo = pclases.Motivo.get(idmotivo) defecto = "%d" % motivo.excedenciaMaxima duracion = utils.dialogo_entrada(titulo = "DURACIÓN", texto = "Introduzca la duración en días de la ausencia.", padre = self.wids['ventana'], valor_por_defecto = defecto) try: duracion = int(duracion) for i in range(duracion): if isinstance(fecha, datetime.date): fechaincrementada = fecha + (datetime.timedelta(i)) else: fechaincrementada = fecha + (mx.DateTime.oneDay * i) ausencia = pclases.Ausencia(empleado = self.objeto, fecha = fechaincrementada, motivo = motivo) pclases.Auditoria.nuevo(ausencia, self.usuario, __file__) self.actualizar_ventana(deep_refresh=False) except (ValueError, TypeError): utils.dialogo_info(titulo = "VALOR INCORRECTO", texto = "Debe teclear un número. Vuelva a intentarlo", padre = self.wids['ventana'])
def seleccionar_campoesp(self, campos): ops = [(c.id, c.nombre) for c in campos] return utils.dialogo_combo('SELECCIONE CAMPO', 'Seleccione un campo al que camiar el valor o eliminar.\nSi desea cambiar el nombre del campo debe eliminarlo\ny crear uno nuevo con el nuevo nombre.\n', ops)
def crear_nuevo_albaran(self, widget): """ Función callback del botón b_nuevo. Pide los datos básicos para crear un nuevo objeto. Una vez insertado en la BD hay que hacerlo activo en la ventana para que puedan ser editados el resto de campos que no se hayan pedido aquí. """ albaran = self.objeto nuevo_numalbaran = \ pclases.AlbaranSalida.get_siguiente_numero_numalbaran_str() # Datos a pedir: numalbaran = utils.dialogo_entrada( titulo = "NÚMERO DE ALBARÁN", texto = 'Introduzca un número para el albarán.\nDeje' ' el número de albarán por defecto si no est' 'á seguro.', valor_por_defecto = nuevo_numalbaran, padre = self.wids['ventana']) if numalbaran == None: return # numero_numalbaran = utils.parse_numero(numalbaran) numero_numalbaran_usuario = utils.parse_numero(numalbaran, invertir = True) numero_numalbaran_sugerido = utils.parse_numero(nuevo_numalbaran, invertir = True) #if self.usuario != None and self.usuario.nivel > 1 and numero_numalbaran != None and numero_numalbaran > nuevo_numalbaran: if (self.usuario and self.usuario.nivel > 1 and numero_numalbaran_usuario != None and numero_numalbaran_usuario > numero_numalbaran_sugerido): utils.dialogo_info(titulo = "NÚMERO DE ALBARÁN INCORRECTO", texto = "No es estrictamente necesario que todos los albaranes sean consecutivos.\n\nSin embargo, no se aconseja crear albaranes con número superior al sugerido.\n\nSi considera que debe hacerlo, contacte con un usuario con mayor nivel de privilegios.", padre = self.wids['ventana']) return if albaran != None: albaran.notificador.desactivar() propia_empresa = pclases.Cliente.id_propia_empresa_cliente() almacenes = [(a.id, a.nombre) for a in pclases.Almacen.select( pclases.Almacen.q.activo == True, orderBy = "id")] almacenppal = pclases.Almacen.get_almacen_principal_id_or_none() almo = utils.dialogo_combo(titulo = "ALMACÉN ORIGEN", texto = "Seleccione el almacén origen de la mercancía", ops = almacenes, padre = self.wids['ventana'], valor_por_defecto = almacenppal) if not almo: # Cancelar return try: albaran = pclases.AlbaranSalida(numalbaran = numalbaran, transportista = None, clienteID = propia_empresa, bloqueado = False, facturable = False, motivo = "Es de consumo de repuestos", observaciones = "repuestos", destino = None, fecha = mx.DateTime.localtime(), almacenOrigenID = almo, almacenDestino = None) pclases.Auditoria.nuevo(albaran, self.usuario, __file__) utils.dialogo_info('ALBARÁN CREADO', 'El albarán %s ha sido creado.\nNo olvide asociar las salidas.' % albaran.numalbaran, padre = self.wids['ventana']) self.nuevo = True self.modificado = False except Exception, e: texto = "%salbaranes_de_salida::crear_nuevo_albaran -> Error al crear nuevo albarán. Excepción capturada: %s" % (self.usuario and self.usuario.usuario+": " or "", e) print texto self.logger.error(texto) utils.dialogo_info('ERROR: ALBARÁN NO CREADO', 'El albarán %s no ha sido creado.\nCompruebe que el número no esté siendo usado y vuelva a intentarlo.\n\n\n' % (numalbaran), padre = self.wids['ventana'])
def add_tvitem(self, boton): """ Añade una elemento al TreeView. """ tv_name = boton.name.replace("b_add_", "tv_") if tv_name == "tv_contactos": if not self.objeto.obra: self.objeto.obra = self.elegir_o_crear_obra() if self.objeto.obra: nombre = utils.dialogo_entrada( titulo = "NOMBRE DEL NUEVO CONTACTO", texto = "Introduzca el nombre (sin apellidos) del nuevo "\ "contacto.", padre = self.wids['ventana']) if not nombre: return # Canceló. contactos = self.objeto.cliente.get_contactos_obras() contactos = [c for c in contactos if nombre.upper().strip() in c.nombre] if contactos: ops = [(c.id, c.get_str_contacto()) for c in contactos] idcontacto = utils.dialogo_combo( titulo = "SELECCIONE CONTACTO", texto = "Si puede ver al contacto en la lista del \n"\ "desplegable inferior, selecciónelo.\n"\ "En otro caso, pulse en «Cancelar»", padre = self.wids['ventana'], ops = ops) if not idcontacto: contacto = pclases.Contacto(nombre = nombre, apellidos = "", cargo = "", telefono = "", fax = "", movil = "", correoe = "", web = "", observaciones = "") pclases.Auditoria.nuevo(contacto, self.usuario, __file__) else: contacto = pclases.Contacto.get(idcontacto) else: contacto = pclases.Contacto(nombre = nombre, apellidos = "", cargo = "", telefono = "", fax = "", movil = "", correoe = "", web = "", observaciones = "") pclases.Auditoria.nuevo(contacto, self.usuario, __file__) if contacto not in self.objeto.obra.contactos: contacto.addObra(self.objeto.obra) self.wids['e_obra'].set_text(self.objeto.obra and self.objeto.obra.nombre or "") self.tvcontactos.rellenar_tabla() else: try: estado = pclases.Estado.get(1) # *Debería* existir. except: estado = None clase, valores_defecto, params_relacion = { 'tv_anotaciones': (pclases.Nota, {"fechahora": mx.DateTime.localtime()}, {"facturaVenta": self.objeto}), 'tv_alertas': (pclases.Alarma, {"estado": estado, "fechahoraAlarma": mx.DateTime.localtime() + mx.DateTime.oneDay, "fechahora": mx.DateTime.localtime(), "objetoRelacionado": None}, {"facturaVenta": self.objeto}), 'tv_vencimientos': (pclases.VencimientoCobro, {"fecha": mx.DateTime.localtime()}, {"facturaVenta": self.objeto}), }[tv_name] params = {} for dicc in valores_defecto, params_relacion: for k in dicc: params[k] = dicc[k] objeto = clase(**params) # @UnusedVariable self.actualizar_ventana()