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)
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)
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)
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)
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)
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)
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)
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)
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)