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