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] id = utils.dialogo_combo(titulo = "QUITAR FACTURA", texto = "Seleccione un vencimiento a eliminar del recibo.", padre = self.wids['ventana'], ops = ops) if id != None: vto = pclases.VencimientoCobro.get(id) 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 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 add_actividad(self, boton): texto = utils.dialogo_entrada(titulo = "NUEVA ACTIVIDAD", texto = "Introduzca la descripción de la nueva actividad deportiva:", padre = self.wids['ventana']) if texto != None: opciones = [(e.id, e.nombre) for e in pclases.Evento.select(orderBy = "nombre")] opciones.insert(0, (0, "Sin evento relacionado")) idevento = utils.dialogo_combo(titulo = "SELECCIONE EVENTO:", texto = "Seleccione un evento de la lista:", ops = opciones, padre = self.wids['ventana'], valor_por_defecto = 0) if idevento != None: if idevento == 0: evento = None else: evento = pclases.Evento.get(idevento) actividad = pclases.Actividad(descripcion = texto, evento = evento, fechahoraInicio = datetime.datetime.today(), fechahoraFin = datetime.datetime.today(), grupoAlumnos = self.objeto) model = self.wids['tv_actividades'].get_model() model.append((actividad.descripcion, actividad.evento and actividad.evento.nombre or "", utils.str_fechahora(actividad.fechahoraInicio), utils.str_fechahora(actividad.fechahoraFin), actividad.get_puid()))
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): ausencia = pclases.Ausencia( empleado=self.objeto, fecha=fecha + (mx.DateTime.oneDay * i), motivo=motivo ) self.actualizar_ventana() except ValueError: utils.dialogo_info( titulo="VALOR INCORRECTO", texto="Debe teclear un número. Vuelva a intentarlo", padre=self.wids["ventana"], )
def buscar_cliente(padre = None): """ Ventana de diálogo para seleccionar un cliente. """ clientes = [(c.id, c.nombre) for c in pclases.Cliente.select(orderBy='nombre') if not c.inhabilitado] idcliente = utils.dialogo_combo('SELECCIONE CLIENTE', 'Seleccione un cliente. Si no encuentra el cliente buscado, verifique\nque existe en la aplicación mediante la ventana de clientes.', clientes, padre = padre) return idcliente
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) obra.addCliente(self.objeto.cliente) elif idobra: obra = pclases.Obra.get(idobra) else: obra = None return obra
def elegir_cliente(self): idcliente = utils.dialogo_combo( titulo="SELECCIONE CLIENTE", texto="Seleccione un cliente del desplegable inferior:", padre=self.wids["ventana"], ops=[ (c.id, c.get_info()) for c in pclases.Cliente.select(pclases.Cliente.q.inhabilitado == False, orderBy="nombre") ], ) if idcliente: return pclases.Cliente.get(idcliente) else: return None
def crear_nuevo_pedido(self, widget): """ Asigna la linea sin pedido a un pedido a crear """ model, iter = self.wids['tv_tipos'].get_selection().get_selected() if iter != None: idtipo = model[iter][-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()) elif linea_sin_pedido.prefactura != None: pedido = pclases.PedidoVenta(cliente = linea_sin_pedido.prefactura.cliente, numpedido = numpedido, fecha = mx.DateTime.localtime()) elif linea_sin_pedido.albaranSalida != None: pedido = pclases.PedidoVenta(cliente = linea_sin_pedido.albaranSalida.cliente, numpedido = numpedido, fecha = mx.DateTime.localtime()) 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) 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='') self.rellenar_tabla() import pedidos_de_venta pedidos_de_venta.PedidosDeVenta(objeto = pedido, usuario = self.usuario)
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 numalbaran == None: return if albaran != None: albaran.notificador.set_func(lambda : None) almacenes = [(a.id, a.nombre) for a in pclases.Almacen.select(orderBy = "id")] almacenppal = pclases.Almacen.get_almacen_principal_id_or_none() if len(almacenes) > 1: 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) else: almo = almacenppal if not almo: # Cancelar return albaran = pclases.AlbaranEntrada(fecha = datetime.date.today(), numalbaran = numalbaran, proveedor = None, repuestos = False, almacenID = almo) 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 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.destroySelf() 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_contador(self, boton): """ Cambia un contador por otro en todos los clientes que lo tuvieran. """ model, iter = self.wids['tv_tipos'].get_selection().get_selected() if iter != None: idcontador = model[iter][-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 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 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. """ sys.path.append(os.path.join("..", "informes")) from geninformes import fax_transferencia from informes 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 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, 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 = "") else: contacto = pclases.Contacto.get(idcontacto) else: contacto = pclases.Contacto(nombre = nombre, apellidos = "", cargo = "", telefono = "", fax = "", movil = "", correoe = "", web = "", observaciones = "") 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, {}, {"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 dict in valores_defecto, params_relacion: for k in dict: params[k] = dict[k] objeto = clase(**params) self.actualizar_ventana()