Ejemplo n.º 1
0
 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()
Ejemplo n.º 3
0
 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'])
Ejemplo n.º 4
0
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
Ejemplo n.º 5
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]
         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()
Ejemplo n.º 6
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.
     """
     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)
Ejemplo n.º 7
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)
         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)
Ejemplo n.º 8
0
 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()
Ejemplo n.º 10
0
 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()
Ejemplo n.º 11
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)
         pclases.Auditoria.nuevo(obra, self.usuario, __file__)
         obra.addCliente(self.objeto.cliente)
     elif idobra:
         obra = pclases.Obra.get(idobra)
     else:
         obra = None
     return obra
Ejemplo n.º 12
0
 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)
Ejemplo n.º 13
0
 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()
Ejemplo n.º 14
0
 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()
Ejemplo n.º 15
0
 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'])
Ejemplo n.º 16
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.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()
Ejemplo n.º 17
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)
Ejemplo n.º 18
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):
                 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)
Ejemplo n.º 20
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
     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']) 
Ejemplo n.º 21
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 = "")
                     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()