def modificaIngreso(id):
    
    if request.method == 'GET':

        registro = consulta('SELECT fecha, concepto, cantidad, id FROM movimientos where id = ?', (id,))[0] 
        registro['fecha'] = date.fromisoformat(registro['fecha'])
        form = MovementForm(data=registro)

        return render_template("modifica.html", form=form, id=id)


    else:
        form = MovementForm()
        if form.validate():
            consulta('UPDATE movimientos SET fecha = ?, concepto= ?, cantidad = ? WHERE id = ?',
                    (request.form.get('fecha'),
                    request.form.get('concepto'),
                    float(request.form.get('cantidad')),
                    id
                    )
            )

            return redirect(url_for("listaIngresos"))
        else:
            return render_template("modifica.html", form=form, id=id)
Exemple #2
0
def nuevoIngreso():

    form = MovementForm(request.form)

    if request.method == 'POST':

        cantidad = request.form.get('cantidad')
        try:
            cantidad = float(cantidad)
        except ValueError:
            msgError = 'Cantidad debe ser numérica'
            return render_template('alta.html', errores=msgError)

        if form.validate():

            consulta(
                'INSERT INTO movements (cantidad, concepto, fecha) VALUES (?, ?, ?);',
                (form.cantidad.data, form.concepto.data, form.fecha.data))

            return redirect(url_for('lista_ingresos'))

        else:
            return render_template('alta.html', form=form)

    return render_template('alta.html', form=form)
Exemple #3
0
def nuevoIngreso():

    form = MovementForm()
    
    if request.method == 'POST':

        if form.validate():
            if float(form.cantidad.data) > 0:
                form.tipo.data = "Ingreso"
                consulta('INSERT INTO movimientos (tipo, cantidad, concepto, fecha) VALUES (?, ?, ? ,? );', 
                        (   
                            form.tipo.data,
                            form.cantidad.data,
                            form.concepto.data,
                            form.fecha.data
                        )
                    )
                return redirect(url_for('listaIngresos'))
            elif float(form.cantidad.data) < 0:
                form.tipo.data = "Gasto"
                consulta('INSERT INTO movimientos (tipo, cantidad, concepto, fecha) VALUES (?, ?, ? ,? );', 
                        (   
                            form.tipo.data,
                            form.cantidad.data,
                            form.concepto.data,
                            form.fecha.data
                        )
                    )
                return redirect(url_for('listaIngresos'))
        else:
            return render_template("alta.html", form=form)
    return render_template("alta.html", form=form)
Exemple #4
0
def nuevaCompra():

    form = MovementForm() 
    mensajes = []
    try:
        moneda_saldo = monedas_activas()   
        form.from_currency.choices=moneda_saldo      
        saldo_total = moneda_saldo_total()
    
    except Exception as e:
        print("**ERROR**🔧: Acceso a base de datos:{} - {}".format(type(e).__name__, e))
        mensajes.append("Error en acceso a base de datos. Consulte con el administrador.")

        return render_template("purchase.html", form = form, vacio = True,mensajes=mensajes)

    if request.method == 'POST' and form.validate(): 
        if form.calculadora.data == True:
            try:
                amount = form.from_cantidad.data 
                symbol = form.from_currency.data
                convert = form.to_currency.data
                respuesta = peticion(url_coin.format(amount, symbol, convert, API_KEY))
                cantidad_coin = respuesta['data']['quote'][convert]['price']

                pu = float(amount) / float(cantidad_coin)

                api_coin = [amount, symbol, convert, cantidad_coin,pu]
                return render_template("purchase.html", form = form, api_coin = api_coin, vacio = False)
            except Exception as e:
                print("**ERROR**🔧: Acceso a API - insert: {} - {}". format(type(e).__name__, e))
                mensajes.append("Error en acceso a API. Consulte con el administrador.")
                return render_template("purchase.html", form = form, mensajes = mensajes, vacio = True)
        else:
            try:       
                consulta('INSERT INTO movimientos (date, time, from_currency, form_quantity,to_currency, to_quantity, precio) VALUES (?, ?, ? , ? , ? , ?, ?);',       
                                (
                                    today_2,
                                    time,
                                    form.from_currency.data,
                                    float(form.from_cantidad.data),
                                    form.to_currency.data,
                                    float(form.to_cantidad.data), 
                                    float(form.precio_unitario.data)
                                )) 
                return redirect(url_for('listaIngresos'))
            except Exception as e:
                print("**ERROR**🔧: Acceso a base de datos - insert: {} - {}". format(type(e).__name__, e))
                mensajes.append("Error en acceso a base de datos. Consulte con el administrador.")

    else:
        return render_template("purchase.html", form = form, vacio = True, mensajes = mensajes)
def listaIngresos():
    form = MovementForm()

    try:
        result = make_query(
            "SELECT date, time , from_currency, from_quantity, to_currency, to_quantity, PU FROM movimientos;"
        ) or []
        print(result)
        ingresos = result.fetchall()
        result.close()
    except Exception as e:
        print(
            f"no ha podido realizar la consulta a la base de datos {type(e).__name__} - {e}"
        )
        messages.append(
            "lo siento, no se hemos podido conectar con la base de datos")
        return render_template("errores.html",
                               datos=[],
                               form=form,
                               messages=messages)

    return render_template("movements.html",
                           datos=ingresos,
                           form=form,
                           messages=messages)
Exemple #6
0
def eliminaIngreso(id):
    
    if request.method == 'GET':

        registro = consulta('SELECT fecha, concepto, cantidad, id FROM movimientos where id = ?', (id,))[0] 
        registro['fecha'] = date.fromisoformat(registro['fecha'])
        form = MovementForm(data=registro)

        return render_template("elimina.html", form=form, id=id)

    else:
        form = MovementForm()
        if form.validate():
            consulta('DELETE FROM movimientos WHERE id = ?', (id,))
            return redirect(url_for("listaIngresos"))
        else:
            return render_template("elimina.html", form=form, id=id)
Exemple #7
0
def nuevoIngreso():

    form = MovementForm()

    if request.method == 'POST':
        # iNSERT INTO movimientos (cantidad, concepto, fecha) VALUES (1500, "Paga extra", "2020-12-16" )

        if form.validate():
            consulta(
                'INSERT INTO movimientos (cantidad, concepto, fecha) VALUES (?, ? ,? );',
                (form.cantidad.data, form.concepto.data, form.fecha.data))

            return redirect(url_for('listaIngresos'))
        else:
            return render_template("alta.html", form=form)

    return render_template("alta.html", form=form)
Exemple #8
0
def listaIngresos():
    
    form = MovementForm()
    mensajes = []
    
    try:
        ingresos = consulta('SELECT date, time, from_currency, form_quantity, to_currency, to_quantity, precio FROM movimientos;')
    except Exception as e:
        print("**ERROR**🔧: Acceso a base de datos:{} - {}".format(type(e).__name__, e))
        mensajes.append("Error en acceso a base de datos. Consulte con el administrador.")

        return render_template('movimientos.html', form=form, movimientos=[], mensajes=mensajes)
    
    return render_template("movimientos.html", datos=ingresos, form = form)
Exemple #9
0
def compraCrypto():
    listaCrypto = ()
    mensajes.clear()

    try:
        form = MovementForm()
        listaCrypto = cargaMonedasDisponibles(form.from_currency)

        if request.method == "POST":

            #Si se pulsa Aceptar se esta confirmando la compra, por lo que no hace falta pasar la validaci贸n del formulario
            if form.submit.data:
                now = datetime.now()
                fecha = now.strftime('%Y-%m-%d')
                hora = now.strftime("%H:%M:%S")
                #Recuperamos los valores de pantalla de confirmacion
                monedaOrigen = form.monedaOrigen.data
                monedaDestino = form.monedaDestino.data
                importeOrigen = form.importeOrigen.data
                importeDestino = form.importeDestino.data
                queries.insertaCompra(
                    (fecha, hora, monedaOrigen, importeOrigen, monedaDestino,
                     importeDestino))
                return redirect(url_for("movimientosCrypto"))

            elif form.validate():

                if form.calc.data:
                    monedaActual = "EUR"
                    #Reseteamos los campos de la ventana de confirmacion
                    form.monedaOrigen.data = form.monedaDestino.data = form.importeOrigen.data = form.importeDestino.data = form.precio_unitario.data = ""
                    #validamos que tenemos importe suficiente para convertir en la moneda seleccionada (EUR ilimitados)
                    monedaActual = form.from_currency.data
                    if (monedaActual != 'EUR'):
                        saldoMonedaActual = float(request.form[monedaActual])
                        if form.from_quantity.data > saldoMonedaActual:
                            form.from_quantity.errors.append(
                                "no hay saldo suficiente de la moneda seleccionada: %d%s"
                                % (saldoMonedaActual, monedaActual))
                            raise Exception("Error por saldo insuficiente")

                    #Consultamos el precio unitario de la crypto llamando a la API
                    precioUnitario = getPrecioUnitarioCrypto(
                        (1, monedaActual, form.to_currency.data))
                    form.precio_unitario.data = precioUnitario
                    if precioUnitario > 0:
                        #Calculamos el importe en la nueva moneda
                        form.to_quantity.data = form.from_quantity.data * precioUnitario
                        #Asignamos los valores a los hidden
                        form.monedaOrigen.data = form.from_currency.data
                        form.monedaDestino.data = form.to_currency.data
                        form.importeOrigen.data = form.from_quantity.data
                        form.importeDestino.data = form.to_quantity.data
                        form.precioUnitario.data = form.precio_unitario.data

            return render_template("compra.html",
                                   form=form,
                                   cryptosDisponibles=listaCrypto)

        else:
            return render_template("compra.html",
                                   form=form,
                                   cryptosDisponibles=listaCrypto)

    except sqlite3.Error as e:
        print("**ERROR**馃敡: Acceso a base de datos: {} - {}".format(
            type(e).__name__, e))
        mensajes.append(
            "Error en acceso a base de datos. Consulte con el administrador.")
        return render_template("compra.html",
                               form=form,
                               cryptosDisponibles=listaCrypto,
                               mensajes=mensajes)
    except PeticionError as e:
        print("**ERROR**馃敡: Acceso a la APi de conexi贸n: {} - {}".format(
            type(e).__name__, e))
        mensajes.append(
            "Error en acceso a la API de conexi贸n. Consulte con el administrador."
        )
        return render_template("compra.html",
                               form=form,
                               cryptosDisponibles=listaCrypto,
                               mensajes=mensajes)
    except Exception as e:
        print(
            "Error en la conexion al ejecutar la operaci贸n :  {} - {}".format(
                type(e).__name__, e))
        mensajes.append("Ha habido un error. Consulte con el administrador.")
        return render_template("compra.html",
                               form=form,
                               cryptosDisponibles=listaCrypto,
                               mensajes=mensajes)
Exemple #10
0
def purchase():
    # 1) Formulario vacío:
    if request.method == 'GET':
        form_vacio = MovementForm()
        try:
            monedero = calc_monedero()
        except Exception as e:
            print("**ERROR**: Acceso base de datos - {}".format(type(e).__name__))
            mensaje = "Error en acceso a la base de datos. Consulte con el administrador."
            return render_template('movementsList.html', error=mensaje)
        
        lista_from = ['EUR'] # crear una lista de monedas disponibles para FROM: EUR + las que tengan cantidad > 0 en mi monedero
        
        try:
            for moneda, q in monedero.items():
                if q>0:
                    lista_from.append(moneda)
            form_vacio.from_currency.choices = lista_from # choices necesita una lista
        except:
            monedero = 'vacio'
            form_vacio.from_currency.choices = lista_from
        
        return render_template('purchase.html', form=form_vacio, vacio='yes', monedero=monedero)
    
    else: #2) request.method == 'POST': Grabar o Calcular
        form = MovementForm()
        form.from_currency.choices = [request.form.get('from_currency')] # bloqueamos la lista FROM con  la moneda elegida
        form.to_currency.choices = [request.form.get('to_currency')] # bloqueamos la lista TO con  la moneda elegida
        monedero = calc_monedero()
        
        if  request.form.get('submit') == 'Grabar' and form.validate():
            try: 
                query = "INSERT INTO movements (date, time, from_currency, from_quantity, to_currency, to_quantity) VALUES (?,?,?,?,?,?);"
                consulta(query, (request.form.get("date"), request.form.get("time"), request.form.get("from_currency"),
                                request.form.get("from_quantity"), request.form.get("to_currency"), request.form.get("to_quantity")))
                
                return redirect(url_for('listaMovimientos'))
            except:
                error = "Error: Debe efectuar el cálculo (botón calculadora) antes de validar la compra."
                return render_template('purchase.html', form=form, vacio='yes', error=error, monedero=monedero)
        else:
            amount = request.form.get('from_quantity') # x "simbolo" convierte a "convert"
            simbolo = request.form.get('from_currency') 
            convert = request.form.get('to_currency')
            
            #3) Errores en la conversión de monedas:
            error = validarConversion(amount, simbolo, convert)
            if error != None:
                return render_template('purchase.html', form=form, vacio='yes', error=error, monedero=monedero)
            
            # 4) Finalmente: consulta a la API
            try:
                url = 'https://pro-api.coinmarketcap.com/v1/tools/price-conversion?amount={}&symbol={}&convert={}&CMC_PRO_API_KEY={}'.format(amount, simbolo, convert, API_KEY)
                dicc = peticionAPI(url)
                
                q_to = dicc['data']['quote'][convert]['price'] # cantidad de monedas que podemos comprar (viene del API)
                precioUnitario = float(amount)/q_to
                fecha_compra = time.strftime("%d/%m/%Y") # fecha y hora del momento de la consulta API
                hora_compra = time.strftime("%X")
                
                return render_template('purchase.html', vacio='no', form=form, q_to=q_to, precioUnitario=precioUnitario, hora_compra=hora_compra, fecha_compra=fecha_compra, monedero=monedero, amount=amount)
            except Exception as error:
                print("**ERROR**: Conexion url en PURCHASE - {}".format(type(error).__name__), error) # Failed to establish a new connection
                error = "Problema de conexión. Contacte con el administrador."
                return render_template('purchase.html', vacio='yes', form=form, error=error, monedero=monedero)
def status():
    form = MovementForm()
    ingresos = 0
    try:

        conn = sqlite3.connect("movements/data/basededatos.db")
        c = conn.cursor()
    except Exception as e:
        print(
            f"error al conectar con la base de datos {type(e).__name__} - {e} "
        )
        messages.append(" error al conectar con la base de datos")
        return render_template("errores.html", messages=messages)

    try:
        c.execute(
            'SELECT SUM(from_quantity) AS total , from_currency FROM movimientos WHERE from_currency="EUR"'
        )
        from_eur_quantity = c.fetchone()[0]

    except Exception as e:
        print(f"error de consulta {type(e).__name__} - {e} ")
        messages.append(
            " no se ha podido obtener el valor en EUR, por favor verifique los datos"
        )
        return render_template("errores.html", messages=messages)

    try:
        c.execute(
            "SELECT SUM(to_quantity) AS total, to_currency FROM movimientos GROUP BY to_currency;"
        )
        to_currencies = c.fetchall()

    except Exception as e:
        print(f"error de consulta {type(e).__name__} - {e} ")
        messages.append(
            " no se ha podido obtener la suma total , por favor verifique los datos"
        )
        return render_template("errores.html", messages=messages)

    try:
        c.execute(
            "SELECT SUM(from_quantity) AS total, from_currency FROM movimientos GROUP BY from_currency"
        )
        from_currencies = c.fetchall()

        result_currencies = []
    except Exception as e:
        print(f"error en la base de datos {type(e).__name__} - {e} ")
        messages.append(
            "error al conectar con la base de datos, verifique los datos introducidos "
        )
        return render_template("errores.html", messages=messages)

    try:
        for to_currency in to_currencies:
            result_currency = []
            is_coincidence = False
            print(to_currency[0])
            for from_currency in from_currencies:
                if to_currency[1] == from_currency[1]:
                    is_coincidence = True
                    result_currency.append(to_currency[0] - from_currency[0])
                    result_currency.append(to_currency[1])
                    result_currencies.append(result_currency)
            if is_coincidence == False:
                result_currency.append(to_currency[0])
                result_currency.append(to_currency[1])
                result_currencies.append(result_currency)
    except Exception as e:
        print(f"error al obtener el resultado {type(e).__name__} - {e} ")
        messages.append("error al obtener el resultado ")
        return render_template("errores.html", messages=messages)

    print(result_currencies)
    conn.close()

    try:
        suma = 0

        for result_currency in result_currencies:
            url_api = "https://pro-api.coinmarketcap.com/v1/tools/price-conversion?amount={}&symbol={}&convert={}&CMC_PRO_API_KEY={}"
            respuesta = requests.get(
                url_api.format(result_currency[0], result_currency[1], "EUR",
                               apikey))
            if respuesta.status_code == 200:
                datos = respuesta.json()
                suma += float(datos['data']['quote']['EUR']['price'])
                print(datos['data']['quote']['EUR']['price'])
        print(suma)

    except Exception as e:
        print(f"error de respuesta en la api {type(e).__name__} - {e} ")
        messages.append(
            "se ha producido un error de respuesta en la api , por favor verifique los datos introducidos "
        )
        return render_template("errores.html", messages=messages)

    return render_template("status.html",
                           valor_invertido=from_eur_quantity,
                           valor_actual=suma)
def compraNueva():
    form = MovementForm(csrf_enabled=False)
    form.from_currency.choices = get_currencies()
    to_quantity = 0
    PU = 0

    print(form.validate_on_submit())

    if request.method == 'POST' and form.validate_on_submit():
        try:
            today = date.today()
            today_2 = "{}/{}/{}".format(today.day, today.month, today.year)
            now = datetime.now()
            time = "{}:{}:{}".format(now.hour, now.minute, now.second)
        except Exception as e:
            print(
                f"no se ha podido obtener la fecha y la hora actual {type(e).__name__} - {e}"
            )
            messages.append(
                "se ha producido un error al obtener la hora y fecha")
            return render_template("errores.html", messages=messages)

        amount = request.form.get("from_quantity")
        symbol = request.form.get("from_currency")
        convert = request.form.get("to_currency")

        try:
            url_api = "https://pro-api.coinmarketcap.com/v1/tools/price-conversion?amount={}&symbol={}&convert={}&CMC_PRO_API_KEY={}"

            respuesta = requests.get(
                url_api.format(amount, symbol, convert, apikey))
            if respuesta.status_code == 200:
                datos = respuesta.json()
                cantidad_2 = datos['data']['quote'][convert]['price']
                to_quantity = cantidad_2
                PU = (float(cantidad_2) / float(amount))
            elif respuesta.status_code == 401:
                print("apikey invalida")
                messages.append(
                    "No se ha podido enviar la solicitud a la api, debido a que ha introducido una apikey invalida"
                )
                return render_template("errores.html", messages=messages)

            else:
                print("se ha producido un error  ", respuesta.status_code)
                messages.append(
                    "se ha producido un error en la consulta verifique por favor los datos"
                )
                return render_template("errores.html", messages=messages)

        except Exception as e:

            print(
                f"no hemos podido conectar con la api{type(e).__name__} - {e} "
            )
            messages.append(
                "No se ha podido enviar la solicitud a la api, por favor comuniquese con el administrador"
            )
            return render_template("errores.html", messages=messages)

        try:
            if request.form.get('submit2') is not None:
                fIngresos = open("movements/data/basededatos.csv",
                                 "w+",
                                 newline="")
                csvWriter = csv.writer(fIngresos, delimiter=",", quotechar='"')
                csvWriter.writerow([
                    request.form.get("Fecha"),
                    request.form.get("Hora"),
                    request.form.get("convert_From"),
                    request.form.get("Q"),
                    request.form.get("convert_To"),
                    request.form.get("Q2"),
                    request.form.get("PU")
                ])
                conn = sqlite3.connect("movements/data/basededatos.db")
                c = conn.cursor()

                c.execute(
                    'INSERT INTO movimientos (date, time, from_currency, from_quantity, to_currency, to_quantity , "PU") VALUES (?,?,?,?,?,?,?);',
                    (today_2, time, request.form.get('from_currency'),
                     float(request.form.get('from_quantity')),
                     request.form.get('to_currency'),
                     float(request.form.get('to_quantity')),
                     float(request.form.get("PU"))))
                conn.commit()
                conn.close()
                return redirect(url_for("listaIngresos"))
        except Exception as e:
            print(f"error en la base de datos {type(e).__name__} - {e} ")
            messages.append("error al conectar con la base de datos ")
            return render_template("errores.html", messages=messages)

    return render_template("compra.html",
                           form=form,
                           PU=PU,
                           to_quantity=to_quantity)