Esempio n. 1
0
 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()
Esempio n. 2
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)
Esempio n. 3
0
 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()))
Esempio n. 4
0
 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"],
             )
Esempio n. 5
0
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
Esempio n. 6
0
 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
Esempio n. 7
0
 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
Esempio n. 8
0
 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)
Esempio n. 9
0
 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()
Esempio n. 10
0
 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()
Esempio n. 11
0
 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'])
Esempio n. 12
0
 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)
Esempio n. 13
0
 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'])
Esempio n. 15
0
 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()