|
|
@@ -1,5 +1,5 @@
|
|
|
-from flask import Blueprint, render_template, request, redirect, url_for
|
|
|
-from models import db, CatalogoPaneles, DatosSolaresCiudad, ProyectosUsuario, Casa
|
|
|
+from flask import Blueprint, render_template, request, redirect, url_for, flash
|
|
|
+from models import db, CatalogoPaneles, DatosSolaresCiudad, ProyectosUsuario, Casa, Configuracion
|
|
|
|
|
|
main = Blueprint('main', __name__)
|
|
|
|
|
|
@@ -7,6 +7,23 @@ main = Blueprint('main', __name__)
|
|
|
def index():
|
|
|
return render_template('index.html')
|
|
|
|
|
|
+@main.route('/configuracion', methods=['GET', 'POST'])
|
|
|
+def configuracion():
|
|
|
+ config_precio = Configuracion.query.filter_by(clave='precio_kwh').first()
|
|
|
+
|
|
|
+ if request.method == 'POST':
|
|
|
+ nuevo_precio = request.form.get('precio_kwh')
|
|
|
+ if config_precio:
|
|
|
+ config_precio.valor = nuevo_precio
|
|
|
+ else:
|
|
|
+ config_precio = Configuracion(clave='precio_kwh', valor=nuevo_precio)
|
|
|
+ db.session.add(config_precio)
|
|
|
+
|
|
|
+ db.session.commit()
|
|
|
+ return redirect(url_for('main.configuracion'))
|
|
|
+
|
|
|
+ return render_template('configuracion.html', precio_kwh=config_precio.valor if config_precio else '0.15')
|
|
|
+
|
|
|
@main.route('/casas')
|
|
|
def casas():
|
|
|
casas = Casa.query.all()
|
|
|
@@ -35,15 +52,28 @@ def nueva_casa():
|
|
|
def simular(id_casa):
|
|
|
casa = Casa.query.get_or_404(id_casa)
|
|
|
paneles = CatalogoPaneles.query.all()
|
|
|
+ config_precio = Configuracion.query.filter_by(clave='precio_kwh').first()
|
|
|
+ precio_kwh = float(config_precio.valor) if config_precio else 0.15
|
|
|
|
|
|
- return render_template('simulation.html', casa=casa, paneles=paneles)
|
|
|
+ return render_template('simulation.html', casa=casa, paneles=paneles, precio_kwh=precio_kwh)
|
|
|
|
|
|
@main.route('/calculate', methods=['POST'])
|
|
|
def calculate():
|
|
|
id_casa = request.form.get('id_casa')
|
|
|
id_panel = request.form.get('id_panel')
|
|
|
cantidad = int(request.form.get('cantidad'))
|
|
|
- precio_kwh = float(request.form.get('precio_kwh', 0.15))
|
|
|
+
|
|
|
+ # Nuevos campos opcionales
|
|
|
+ consumo_kwh = request.form.get('consumo_kwh')
|
|
|
+
|
|
|
+ consumo_kwh = float(consumo_kwh) if consumo_kwh else 0
|
|
|
+
|
|
|
+ # Obtenemos el precio global configurado
|
|
|
+ config_precio = Configuracion.query.filter_by(clave='precio_kwh').first()
|
|
|
+ precio_kwh = float(config_precio.valor) if config_precio else 0.15
|
|
|
+
|
|
|
+ # Calculamos el costo mensual basado en el consumo y el precio global
|
|
|
+ costo_mensual = consumo_kwh * precio_kwh
|
|
|
|
|
|
casa = Casa.query.get(id_casa)
|
|
|
ciudad = casa.ciudad
|
|
|
@@ -60,12 +90,22 @@ def calculate():
|
|
|
|
|
|
# Bonus: ROI
|
|
|
ahorro_mensual = energia_mensual * precio_kwh
|
|
|
+
|
|
|
+ # Si el ahorro es mayor que el costo actual (si existe), lo limitamos al costo actual (no puedes ahorrar más de lo que pagas)
|
|
|
+ # Aunque técnicamente podrías vender excedentes, para simplificar asumimos net metering o autoconsumo puro.
|
|
|
+ if costo_mensual > 0 and ahorro_mensual > costo_mensual:
|
|
|
+ ahorro_mensual = costo_mensual
|
|
|
+
|
|
|
costo_total = panel.precio_unitario * cantidad
|
|
|
tiempo_recuperacion = (costo_total / ahorro_mensual / 12) if ahorro_mensual > 0 else 0 # Years
|
|
|
|
|
|
# Bonus: CO2
|
|
|
co2_evitado = energia_mensual * 0.4
|
|
|
|
|
|
+ # Nuevo costo estimado
|
|
|
+ nuevo_costo_mensual = max(0, costo_mensual - ahorro_mensual) if costo_mensual > 0 else 0
|
|
|
+ porcentaje_cobertura = (energia_mensual / consumo_kwh * 100) if consumo_kwh > 0 else 0
|
|
|
+
|
|
|
return render_template('results.html',
|
|
|
energia=round(energia_mensual, 2),
|
|
|
ahorro=round(ahorro_mensual, 2),
|
|
|
@@ -75,7 +115,11 @@ def calculate():
|
|
|
panel=panel,
|
|
|
cantidad=cantidad,
|
|
|
costo_total=costo_total,
|
|
|
- casa=casa)
|
|
|
+ casa=casa,
|
|
|
+ consumo_kwh=consumo_kwh,
|
|
|
+ costo_mensual=round(costo_mensual, 2),
|
|
|
+ nuevo_costo_mensual=round(nuevo_costo_mensual, 2),
|
|
|
+ porcentaje_cobertura=round(porcentaje_cobertura, 1))
|
|
|
|
|
|
@main.route('/save', methods=['POST'])
|
|
|
def save():
|
|
|
@@ -86,6 +130,9 @@ def save():
|
|
|
energia = request.form.get('energia')
|
|
|
ahorro = request.form.get('ahorro')
|
|
|
|
|
|
+ consumo_kwh = request.form.get('consumo_kwh')
|
|
|
+ costo_mensual = request.form.get('costo_mensual')
|
|
|
+
|
|
|
casa = Casa.query.get(id_casa)
|
|
|
|
|
|
proyecto = ProyectosUsuario(
|
|
|
@@ -95,7 +142,9 @@ def save():
|
|
|
id_panel=id_panel,
|
|
|
cantidad_paneles=cantidad,
|
|
|
energia_estimada_mensual=energia,
|
|
|
- ahorro_estimado=ahorro
|
|
|
+ ahorro_estimado=ahorro,
|
|
|
+ consumo_actual_kwh=float(consumo_kwh) if consumo_kwh and float(consumo_kwh) > 0 else None,
|
|
|
+ costo_actual_mensual=float(costo_mensual) if costo_mensual and float(costo_mensual) > 0 else None
|
|
|
)
|
|
|
|
|
|
db.session.add(proyecto)
|