Example #1
0
 def cell_func(column, cell, model, itr, numcol):
     """
     Si la fila corresponde a un parte de producción no verificado,
     lo colorea en rojo oscuro, si no, lo hace en verde oscuro.
     """
     consumido = model[itr][1]
     producido = model[itr][2]
     try:
         consumido = utils._float(consumido)
         producido = utils._float(producido)
         if consumido < producido:
             if numcol == 1:
                 color = "red"
             elif numcol == 2:
                 color = "blue"
         else:
             if numcol == 1:
                 color = "blue"
             else:
                 color = "red"
     except:
         color = None
     if consumido == 0 or producido == 0:
         color = None
         cell.set_property("cell-background", "red")
     else:
         cell.set_property("cell-background", None)
     cell.set_property("foreground", color)
Example #2
0
def importar_productos(nomarchivo, tarifas, tipos_de_material):
    """
    Importa los productos de compra.
    Devuelve un diccionario con los IDs del archivo y el objeto 
    ProductoCompra que le ha correspondido.
    """
    f = open(nomarchivo)
    #r = csv.reader(f)
    r = csv.reader(f, delimiter = ";", lineterminator = "\n")
    res = {}
    fila_actual = 0
    for producto in r:
        if fila_actual == 0:
            fila_actual += 1
            continue
        fila_actual += 1
        for i in xrange(len(producto)):
            c = producto[i]
            c = c.strip()
            #producto[i] = c.replace("\xd3", "Ó").replace("\xba", "º").replace("\xd1", "Ñ")
            producto[i] = c.replace("?", "").replace("%", "")
        #id, codigo, precio, descripcion, color, tamanno, cifproveedor, existencias, minimo, preciocosto, ganancia, tarifa1, tarifa2, tarifa3, ean13 = producto
        id, codigo, precio, descripcion, color, tamanno, cifproveedor, existencias, minimo, preciocosto, ganancia, tarifa1, tarifa2, tarifa3, ean13 = producto
        descripcion = " ".join((descripcion, color, tamanno))
        try:
            minimo = utils._float(minimo)
        except ValueError, msg:
            print "Excepción capturada: %s. Valor erróneo para mínimo: %s" % (msg, minimo)
            minimo = 0.0
        try:
            existencias = utils._float(existencias)
        except ValueError, msg:
            print "Excepción capturada: %s. Valor erróneo para existencias: %s" % (msg, existencias)
            existencias = 0.0
Example #3
0
def parsear_fraccion(txt):
    """
    Devuelve la cantidad de producto compra y unidad que hay que descontar 
    por cada cantidad de producto venta y unidad (que también se devuelven).
    Es necesario que venga la cantidadpc aunque en el registro, en el campo 
    "unidad" no aparece.
    """
    regexp_float = re.compile("-?\d+[\.,]?\d*")
    regexp_unidad = re.compile("\w+")
    cantidades = regexp_float.findall(txt)
    if len(cantidades) == 1:
        cantidadpc = cantidades[0]
        cantidadpv = '1'
        txt = txt.replace(cantidadpc, "")
    elif len(cantidades) == 2:
        cantidadpc, cantidadpv = cantidades[0:2]
        txt = txt.replace(cantidadpc, "")
        txt = txt.replace(cantidadpv, "")
    else:
        cantidadpc = '1'
        cantidadpv = '1'
    txt = txt.replace("/", "")
    unidadpc, unidadpv = regexp_unidad.findall(txt)[0:2]
    cantidadpc = utils._float(cantidadpc)
    cantidadpv = utils._float(cantidadpv)
    return cantidadpc, unidadpc, cantidadpv, unidadpv
 def rellenar_tabla(self, facturas):
     """
     Rellena el model con los facturas de la consulta.
     """
     from formularios.ventana_progreso import VentanaProgreso
     vpro = VentanaProgreso(padre = self.wids['ventana'])
     tot = facturas.count()
     vpro.mostrar()
     model = self.wids['tv_datos'].get_model()
     model.clear()
     total = 0.0
     rows_proveedor = {}
     total_facturado = 0.0
     for fra in facturas:
         vpro.set_valor(total / tot,
                        "Recuperando facturas... [%d/%d]" % (total, tot))
         total += 1
         proveedor = fra.proveedor
         importe = fra.calcular_importe_total()
         total_facturado += importe
         vencimientos = sum([vto.importe for vto in fra.vencimientosPago])
         pagado = sum([c.importe for c in fra.pagos])
         pendiente = importe - pagado
         try:
             row_proveedor = rows_proveedor[proveedor.puid]
         except KeyError:
             rows_proveedor[proveedor.puid] = row_proveedor = model.append(
                     None, (proveedor.nombre,
                            "",
                            "",
                            "0",
                            "0",
                            "0",
                            "0",
                            proveedor.puid))
         model.append(row_proveedor, ("",
                                      fra.numfactura,
                                      utils.str_fecha(fra.fecha),
                                      utils.float2str(importe),
                                      utils.float2str(vencimientos),
                                      utils.float2str(pagado),
                                      utils.float2str(pendiente),
                                      fra.puid))
         model[row_proveedor][3] = utils.float2str(
                 utils._float(model[row_proveedor][3]) + importe)
         model[row_proveedor][4] = utils.float2str(
                 utils._float(model[row_proveedor][4]) + vencimientos)
         model[row_proveedor][5] = utils.float2str(
                 utils._float(model[row_proveedor][5]) + pagado)
         model[row_proveedor][6] = utils.float2str(
                 utils._float(model[row_proveedor][6]) + pendiente)
     self.wids['e_facturas'].set_text(str(facturas.count()))
     self.wids['e_total'].set_text(utils.float2str(total_facturado))
     vpro.ocultar()
Example #5
0
def importar_ventas(nomarchivo):
    """
    Importa las ventas como tickets.
    Devuelve un diccionario de ID de venta y la LDV relacionada.
    """
    f = open(nomarchivo)
    r = csv.reader(f)
    res = {}
    fila_actual = 0
    for venta in r:
        if fila_actual == 0:
            fila_actual += 1
            continue
        fila_actual += 1
        for i in xrange(len(venta)):
            c = venta[i]
            c = c.strip()
            venta[i] = c.replace("\xd3", "Ó").replace("\xba", "º").replace("\xd1", "Ñ").replace("\xaa", "ª")
        id, numventa, codigo, precioventa, preciocosto, cantidad, bazzura, fecha, impuesto, descripcion = venta
        numventas = {}
        numventa = int(numventa)
        precio = utils._float(precioventa)
        cantidad = utils._float(cantidad)
        strfecha, strhora = fecha.split()
        dia, mes, anno = map(int, strfecha.split("/")); horas, minutos, segundos = map(int, strhora.split(":"))
        fecha = mx.DateTime.DateTimeFrom(day = dia, month = mes, year = anno, hour = horas, minute = minutos, second = segundos)
        if numventa not in numventas:
            numventas[numventa] = pclases.Ticket(fechahora = fecha, numticket = numventa)
        PC = pclases.ProductoCompra
        productos = PC.select(pclases.OR(pclases.AND(PC.q.codigo.contains(codigo), 
                                                     PC.q.descripcion.contains(descripcion[:5])), 
                                         pclases.AND(PC.q.descripcion.contains(codigo), 
                                                     PC.q.descripcion.contains(descripcion[:5]))))
        if productos.count() == 0:
            print "No se encontró el producto con código %s y descripción %s. Ticket %d. Me lo salto." % (codigo, descripcion, numventa)
        elif productos.count() > 1:
            print "Se econtró más de un producto con código %s y descripción %s. Ticket %d. Me lo salto." % (codigo, descripcion, numventa)
        else:
            producto = productos[0]
            ldv = pclases.LineaDeVenta(productoCompra = producto, 
                                       ticket = numventas[numventa], 
                                       pedidoVenta = None, 
                                       facturaVenta = None, 
                                       productoVenta = None, 
                                       albaranSalida = None, 
                                       fechahora = fecha, 
                                       cantidad = cantidad, 
                                       precio = precio, 
                                       descuento = 0.0)
            res[id] = ldv
    return res
Example #6
0
 def cambiar_peso(self, cell, path, texto):
     """
     Cambia el peso de la bala editada.
     """
     try:
         peso = utils._float(texto)
     except ValueError:
         utils.dialogo_info(titulo = "ERROR",
                            texto = "El valor tecleado %s no es correcto." % (peso),
                            padre = self.wids['ventana'])
     else:
         model = self.wids['tv_balas'].get_model()
         try:
             bala = pclases.BalaCable.get(model[path][-1])
         except:
             utils.dialogo_info(titulo = "ERROR",
                                texto = "No se pudo acceder a la bala.",
                                padre = self.wids['ventana'])
             self.actualizar_tabla()
         else:
             difpeso = bala.peso - peso
             bala.peso = peso
             bala.syncUpdate()
             model[path][2] = utils.float2str(bala.peso, 1)
             try:
                 totpantalla = utils.parse_float(
                     self.wids['e_pantalla'].get_text())
             except:
                 totpantalla = 0.0
             totpantalla -= difpeso
             self.rellenar_totales(totpantalla)
Example #7
0
 def cambiar_cantidad_envase(self, cell, path, text):
     """
     Cambia la cantidad de tarrinas contenidas en la configuración de 
     envase.
     """
     try:
         cantidad = int(utils._float(text))
     except (ValueError, TypeError):
         utils.dialogo_info(titulo = "ERROR DE FORMATO", 
                            texto = "El texto %s no es un número." % text, 
                            padre = self.wids['ventana'])
     else:
         model = self.wids['tv_empaquetado'].get_model()
         id = model[path][-1]
         try:
             empaquetado = pclases.Empaquetado.get(id)
         except:
             utils.dialogo_info(titulo = "ERROR EMPAQUIETADO", 
                                texto = "La configuración de empaquetado "
                                        "no existe. Recargue la ventana.", 
                                padre = self.wids['ventana'])
         else:
             empaquetado.cantidad = cantidad
             empaquetado.syncUpdate()
             model[path][1] = empaquetado.cantidad
             model[path][2] = utils.float2str(
                 empaquetado.calcular_capacidad_total())
Example #8
0
 def comparar_float(self, col):
     res = 0.0
     try:
         valor_ventana = self.wids[col].get_text()
     except KeyError:
         txt_error = "categorias_laborales.py: No se pudo obtener el valor de la ventana para %s." % col
         print txt_error
         self.logger.error(txt_error)
         valor_ventana = 0.0
     try:
         valor_ventana = utils._float(valor_ventana)
     except ValueError:
         txt_error = "categorias_laborales.py: No se pudo convertir %s (%s) a float." % (col, valor_ventana)
         print txt_error
         self.logger.error(txt_error)
         valor_ventana = 0.0
     try:
         valor_campo = self.objeto._SO_getValue(col)
         if not isinstance(valor_campo, type(0.0)):   # Porque es posible 
             # que el SOCol no contenga un float.
             # El SOCol es la clase base. Se asume flotante por eliminación.
             res = False
         else:
             res = valor_ventana == valor_campo
     except KeyError:
         txt_error = "categorias_laborales.py: No se pudo obtener el valor del objeto para %s." % col
         print txt_error
         self.logger.error(txt_error)
         valor_campo = 0.0
     return res
 def cambiar_cantidad_ldv(self, cell, path, text):
     try:
         nueva = utils._float(text)
     except:
         utils.dialogo_info(titulo = "ERROR DE FORMATO", 
                            texto = "El texto %s no es un número." % text, 
                            padre = self.wids['ventana'])
     else:
         model = self.wids['tv_ldvs'].get_model()
         idldv = model[path][-1]
         ldv = pclases.LineaDeVenta.get(idldv)
         vieja = ldv.cantidad
         diferencia = nueva - vieja
         producto = ldv.productoCompra
         producto.sync()
         #bak = producto.existencias
         #producto.existencias -= diferencia
         if (producto.get_existencias(self.objeto.almacenOrigen) 
                 - diferencia) < 0:
             utils.dialogo_info(titulo = "ERROR EXISTENCIAS", 
                                texto = "No hay existencias suficientes.", 
                                padre = self.wids['ventana'])
             #producto.existencias = bak
         else:
             producto.add_existencias(-diferencia, 
                                      self.objeto.almacenOrigen, 
                                      actualizar_global = True)
             #producto.syncUpdate()
             ldv.cantidad = nueva
             ldv.syncUpdate()
             model[path][2] = utils.float2str(ldv.cantidad)
Example #10
0
 def rellenar_tabla(self, cuentas):
 	"""
     Rellena el model con los items de la consulta.
     Elementos es un diccionario con objetos cuentaGastos y una lista  
     de gastos correspondientes a los meses de consulta.
     """        
 	model = self.wids['tv_datos'].get_model()
 	model.clear()
     total = 0
 	for cuenta in cuentas:
         padre = model.append(None, (cuenta.descripcion, 
                                     "", 
                                     "", 
                                     "", 
                                     "", 
                                     utils.float2str(0.0), 
                                     cuenta.id))
         for gasto in cuentas[cuenta]:
             model.append(padre, (gasto.codigo, 
                                  gasto.concepto, 
                                  utils.str_fecha(gasto.fecha), 
                                  gasto.facturaCompra
                                     and gasto.facturaCompra.numfactura
                                     or "", 
                                  gasto.parcela 
                                     and gasto.parcela.parcela 
                                     or "", 
                                  utils.float2str(gasto.importe), 
                                  gasto.id))
             model[padre][5] = utils.float2str(
                 utils._float(model[padre][5]) + gasto.importe)
             total += gasto.importe
     self.wids['e_total'].set_text("%s €" % utils.float2str(total))
Example #11
0
 def cambiar_concentracion(self, cell, path, texto):
     model = self.wids['tv_concentracion'].get_model()
     try:
         concentracion = utils._float(texto)
     except (ValueError, TypeError):
         utils.dialogo_info("ERROR EN FORMATO", 
                 "Introduzca la concentración como fracción de 1."
                 "\n(P. ej. 20% = 0.2)", 
                 padre = self.wids['ventana'])
     else:
         puid = model[path][-1]
         cr = pclases.getObjetoPUID(puid)
         #if (sum([c.concentracion 
         #        for c in self.objeto.concentracionesRemesa if c != cr])
         #    + concentracion) > 1.0:
         #    utils.dialogo_info(titulo = "EXCESO CONCENTRACIÓN", 
         #        texto = "La concentración total no puede superar el 100%."
         #                "\nSe corregirá.", 
         #        padre = self.wids['ventana'])
         #    concentracion = 1.0 - sum([c.concentracion 
         #        for c in self.objeto.concentracionesRemesa
         #        if c != cr])
         cr.concentracion = concentracion
         cr.syncUpdate()
         model[path][1] = utils.float2str(cr.concentracion)
Example #12
0
def parsear_porcentaje(txt):
    """
    Devuelve la cantidad del porcentaje como fracción de 1.
    """
    regexp_float = re.compile("^-?\d+[\.,]?\d*")
    num = regexp_float.findall(txt)[0]
    return utils._float(num) / 100
Example #13
0
 def guardar(self, widget):
     """
     Guarda el contenido de los entry y demás widgets de entrada
     de datos en el objeto y lo sincroniza con la BD.
     """
     # Desactivo el notificador momentáneamente
     self.objeto.notificador.desactivar()
     # Actualizo los datos del objeto
     adaptadores = self.adaptador.get_adaptadores()
     for col in adaptadores:
         if col.name ==  "comision":
             try:
                 self.objeto.comision = utils._float(self.wids['e_comision'].get_text())
             except ValueError:
                 self.objeto.comision = 0
                 self.wids['e_comision'].set_text('0')
             continue
         setattr(self.objeto, col.name, adaptadores[col]['leer']())
     # Fuerzo la actualización de la BD y no espero a que SQLObject 
     # lo haga por mí:
     self.objeto.syncUpdate()
     self.objeto.sync()
     # Vuelvo a activar el notificador
     self.objeto.notificador.activar(self.aviso_actualizacion)
     self.actualizar_ventana()
     self.wids['b_guardar'].set_sensitive(False)
Example #14
0
    def crear_servicio(self):
        # Datos a pedir: Concepto, descuento y precio... Bah, el descuento 
        # que lo cambie en el TreeView.
        concepto = utils.dialogo_entrada(titulo = "CONCEPTO",
                    texto = 'Introduzca el concepto del servicio facturable:', 
                    padre = self.wids['ventana'])
        if concepto != None:
            precio = utils.dialogo_entrada(titulo = "PRECIO", 
                    texto = 'Introduzca el precio unitario sin IVA:', 
                    padre = self.wids['ventana'])
            if precio != None:
                try:
                    precio = utils._float(precio)
                    servicio = pclases.Servicio(facturaVenta = self.objeto,
                                                concepto = concepto,
                                                precio = precio,
                                                descuento = 0)
                    # Cantidad es 1 por defecto.
                except Exception, e:
                    utils.dialogo_info(texto = """
                    Ocurrió un error al crear el servicio.                   
                    Asegúrese de haber introducido correctamente los datos,  
                    especialmente el precio (que no debe incluir símbolos    
                    monetarios), y vuelva a intentarlo.

                    DEBUG:
                    %s
                    """ %(e), 
                                       titulo = "ERROR", 
                                       padre = self.wids['ventana'])
                    return
                self.rellenar_servicios()
                self.rellenar_vencimientos()    
Example #15
0
 def add(self, w):
     if self.producto != None:
         fecha = self.wids['e_fecha'].get_text()
         if fecha == '':
             utils.dialogo_info(titulo = 'SIN FECHA',
                                texto = 'Debe introducir la fecha del resultado de la prueba.')
             return
         resultado1 = self.wids['e_resultado1'].get_text()
         if resultado1 == '':
             utils.dialogo_info(titulo = 'SIN RESULTADO',
                                texto = 'Debe introducir el resultado de la prueba en resultado1.', 
                                padre = self.wids['ventana'])
             return
         resultado2 = self.wids['e_resultado2'].get_text()
         try:
             mfi = utils._float(self.wids['e_mfi'].get_text())
         except:
             utils.dialogo_info(titulo = "MFI INCORRECTO", 
                 texto = "No ha introducido un valor correcto para el MFI del proveedor.", 
                 padre = self.wids['ventana'])
             return
         try:
             resultado = float(resultado1)
             prueba = pclases.PruebaGranza(fecha = utils.parse_fecha(fecha),
                                                      resultado = resultado,
                                             productoCompra = self.producto, 
                                     fechaEntrada = mx.DateTime.localtime(), 
                                      silo = self.wids['e_silo'].get_text(), 
                                      lote = self.wids['e_lote'].get_text(), 
                                                                  mfi = mfi)
             pclases.Auditoria.nuevo(prueba, self.usuario, __file__)
             if resultado2:
                 try:
                     resultado = float(resultado2)
                     prueba = pclases.PruebaGranza(
                         fecha = utils.parse_fecha(fecha),
                         resultado = resultado,
                         productoCompra = self.producto, 
                         fechaEntrada = mx.DateTime.localtime(), 
                         silo = self.wids['e_silo'].get_text(), 
                         lote = self.wids['e_lote'].get_text(),
                         mfi = mfi)
                     pclases.Auditoria.nuevo(prueba, self.usuario, __file__)
                 except Exception, msg:
                     utils.dialogo_info(titulo = 'ERROR', 
                                        texto = 'Verifique que ha introducido los datos correctamente.\n\n\nInformación de depuración: %s' % (msg), 
                                        padre = self.wids['ventana'])
         except Exception, msg:
             utils.dialogo_info(titulo = 'ERROR', 
                                texto = 'Verifique que ha introducido los datos correctamente.\n\n\nInformación de depuración: %s' % (msg), 
                                padre = self.wids['ventana'])
         self.wids['e_fecha'].set_text(utils.str_fecha(time.localtime()))
         self.wids['e_resultado1'].set_text('')
         self.wids['e_resultado2'].set_text('')
         self.wids['e_lote'].set_text('')
         self.wids['e_silo'].set_text('')
         self.wids['e_mfi'].set_text('0')
         self.rellenar_pruebas()
 def rellenar_tabla_por_provincia(self, vpro):
     """
     Rellena el model de la lista de ofertas clasificada por comercial. 
     Recibe la ventana de progreso.
     """ 
     model = self.wids['tv_provincia'].get_model()
     model.clear()
     tot = sum([len(self.por_producto[k]) 
                for k in self.por_producto.keys()])
     i = 0.0
     try:
         vpro.set_valor(i/tot, "Mostrando ofertas por provincia...")
     except ZeroDivisionError:
         return  # No hay ofertas que mostrar
     padres = {}
     for provincia in self.por_provincia:
         for presupuesto in self.por_provincia[provincia]: 
             vpro.set_valor(i/tot, "Mostrando ofertas por provincia... (%d)" 
                                                     % presupuesto.id)
             try:
                 padre = padres[provincia]
             except KeyError:
                 padre = padres[provincia] = model.append(None, 
                         (provincia, 
                          "", 
                          "", 
                          "", 
                          "0.0", 
                          None))
             importe = presupuesto.calcular_importe_total()
             try:
                 comercial = presupuesto.comercial
                 nombre_comercial = comercial.get_nombre_completo()
             except AttributeError:
                 nombre_comercial = "Sin comercial relacionado"
             fila = ("Presupuesto %d" % presupuesto.id, 
                     nombre_comercial, 
                     presupuesto.cliente and presupuesto.cliente.nombre 
                         or presupuesto.nombrecliente,
                     presupuesto.formaDePago 
                         and presupuesto.formaDePago.toString(
                             presupuesto.cliente) or "", 
                     utils.float2str(importe), 
                     presupuesto.puid)
             model.append(padre, fila)
             # Actualizo totales fila padre.
             model[padre][4] = utils.float2str(
                     utils._float(model[padre][4]) + importe)
             if nombre_comercial not in model[padre][1]:
                 if not model[padre][1]:
                     model[padre][1] = nombre_comercial
                 else:
                     model[padre][1] += "; " + nombre_comercial
             i += 1
     # Y ahora la gráfica.
     if self.wids['notebook1'].get_current_page() == 4:
         self.graficar_por_provincia()
Example #17
0
 def cambiar_resultado(self, tv, path, texto, columna):
     texto = texto.replace(" ", "")
     if texto != "":
         try:
             resultado = utils._float(texto)
         except:
             utils.dialogo_info('RESULTADO INCORRECTO',
                                'El número tecleado (%s) no es correcto.' % (texto), 
                                padre = self.wids['ventana'])
             return
     clase = self.get_clase(columna)
     columnaid = columna-1    # Porque en los IDS empieza por 0
     if clase != None:
         model = self.wids['tv_pruebas'].get_model()
         ids = map(int, model[path][-1].split(','))
         ide = ids[columnaid]
         if ide == 0:
             if texto != "":
                 fecha = time.strptime(model[path][0], '%d/%m/%Y')
                 fecha = mx.DateTime.DateFrom(fecha.tm_year, 
                                              fecha.tm_mon, 
                                              fecha.tm_mday)
                 try: 
                     prueba = clase(fecha = fecha, 
                                    resultado = resultado,
                                    loteCem = self.loteCem, 
                                    lote = None)
                 except TypeError:   # Es prueba de Humedad, no lleva relación con lote de fibra:
                     prueba = clase(fecha = fecha, 
                                    resultado = resultado,
                                    loteCem = self.loteCem)
                 ids[columnaid] = prueba.id
                 model[path][-1] = ','.join(map(str, ids))
                 model[path][columna] = "%.2f" % resultado
         else:
             prueba = clase.get(int(ide))
             if texto == "": 
                 try:
                     prueba.destroy(ventana = __file__)
                 except:
                     utils.dialogo_info(titulo = "ERROR", 
                                        texto = "El resultado no se pudo eliminar.", 
                                        padre = self.wids['ventana'])
                     return
                 model[path][columna] = ""
                 ids[columnaid] = 0 
                 model[path][-1] = ','.join(map(str, ids))
                 self.rellenar_pruebas() # Prefiero esto a comprobar si la fila se ha quedado vacía, etc...
             else:
                 prueba.resultado = resultado
                 if columna != 6:
                     model[path][columna] = "%.2f" % resultado
                 else:
                     model[path][columna] = "%d" % resultado
         self.calcular_caracteristicas()
Example #18
0
def editar_float_tv(w, clase, campo, text, path, col):
    try:
        numero = utils._float(text)
    except (ValueError, TypeError):
        utils.dialogo_info(titulo = "ERROR DE FORMATO", 
                           texto = "El texto %s no es un número." % text) 
    else:
        model = w.get_model()
        o = clase.get(model[path][-1])
        setattr(o, campo, numero)
        model[path][col] = utils.float2str(getattr(o, campo))
 def graficar_por_producto(self):
     datachart = []
     model = self.wids['tv_producto'].get_model()
     try:
         maximo_producto = max([utils._float(f[1]) for f in model])
     except ValueError:  # empty sequence
         maximo_producto = 0
     for fila in model:
         if utils._float(fila[1]) == maximo_producto:
             color = 0
         if (fila[-1] == None or isinstance(pclases.getObjetoPUID(fila[-1]),
                                            pclases.Servicio)):
                 # Productos que no están dados de alta, no 
                 # tengo el puid de producto o es servicio.
             color = 7
         else:
             color = 3
         nombre_corto = fila[0].replace("GEOTESAN", "")  # OJO: HARCODED
         datachart.append([nombre_corto, utils._float(fila[1]), color])
     # Filtro y me quedo con el TOP5:
     datachart.sort(lambda c1, c2: int(c2[1] - c1[1]))
     _datachart = datachart[:5]
     _datachart.append(("Resto", sum([c[1] for c in datachart[5:]]), 7))
     datachart = _datachart
     try:
         oldchart = self.wids['eventbox_chart'].get_child()
         if oldchart != None:
             self.wids['eventbox_chart'].remove(oldchart)
             #chart = oldchart
         #else:
         chart = charting.Chart(orient = "vertical", 
                                    values_on_bars = True)
         self.wids['eventbox_chart'].add(chart)
         chart.plot(datachart)
         self.wids['eventbox_chart'].show_all()
     except Exception, msg:
         txt = "consulta_ofertas_estudio.py::graficar_por_producto -> "\
               "Error al dibujar gráfica (charting): %s" % msg
         print txt
         self.logger.error(txt)
 def rellenar_tabla_por_cliente(self, vpro):
     """
     Rellena el model de la lista de ofertas clasificada por cliente. 
     Recibe la ventana de progreso.
     """ 
     model = self.wids['tv_cliente'].get_model()
     model.clear()
     tot = sum([len(self.por_producto[k]) 
                for k in self.por_producto.keys()])
     i = 0.0
     try:
         vpro.set_valor(i/tot, "Mostrando ofertas por cliente...")
     except ZeroDivisionError:
         return  # No hay ofertas que mostrar.
     padres = {}
     for cliente in self.por_cliente:
         for presupuesto in self.por_cliente[cliente]: 
             vpro.set_valor(i/tot, "Mostrando ofertas por cliente... (%d)" 
                                                     % presupuesto.id)
             try:
                 padre = padres[cliente]
             except KeyError:
                 try:
                     nombre_cliente = cliente.descripcion
                     cif = cliente.cif
                     puid = cliente.puid
                 except AttributeError:
                     nombre_cliente = presupuesto.nombrecliente 
                     cif = presupuesto.cif
                     puid = None
                 padre = padres[cliente] = model.append(None, 
                         (nombre_cliente, 
                          cif, 
                          "0.0", 
                          "", 
                          puid))
             importe = presupuesto.calcular_importe_total()
             fila = ("Presupuesto %d" % presupuesto.id, 
                     utils.str_fecha(presupuesto.fecha),
                     utils.float2str(importe), 
                     presupuesto.formaDePago 
                         and presupuesto.formaDePago.toString(
                             presupuesto.cliente) or "", 
                     presupuesto.puid)
             model.append(padre, fila)
             # Actualizo totales fila padre.
             model[padre][2] = utils.float2str(
                     utils._float(model[padre][2]) + importe)
             i += 1
     # Y ahora la gráfica.
     if self.wids['notebook1'].get_current_page() == 2:
         self.graficar_por_cliente()
Example #21
0
 def get_float_tv(self, path, texto, col):
     model = self.wids['tv_nominas'].get_model()
     idnomina = model[path][-1]
     nomina = pclases.Nomina.get(idnomina)
     try:
         valor = utils._float(texto)
         model[path][col] = utils.float2str(valor, 3, autodec = True)
     except ValueError:
         utils.dialogo_info(titulo = "VALOR INCORRECTO", 
                            texto = "El valor introducido no es correcto.", 
                            padre = self.wids['ventana'])
         valor = None
     return nomina, valor
Example #22
0
 def add_concepto(self, b):
     """
     Añade un detalle a un precio.
     Si se han marcado varias filas, añade el mismo concepto a todos 
     los precios marcados.
     """
     sel = self.wids['tv_productos'].get_selection()
     model, paths = sel.get_selected_rows()
     ids = []
     tratados = []
     while paths:
         path = paths.pop()
         tratados.append(path)
         tipo, id = model[path][-1].split(":")
         if tipo == "PV":
             paths += [hijo.path for hijo in model[path].iterchildren()
                       if hijo.path not in tratados]
         elif tipo == "C":
             #pathpadre = model[path].parent.path
             #if pathpadre not in tratados:
             #    paths.append(pathpadre)
             id = pclases.Concepto.get(int(id)).precioID
             if not id in ids:
                 ids.append(id)
         elif tipo == "P":
             id = int(id)
             if id not in ids:
                 ids.append(id)
     if ids:
         concepto = utils.dialogo_entrada(titulo = "CONCEPTO", 
                                          texto = "Introduzca detalle:", 
                                          padre = self.wids['ventana'])
         if concepto:
             precio = utils.dialogo_entrada(titulo = "IMPORTE", 
                                            texto = "Importe del detalle:", 
                                            padre = self.wids['ventana'])
             if precio:
                 try:
                     precio = utils._float(precio)
                 except (ValueError, TypeError):
                     utils.dialogo_info(titulo = "ERROR DE FORMATO", 
                         texto = "El texto %s no es un número." % precio, 
                         padre = self.wids['ventana'])
                 else:
                     for id in ids:
                         pre = pclases.Precio.get(id)
                         con = pclases.Concepto(importe = precio, 
                                                concepto = concepto, 
                                                precio = pre)
                         pre.tarifa.add_conceptoLdv_a_ldvs(con)
                     self.rellenar_tabla_precios()
Example #23
0
 def cambiar_importe_cobro(self, cell, path, texto):
     model = self.wids['tv_cobros'].get_model()
     id = model[path][-1]
     cobro = pclases.Cobro.get(id)
     try:
         importe = utils._float(texto)
     except:
         utils.dialogo_info(titulo = "ERROR DE FORMATO", 
                            texto = "El texto %s no es un importe válido."%(
                             texto), 
                            padre = self.wids['ventana'])
     else:
         cobro.importe = importe
         self.rellenar_vencimientos()
Example #24
0
 def cambiar_precio_srv(self, cell, path, texto):
     model = self.wids['tv_servicios'].get_model()
     idsrv = model[path][-1]
     srv = pclases.Servicio.get(idsrv)
     try:
         srv.precio = utils._float(texto)
         # print srv.precio, utils._float(texto), texto
         self.rellenar_servicios()
         self.rellenar_vencimientos()
             # Para que verifique si los totales coinciden
     except:
         utils.dialogo_info(titulo = "ERROR DE FORMATO", 
                            texto = 'Formato numérico incorrecto', 
                            padre = self.wids['ventana'])
 def graficar_por_cliente(self):
     datachart = []
     model = self.wids['tv_cliente'].get_model()
     try:
         maximo_cliente = max([utils._float(f[2]) 
                               for f in model]) # if f[0]!="Sin cliente"])
     except ValueError:  # empty sequence
         maximo_cliente = 0
     for fila in model:
         if fila[0] == None:     # Cliente no dado de alta. No tiene PUID.
             color = 7
         elif utils._float(fila[2]) == maximo_cliente:
             color = 0
         else:
             color = 3
         datachart.append([fila[0], utils._float(fila[2]), color])
     # Filtro y me quedo con el TOP5:
     datachart.sort(lambda c1, c2: int(c2[1] - c1[1]))
     _datachart = datachart[:5]
     _datachart.append(("Resto", sum([c[1] for c in datachart[5:]]), 7))
     datachart = _datachart
     try:
         oldchart = self.wids['eventbox_chart'].get_child()
         if oldchart != None:
             self.wids['eventbox_chart'].remove(oldchart)
             #chart = oldchart
         #else:
         chart = charting.Chart(orient = "horizontal", 
                                    values_on_bars = True)
         self.wids['eventbox_chart'].add(chart)
         chart.plot(datachart)
         self.wids['eventbox_chart'].show_all()
     except Exception, msg:
         txt = "consulta_ofertas_estudio.py::graficar_por_cliente -> "\
               "Error al dibujar gráfica (charting): %s" % msg
         print txt
         self.logger.error(txt)
Example #26
0
 def pedir_cantidad(self):
     """
     Pide una cantidad que debe ser un número float.
     """
     res = utils.dialogo_entrada(titulo = "CANTIDAD", 
                                 texto = "Introduzca la cantidad a consumir del producto de compra (sin unidades):", 
                                 padre = self.wids['ventana'])
     try:
         res = utils._float(res)
     except ValueError:
         utils.dialogo_info(titulo = "CANTIDAD INCORRECTA", 
                            texto = "El texto introducido %s no es correcto." % (res), 
                            padre = self.wids['ventana'])
         res = None
     return res
Example #27
0
 def cambiar_precio_minimo(self, cell, path, texto):
     if texto.strip() == "":
         precio = None
     else:
         try:
             precio = utils._float(texto)
         except:
             return
     model = self.wids['tv_precio_minimo'].get_model()
     ldp = pclases.getObjetoPUID(model[path][-1])
     antes = ldp.precioMinimo
     ldp.precioMinimo = precio
     pclases.Auditoria.modificado(ldp, self.usuario, __file__, 
         "Precio mínimo de %s cambiado de %s a %s" % (
             ldp.nombre, antes, ldp.precioMinimo))
     self.rellenar_precio_minimo()
Example #28
0
 def cambiar_precio(self, cell, path, texto):
     model = self.wids['tv_ldvs'].get_model()
     idldv = model[path][-1]
     ldv = pclases.LineaDeVenta.get(idldv)
     try:
         ldv.precio = utils._float(texto)
         ldv.syncUpdate()
         model[path][2] = ldv.precio
         model[path][3] = ldv.calcular_importe(iva = False)
         self.rellenar_totales()
         self.rellenar_vencimientos()
             # Para que verifique si los totales coinciden
     except:
         utils.dialogo_info(titulo = "ERROR DE FORMATO", 
                            texto = 'Formato numérico incorrecto', 
                            padre = self.wids['ventana'])
Example #29
0
 def cambiar_cantidad_srv(self, cell, path, texto):
     model = self.wids['tv_servicios'].get_model()
     idsrv = model[path][-1]
     srv = pclases.Servicio.get(idsrv)
     try:
         srv.cantidad = utils._float(texto)
         srv.syncUpdate()
         # self.rellenar_servicios()
         model[path][0] = srv.cantidad
         model[path][4] = srv.precio * (1.0 - srv.descuento) * srv.cantidad
         self.rellenar_totales()
         self.rellenar_vencimientos()    
             # Para que verifique si los totales coinciden
     except:
         utils.dialogo_info(titulo = "ERROR DE FORMATO", 
                            texto = 'Formato numérico incorrecto', 
                            padre = self.wids['ventana'])
Example #30
0
 def cambiar_cantidad(self, cell, path, texto):
     """
     Cambia la cantidad del descuento adicional por producto.
     """
     try:
         cantidad = utils._float(texto)
     except ValueError:
         utils.dialogo_info(titulo = "FORMATO INCORRECTO", 
                            texto = "El texto %s no es válido." % (texto), 
                            padre = self.wids['ventana'])
         return
     model = self.wids['tv_consumos'].get_model()
     if model[path].parent == None:
         idconsumo = model[path][-1]
         consumo = pclases.ConsumoAdicional.get(idconsumo)
         consumo.cantidad = cantidad
     self.rellenar_consumos_adicionales_por_producto()