Persano commited on
Commit
0168fdb
verified
1 Parent(s): fde05fe

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +126 -113
app.py CHANGED
@@ -8,9 +8,14 @@ from matplotlib.ticker import FuncFormatter
8
  from xhtml2pdf import pisa
9
  from datetime import datetime
10
  import openai
 
 
11
 
12
  app = Flask(__name__)
13
 
 
 
 
14
  openai.api_key = os.getenv("OPENAI_API_KEY")
15
 
16
  def formatar_brl(valor):
@@ -61,23 +66,116 @@ def render_pdf(template_src, context_dict):
61
  return result
62
  return None
63
 
 
 
 
 
 
 
 
 
 
64
  @app.route("/", methods=["GET", "POST"])
65
  def index():
66
  if request.method == "POST":
67
- capital = float(request.form["capital"])
68
- studio_ret = float(request.form["studio_ret"])
69
- valorizacao = float(request.form["valorizacao"])
70
- franquia_ret = float(request.form["franquia_ret"])
71
- acoes_ret = float(request.form["acoes_ret"])
72
- renda_fixa = float(request.form["renda_fixa"])
73
- inflacao = float(request.form["inflacao"])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
 
75
  anos = list(range(1, 6))
76
 
77
  patrimonio_studio = [capital * ((1 + valorizacao / 100) ** ano) for ano in anos]
78
  renda_acumulada_studio = [capital * (((1 + studio_ret / 100) ** (12 * ano)) - 1) for ano in anos]
79
  studio_total = [p + r for p, r in zip(patrimonio_studio, renda_acumulada_studio)]
80
-
81
  franquia = [capital + (franquia_ret * ano) for ano in anos]
82
  acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
83
  renda_fixa_valores = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
@@ -98,6 +196,7 @@ def index():
98
  "Renda Fixa": renda_fixa_valores[-1],
99
  }
100
 
 
101
  plt.figure(figsize=(8, 5))
102
  plt.plot(anos, studio_total, label="Studio (Patrim么nio + Renda)", marker="o")
103
  plt.plot(anos, franquia, label="Franquia", marker="o")
@@ -108,13 +207,10 @@ def index():
108
  plt.ylabel("Valor (R$)")
109
  plt.legend()
110
  plt.grid(True)
111
- plt.gca().yaxis.set_major_formatter(FuncFormatter(lambda x, _: f"R${x:,.0f}".replace(",", ".")))
112
  plt.tight_layout()
113
-
114
- buf = io.BytesIO()
115
  plt.savefig(buf, format="png")
116
  buf.seek(0)
117
- grafico_base64 = base64.b64encode(buf.getvalue()).decode("utf-8")
118
  buf.close()
119
  plt.close()
120
 
@@ -122,111 +218,28 @@ def index():
122
  for col in df.columns:
123
  if col != "Ano":
124
  df_formatado[col] = df_formatado[col].apply(formatar_brl)
125
- tabela = df_formatado.to_html(index=False, classes="tabela", border=0)
126
-
127
- analise_final = gerar_analise(investimentos_finais, capital, patrimonio_studio[-1])
128
-
129
- # Formata valores para exibir no template
130
- contexto = {
131
- "capital": formatar_brl(capital),
132
- "studio_ret": f"{studio_ret:.2f}%",
133
- "valorizacao": f"{valorizacao:.2f}%",
134
- "franquia_ret": formatar_brl(franquia_ret),
135
- "acoes_ret": f"{acoes_ret:.2f}%",
136
- "renda_fixa": f"{renda_fixa:.2f}%",
137
- "inflacao": f"{inflacao:.2f}%",
138
  "grafico": grafico_base64,
139
- "tabela": tabela,
140
- "analise_final": analise_final,
141
  "data_hoje": datetime.now().strftime("S茫o Paulo, %d de %B de %Y")
142
  }
143
 
144
- return render_template("index.html", **contexto)
 
 
 
 
 
145
 
146
- return render_template("index.html")
147
-
148
- @app.route("/gerar-pdf", methods=["POST"])
149
- def gerar_pdf():
150
- capital = float(request.form["capital"])
151
- studio_ret = float(request.form["studio_ret"])
152
- valorizacao = float(request.form["valorizacao"])
153
- franquia_ret = float(request.form["franquia_ret"])
154
- acoes_ret = float(request.form["acoes_ret"])
155
- renda_fixa = float(request.form["renda_fixa"])
156
- inflacao = float(request.form["inflacao"])
157
-
158
- anos = list(range(1, 6))
159
-
160
- patrimonio_studio = [capital * ((1 + valorizacao / 100) ** ano) for ano in anos]
161
- renda_acumulada_studio = [capital * (((1 + studio_ret / 100) ** (12 * ano)) - 1) for ano in anos]
162
- studio_total = [p + r for p, r in zip(patrimonio_studio, renda_acumulada_studio)]
163
- franquia = [capital + (franquia_ret * ano) for ano in anos]
164
- acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
165
- renda_fixa_valores = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
166
-
167
- dados = {
168
- "Ano": anos,
169
- "Studio (Patrim么nio + Renda)": studio_total,
170
- "Franquia": franquia,
171
- "A莽玫es": acoes,
172
- "Renda Fixa": renda_fixa_valores
173
- }
174
- df = pd.DataFrame(dados)
175
-
176
- investimentos_finais = {
177
- "Studio": studio_total[-1],
178
- "Franquia": franquia[-1],
179
- "A莽玫es": acoes[-1],
180
- "Renda Fixa": renda_fixa_valores[-1],
181
- }
182
-
183
- plt.figure(figsize=(8, 5))
184
- plt.plot(anos, studio_total, label="Studio (Patrim么nio + Renda)", marker="o")
185
- plt.plot(anos, franquia, label="Franquia", marker="o")
186
- plt.plot(anos, acoes, label="A莽玫es", marker="o")
187
- plt.plot(anos, renda_fixa_valores, label="Renda Fixa", marker="o")
188
- plt.title("Proje莽茫o de Investimentos (5 anos)")
189
- plt.xlabel("Ano")
190
- plt.ylabel("Valor (R$)")
191
- plt.legend()
192
- plt.grid(True)
193
- plt.tight_layout()
194
-
195
- buf = io.BytesIO()
196
- plt.savefig(buf, format="png")
197
- buf.seek(0)
198
- grafico_base64 = base64.b64encode(buf.read()).decode("utf-8")
199
- buf.close()
200
- plt.close()
201
-
202
- df_formatado = df.copy()
203
- for col in df.columns:
204
- if col != "Ano":
205
- df_formatado[col] = df_formatado[col].apply(formatar_brl)
206
- tabela_html = df_formatado.to_html(index=False, classes="tabela", border=0)
207
-
208
- analise_final_ia = gerar_analise_ia(investimentos_finais, capital, patrimonio_studio[-1])
209
-
210
- contexto = {
211
- "capital": formatar_brl(capital),
212
- "studio_ret": f"{studio_ret:.2f}%",
213
- "valorizacao": f"{valorizacao:.2f}%",
214
- "franquia_ret": formatar_brl(franquia_ret),
215
- "acoes_ret": f"{acoes_ret:.2f}%",
216
- "renda_fixa": f"{renda_fixa:.2f}%",
217
- "inflacao": f"{inflacao:.2f}%",
218
- "grafico": grafico_base64,
219
- "tabela": tabela_html,
220
- "analise_final": analise_final_ia,
221
- "data_hoje": datetime.now().strftime("S茫o Paulo, %d de %B de %Y")
222
- }
223
-
224
- pdf = render_pdf("relatorio.html", contexto)
225
- if pdf:
226
- return send_file(pdf, mimetype="application/pdf", as_attachment=True, download_name="relatorio_investimento.pdf")
227
- else:
228
- return "Erro ao gerar PDF", 500
229
 
230
  if __name__ == "__main__":
231
- app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 7860)))
232
-
 
8
  from xhtml2pdf import pisa
9
  from datetime import datetime
10
  import openai
11
+ import traceback
12
+ import logging
13
 
14
  app = Flask(__name__)
15
 
16
+ # Configurar logger para console
17
+ logging.basicConfig(level=logging.DEBUG)
18
+
19
  openai.api_key = os.getenv("OPENAI_API_KEY")
20
 
21
  def formatar_brl(valor):
 
66
  return result
67
  return None
68
 
69
+ def safe_float(valor, nome, default=0.0):
70
+ try:
71
+ f = float(valor)
72
+ logging.debug(f"{nome} recebido e convertido: {f}")
73
+ return f
74
+ except Exception as e:
75
+ logging.error(f"Erro convertendo {nome} com valor '{valor}': {e}")
76
+ return default
77
+
78
  @app.route("/", methods=["GET", "POST"])
79
  def index():
80
  if request.method == "POST":
81
+ try:
82
+ # Log dos dados recebidos
83
+ logging.debug(f"Dados recebidos no POST: {request.form}")
84
+
85
+ capital = safe_float(request.form.get("capital"), "capital")
86
+ studio_ret = safe_float(request.form.get("studio_ret"), "studio_ret")
87
+ valorizacao = safe_float(request.form.get("valorizacao"), "valorizacao")
88
+ franquia_ret = safe_float(request.form.get("franquia_ret"), "franquia_ret")
89
+ acoes_ret = safe_float(request.form.get("acoes_ret"), "acoes_ret")
90
+ renda_fixa = safe_float(request.form.get("renda_fixa"), "renda_fixa")
91
+ inflacao = safe_float(request.form.get("inflacao"), "inflacao")
92
+
93
+ anos = list(range(1, 6))
94
+
95
+ patrimonio_studio = [capital * ((1 + valorizacao / 100) ** ano) for ano in anos]
96
+ renda_acumulada_studio = [capital * (((1 + studio_ret / 100) ** (12 * ano)) - 1) for ano in anos]
97
+ studio_total = [p + r for p, r in zip(patrimonio_studio, renda_acumulada_studio)]
98
+
99
+ franquia = [capital + (franquia_ret * ano) for ano in anos]
100
+ acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
101
+ renda_fixa_valores = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
102
+
103
+ dados = {
104
+ "Ano": anos,
105
+ "Studio (Patrim么nio + Renda)": studio_total,
106
+ "Franquia": franquia,
107
+ "A莽玫es": acoes,
108
+ "Renda Fixa": renda_fixa_valores
109
+ }
110
+ df = pd.DataFrame(dados)
111
+
112
+ investimentos_finais = {
113
+ "Studio": studio_total[-1],
114
+ "Franquia": franquia[-1],
115
+ "A莽玫es": acoes[-1],
116
+ "Renda Fixa": renda_fixa_valores[-1],
117
+ }
118
+
119
+ plt.figure(figsize=(8, 5))
120
+ plt.plot(anos, studio_total, label="Studio (Patrim么nio + Renda)", marker="o")
121
+ plt.plot(anos, franquia, label="Franquia", marker="o")
122
+ plt.plot(anos, acoes, label="A莽玫es", marker="o")
123
+ plt.plot(anos, renda_fixa_valores, label="Renda Fixa", marker="o")
124
+ plt.title("Proje莽茫o de Investimentos (5 anos)")
125
+ plt.xlabel("Ano")
126
+ plt.ylabel("Valor (R$)")
127
+ plt.legend()
128
+ plt.grid(True)
129
+ plt.gca().yaxis.set_major_formatter(FuncFormatter(lambda x, _: f"R${x:,.0f}".replace(",", ".")))
130
+ plt.tight_layout()
131
+
132
+ buf = io.BytesIO()
133
+ plt.savefig(buf, format="png")
134
+ buf.seek(0)
135
+ grafico_base64 = base64.b64encode(buf.getvalue()).decode("utf-8")
136
+ buf.close()
137
+ plt.close()
138
+
139
+ df_formatado = df.copy()
140
+ for col in df.columns:
141
+ if col != "Ano":
142
+ df_formatado[col] = df_formatado[col].apply(formatar_brl)
143
+ tabela = df_formatado.to_html(index=False, classes="table table-striped table-sm text-end", border=0)
144
+
145
+ analise_final = gerar_analise(investimentos_finais, capital, patrimonio_studio[-1])
146
+
147
+ return render_template(
148
+ "index.html",
149
+ capital=capital,
150
+ tabela=tabela,
151
+ grafico=grafico_base64,
152
+ analise_final=analise_final
153
+ )
154
+
155
+ except Exception:
156
+ logging.error("Erro na rota /", exc_info=True)
157
+ return "Erro interno no servidor. Verifique os logs.", 500
158
+
159
+ return render_template("index.html")
160
+
161
+ @app.route("/gerar-pdf", methods=["POST"])
162
+ def gerar_pdf():
163
+ try:
164
+ logging.debug(f"Dados recebidos para gerar PDF: {request.form}")
165
+
166
+ capital = safe_float(request.form.get("capital"), "capital")
167
+ studio_ret = safe_float(request.form.get("studio_ret"), "studio_ret")
168
+ valorizacao = safe_float(request.form.get("valorizacao"), "valorizacao")
169
+ franquia_ret = safe_float(request.form.get("franquia_ret"), "franquia_ret")
170
+ acoes_ret = safe_float(request.form.get("acoes_ret"), "acoes_ret")
171
+ renda_fixa = safe_float(request.form.get("renda_fixa"), "renda_fixa")
172
+ inflacao = safe_float(request.form.get("inflacao"), "inflacao")
173
 
174
  anos = list(range(1, 6))
175
 
176
  patrimonio_studio = [capital * ((1 + valorizacao / 100) ** ano) for ano in anos]
177
  renda_acumulada_studio = [capital * (((1 + studio_ret / 100) ** (12 * ano)) - 1) for ano in anos]
178
  studio_total = [p + r for p, r in zip(patrimonio_studio, renda_acumulada_studio)]
 
179
  franquia = [capital + (franquia_ret * ano) for ano in anos]
180
  acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
181
  renda_fixa_valores = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
 
196
  "Renda Fixa": renda_fixa_valores[-1],
197
  }
198
 
199
+ buf = io.BytesIO()
200
  plt.figure(figsize=(8, 5))
201
  plt.plot(anos, studio_total, label="Studio (Patrim么nio + Renda)", marker="o")
202
  plt.plot(anos, franquia, label="Franquia", marker="o")
 
207
  plt.ylabel("Valor (R$)")
208
  plt.legend()
209
  plt.grid(True)
 
210
  plt.tight_layout()
 
 
211
  plt.savefig(buf, format="png")
212
  buf.seek(0)
213
+ grafico_base64 = base64.b64encode(buf.read()).decode("utf-8")
214
  buf.close()
215
  plt.close()
216
 
 
218
  for col in df.columns:
219
  if col != "Ano":
220
  df_formatado[col] = df_formatado[col].apply(formatar_brl)
221
+ tabela_html = df_formatado.to_html(index=False, classes="tabela", border=0)
222
+
223
+ analise_final_ia = gerar_analise_ia(investimentos_finais, capital, patrimonio_studio[-1])
224
+
225
+ context = {
226
+ "capital": capital,
 
 
 
 
 
 
 
227
  "grafico": grafico_base64,
228
+ "tabela": tabela_html,
229
+ "analise_final": analise_final_ia,
230
  "data_hoje": datetime.now().strftime("S茫o Paulo, %d de %B de %Y")
231
  }
232
 
233
+ pdf = render_pdf("relatorio.html", context)
234
+ if pdf:
235
+ return send_file(pdf, mimetype="application/pdf", as_attachment=True, download_name="relatorio_investimento.pdf")
236
+ else:
237
+ logging.error("Erro ao gerar PDF: pisa.CreatePDF retornou erro")
238
+ return "Erro ao gerar PDF", 500
239
 
240
+ except Exception:
241
+ logging.error("Erro na rota /gerar-pdf", exc_info=True)
242
+ return "Erro interno no servidor ao gerar PDF. Verifique os logs.", 500
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
243
 
244
  if __name__ == "__main__":
245
+ app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 7860)), debug=True)