Update app.py
Browse files
app.py
CHANGED
@@ -174,43 +174,82 @@ def index():
|
|
174 |
|
175 |
return render_template("index.html")
|
176 |
|
|
|
|
|
|
|
|
|
|
|
177 |
@app.route("/gerar-pdf", methods=["POST"])
|
178 |
def gerar_pdf():
|
179 |
try:
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
191 |
|
192 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
193 |
df_formatado = df.copy()
|
194 |
for col in df.columns:
|
195 |
if col != "Ano":
|
196 |
df_formatado[col] = df_formatado[col].apply(formatar_brl)
|
197 |
tabela_html = df_formatado.to_html(index=False, classes="tabela", border=0)
|
198 |
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
grafico_base64 = gerar_grafico(
|
203 |
-
anos,
|
204 |
-
studio_total,
|
205 |
-
dados["Franquia"],
|
206 |
-
dados["Ações"],
|
207 |
-
dados["Renda Fixa"],
|
208 |
-
)
|
209 |
-
|
210 |
-
|
211 |
-
analise_final_ia = gerar_analise_ia(investimentos_finais, capital, patrimonio_studio[-1])
|
212 |
-
analise_final_ia = analise_final_ia.replace("\n", "<br>")
|
213 |
|
|
|
214 |
context = {
|
215 |
"capital": capital,
|
216 |
"grafico": grafico_base64,
|
@@ -219,16 +258,18 @@ def gerar_pdf():
|
|
219 |
"data_hoje": datetime.now().strftime("São Paulo, %d de %B de %Y")
|
220 |
}
|
221 |
|
|
|
222 |
pdf = render_pdf("relatorio.html", context)
|
223 |
if pdf:
|
224 |
return send_file(pdf, mimetype="application/pdf", as_attachment=True, download_name="relatorio_investimento.pdf")
|
225 |
else:
|
226 |
-
logging.error("Erro ao gerar PDF: pisa.CreatePDF retornou erro")
|
227 |
return "Erro ao gerar PDF", 500
|
228 |
|
229 |
-
except Exception:
|
230 |
-
|
231 |
-
return "Erro interno
|
|
|
|
|
232 |
|
233 |
if __name__ == "__main__":
|
234 |
app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 7860)), debug=True)
|
|
|
174 |
|
175 |
return render_template("index.html")
|
176 |
|
177 |
+
|
178 |
+
|
179 |
+
|
180 |
+
|
181 |
+
|
182 |
@app.route("/gerar-pdf", methods=["POST"])
|
183 |
def gerar_pdf():
|
184 |
try:
|
185 |
+
# --- Coleta e conversão dos dados do formulário
|
186 |
+
capital = float(request.form["capital"])
|
187 |
+
studio_ret = float(request.form["studio_ret"])
|
188 |
+
valorizacao = float(request.form["valorizacao"])
|
189 |
+
franquia_ret = float(request.form["franquia_ret"])
|
190 |
+
acoes_ret = float(request.form["acoes_ret"])
|
191 |
+
renda_fixa = float(request.form["renda_fixa"])
|
192 |
+
inflacao = float(request.form["inflacao"]) # Ainda não usado
|
193 |
+
|
194 |
+
anos = list(range(1, 6))
|
195 |
+
|
196 |
+
# --- Cálculo das projeções de investimento
|
197 |
+
patrimonio_studio = [capital * ((1 + valorizacao / 100) ** ano) for ano in anos]
|
198 |
+
renda_acumulada_studio = [capital * (((1 + studio_ret / 100) ** (12 * ano)) - 1) for ano in anos]
|
199 |
+
studio_total = [p + r for p, r in zip(patrimonio_studio, renda_acumulada_studio)]
|
200 |
+
patrimonio_final = patrimonio_studio[-1]
|
201 |
+
|
202 |
+
franquia = [capital + (franquia_ret * ano) for ano in anos]
|
203 |
+
acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
|
204 |
+
renda_fixa_valores = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
|
205 |
+
|
206 |
+
# --- Monta o DataFrame
|
207 |
+
df = pd.DataFrame({
|
208 |
+
"Ano": anos,
|
209 |
+
"Studio (Patrimônio + Renda)": studio_total,
|
210 |
+
"Franquia": franquia,
|
211 |
+
"Ações": acoes,
|
212 |
+
"Renda Fixa": renda_fixa_valores
|
213 |
+
})
|
214 |
+
|
215 |
+
# --- Dicionário final de investimentos
|
216 |
+
investimentos_finais = {
|
217 |
+
"Studio": studio_total[-1],
|
218 |
+
"Franquia": franquia[-1],
|
219 |
+
"Ações": acoes[-1],
|
220 |
+
"Renda Fixa": renda_fixa_valores[-1],
|
221 |
+
}
|
222 |
|
223 |
+
# --- Geração do gráfico
|
224 |
+
buf = io.BytesIO()
|
225 |
+
plt.figure(figsize=(8, 5))
|
226 |
+
plt.plot(anos, studio_total, label="Studio (Patrimônio + Renda)", marker="o")
|
227 |
+
plt.plot(anos, franquia, label="Franquia", marker="o")
|
228 |
+
plt.plot(anos, acoes, label="Ações", marker="o")
|
229 |
+
plt.plot(anos, renda_fixa_valores, label="Renda Fixa", marker="o")
|
230 |
+
plt.title("Projeção de Investimentos (5 anos)")
|
231 |
+
plt.xlabel("Ano")
|
232 |
+
plt.ylabel("Valor (R$)")
|
233 |
+
plt.legend()
|
234 |
+
plt.grid(True)
|
235 |
+
plt.tight_layout()
|
236 |
+
plt.savefig(buf, format="png")
|
237 |
+
buf.seek(0)
|
238 |
+
grafico_base64 = base64.b64encode(buf.read()).decode("utf-8")
|
239 |
+
buf.close()
|
240 |
+
plt.close()
|
241 |
+
|
242 |
+
# --- Formata a tabela
|
243 |
df_formatado = df.copy()
|
244 |
for col in df.columns:
|
245 |
if col != "Ano":
|
246 |
df_formatado[col] = df_formatado[col].apply(formatar_brl)
|
247 |
tabela_html = df_formatado.to_html(index=False, classes="tabela", border=0)
|
248 |
|
249 |
+
# --- Geração da análise com IA
|
250 |
+
analise_final_ia = gerar_analise_ia(investimentos_finais, capital, patrimonio_final)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
251 |
|
252 |
+
# --- Contexto para o PDF
|
253 |
context = {
|
254 |
"capital": capital,
|
255 |
"grafico": grafico_base64,
|
|
|
258 |
"data_hoje": datetime.now().strftime("São Paulo, %d de %B de %Y")
|
259 |
}
|
260 |
|
261 |
+
# --- Renderiza e retorna o PDF
|
262 |
pdf = render_pdf("relatorio.html", context)
|
263 |
if pdf:
|
264 |
return send_file(pdf, mimetype="application/pdf", as_attachment=True, download_name="relatorio_investimento.pdf")
|
265 |
else:
|
|
|
266 |
return "Erro ao gerar PDF", 500
|
267 |
|
268 |
+
except Exception as e:
|
269 |
+
app.logger.error("Erro na rota /gerar-pdf", exc_info=True)
|
270 |
+
return "Erro interno ao gerar o PDF", 500
|
271 |
+
|
272 |
+
|
273 |
|
274 |
if __name__ == "__main__":
|
275 |
app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 7860)), debug=True)
|