routes.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. from flask import Blueprint, render_template, request, redirect, url_for, flash
  2. from models import db, CatalogoPaneles, DatosSolaresCiudad, ProyectosUsuario, Casa, Configuracion
  3. main = Blueprint('main', __name__)
  4. @main.route('/')
  5. def index():
  6. return render_template('index.html')
  7. @main.route('/configuracion', methods=['GET', 'POST'])
  8. def configuracion():
  9. config_precio = Configuracion.query.filter_by(clave='precio_kwh').first()
  10. if request.method == 'POST':
  11. nuevo_precio = request.form.get('precio_kwh')
  12. if config_precio:
  13. config_precio.valor = nuevo_precio
  14. else:
  15. config_precio = Configuracion(clave='precio_kwh', valor=nuevo_precio)
  16. db.session.add(config_precio)
  17. db.session.commit()
  18. return redirect(url_for('main.configuracion'))
  19. return render_template('configuracion.html', precio_kwh=config_precio.valor if config_precio else '0.15')
  20. @main.route('/casas')
  21. def casas():
  22. casas = Casa.query.all()
  23. ciudades = DatosSolaresCiudad.query.all()
  24. return render_template('casas.html', casas=casas, ciudades=ciudades)
  25. @main.route('/proyectos')
  26. def proyectos():
  27. proyectos = ProyectosUsuario.query.order_by(ProyectosUsuario.fecha_simulacion.desc()).all()
  28. return render_template('proyectos.html', proyectos=proyectos)
  29. @main.route('/casa/nueva', methods=['POST'])
  30. def nueva_casa():
  31. nombre = request.form.get('nombre')
  32. area_techo = float(request.form.get('area_techo'))
  33. id_ciudad = request.form.get('id_ciudad')
  34. casa = Casa(nombre=nombre, area_techo=area_techo, id_ciudad=id_ciudad)
  35. db.session.add(casa)
  36. db.session.commit()
  37. return redirect(url_for('main.casas'))
  38. @main.route('/simular/<int:id_casa>')
  39. def simular(id_casa):
  40. casa = Casa.query.get_or_404(id_casa)
  41. paneles = CatalogoPaneles.query.all()
  42. config_precio = Configuracion.query.filter_by(clave='precio_kwh').first()
  43. precio_kwh = float(config_precio.valor) if config_precio else 0.15
  44. return render_template('simulation.html', casa=casa, paneles=paneles, precio_kwh=precio_kwh)
  45. @main.route('/calculate', methods=['POST'])
  46. def calculate():
  47. id_casa = request.form.get('id_casa')
  48. id_panel = request.form.get('id_panel')
  49. cantidad = int(request.form.get('cantidad'))
  50. # Nuevos campos opcionales
  51. consumo_kwh = request.form.get('consumo_kwh')
  52. consumo_kwh = float(consumo_kwh) if consumo_kwh else 0
  53. # Obtenemos el precio global configurado
  54. config_precio = Configuracion.query.filter_by(clave='precio_kwh').first()
  55. precio_kwh = float(config_precio.valor) if config_precio else 0.15
  56. # Calculamos el costo mensual basado en el consumo y el precio global
  57. costo_mensual = consumo_kwh * precio_kwh
  58. casa = Casa.query.get(id_casa)
  59. ciudad = casa.ciudad
  60. panel = CatalogoPaneles.query.get(id_panel)
  61. # E = A * r * H * PR
  62. # Monthly E = (A_panel * quantity) * r * H * 30 * 0.75
  63. area_total = panel.area_m2 * cantidad
  64. pr = 0.75
  65. days = 30
  66. energia_mensual = area_total * panel.eficiencia_r * ciudad.irradiacion_h_promedio * days * pr
  67. # Bonus: ROI
  68. ahorro_mensual = energia_mensual * precio_kwh
  69. # 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)
  70. # Aunque técnicamente podrías vender excedentes, para simplificar asumimos net metering o autoconsumo puro.
  71. if costo_mensual > 0 and ahorro_mensual > costo_mensual:
  72. ahorro_mensual = costo_mensual
  73. costo_total = panel.precio_unitario * cantidad
  74. tiempo_recuperacion = (costo_total / ahorro_mensual / 12) if ahorro_mensual > 0 else 0 # Years
  75. # Bonus: CO2
  76. co2_evitado = energia_mensual * 0.4
  77. # Nuevo costo estimado
  78. nuevo_costo_mensual = max(0, costo_mensual - ahorro_mensual) if costo_mensual > 0 else 0
  79. porcentaje_cobertura = (energia_mensual / consumo_kwh * 100) if consumo_kwh > 0 else 0
  80. return render_template('results.html',
  81. energia=round(energia_mensual, 2),
  82. ahorro=round(ahorro_mensual, 2),
  83. recuperacion=round(tiempo_recuperacion, 1),
  84. co2=round(co2_evitado, 2),
  85. ciudad=ciudad,
  86. panel=panel,
  87. cantidad=cantidad,
  88. costo_total=costo_total,
  89. casa=casa,
  90. consumo_kwh=consumo_kwh,
  91. costo_mensual=round(costo_mensual, 2),
  92. nuevo_costo_mensual=round(nuevo_costo_mensual, 2),
  93. porcentaje_cobertura=round(porcentaje_cobertura, 1))
  94. @main.route('/save', methods=['POST'])
  95. def save():
  96. nombre_cliente = request.form.get('nombre_cliente')
  97. id_casa = request.form.get('id_casa')
  98. id_panel = request.form.get('id_panel')
  99. cantidad = request.form.get('cantidad')
  100. energia = request.form.get('energia')
  101. ahorro = request.form.get('ahorro')
  102. consumo_kwh = request.form.get('consumo_kwh')
  103. costo_mensual = request.form.get('costo_mensual')
  104. casa = Casa.query.get(id_casa)
  105. proyecto = ProyectosUsuario(
  106. nombre_cliente=nombre_cliente,
  107. id_casa=id_casa,
  108. id_ciudad=casa.id_ciudad,
  109. id_panel=id_panel,
  110. cantidad_paneles=cantidad,
  111. energia_estimada_mensual=energia,
  112. ahorro_estimado=ahorro,
  113. consumo_actual_kwh=float(consumo_kwh) if consumo_kwh and float(consumo_kwh) > 0 else None,
  114. costo_actual_mensual=float(costo_mensual) if costo_mensual and float(costo_mensual) > 0 else None
  115. )
  116. db.session.add(proyecto)
  117. db.session.commit()
  118. return redirect(url_for('main.proyectos'))