Update app.py
Browse files
app.py
CHANGED
|
@@ -31,17 +31,17 @@ def gerar_analise(investimentos_finais, capital, patrimonio_studio_final):
|
|
| 31 |
|
| 32 |
def gerar_analise_ia(investimentos_finais, capital, patrimonio_studio_final):
|
| 33 |
prompt = f"""
|
| 34 |
-
Faça uma análise profissional e detalhada em linguagem clara e acessível sobre os seguintes dados financeiros:
|
| 35 |
-
- Capital inicial: R$ {capital:,.2f}
|
| 36 |
-
- Valor patrimonial final do Studio: R$ {patrimonio_studio_final:,.2f}
|
| 37 |
-
- Investimentos finais após 5 anos:
|
| 38 |
-
"""
|
| 39 |
for nome, valor in investimentos_finais.items():
|
| 40 |
-
prompt += f"
|
| 41 |
|
| 42 |
prompt += """
|
| 43 |
-
Destaque qual foi o melhor investimento, o retorno percentual sobre o capital, e comente sobre possíveis estratégias e perfis de risco. Seja objetivo, claro e com tom consultivo.
|
| 44 |
-
"""
|
| 45 |
|
| 46 |
resposta = openai.ChatCompletion.create(
|
| 47 |
model="gpt-4o",
|
|
@@ -55,26 +55,24 @@ Destaque qual foi o melhor investimento, o retorno percentual sobre o capital, e
|
|
| 55 |
def render_pdf(template_src, context_dict):
|
| 56 |
html = render_template(template_src, **context_dict)
|
| 57 |
result = io.BytesIO()
|
| 58 |
-
#
|
| 59 |
-
pisa_status = pisa.CreatePDF(
|
| 60 |
-
if
|
| 61 |
-
|
| 62 |
-
return
|
| 63 |
-
|
|
|
|
| 64 |
|
| 65 |
@app.route("/", methods=["GET", "POST"])
|
| 66 |
def index():
|
| 67 |
if request.method == "POST":
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
inflacao = float(request.form["inflacao"])
|
| 76 |
-
except (KeyError, ValueError):
|
| 77 |
-
return render_template("index.html", erro="Por favor, preencha todos os campos corretamente.")
|
| 78 |
|
| 79 |
anos = list(range(1, 6))
|
| 80 |
|
|
@@ -126,7 +124,7 @@ def index():
|
|
| 126 |
for col in df.columns:
|
| 127 |
if col != "Ano":
|
| 128 |
df_formatado[col] = df_formatado[col].apply(formatar_brl)
|
| 129 |
-
tabela = df_formatado.to_html(index=False, classes="
|
| 130 |
|
| 131 |
analise_final = gerar_analise(investimentos_finais, capital, patrimonio_studio[-1])
|
| 132 |
|
|
@@ -142,16 +140,13 @@ def index():
|
|
| 142 |
|
| 143 |
@app.route("/gerar-pdf", methods=["POST"])
|
| 144 |
def gerar_pdf():
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
|
| 148 |
-
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
inflacao = float(request.form["inflacao"])
|
| 153 |
-
except (KeyError, ValueError):
|
| 154 |
-
return "Erro: dados inválidos.", 400
|
| 155 |
|
| 156 |
anos = list(range(1, 6))
|
| 157 |
|
|
@@ -178,7 +173,6 @@ def gerar_pdf():
|
|
| 178 |
"Renda Fixa": renda_fixa_valores[-1],
|
| 179 |
}
|
| 180 |
|
| 181 |
-
buf = io.BytesIO()
|
| 182 |
plt.figure(figsize=(8, 5))
|
| 183 |
plt.plot(anos, studio_total, label="Studio (Patrimônio + Renda)", marker="o")
|
| 184 |
plt.plot(anos, franquia, label="Franquia", marker="o")
|
|
@@ -191,6 +185,8 @@ def gerar_pdf():
|
|
| 191 |
plt.grid(True)
|
| 192 |
plt.gca().yaxis.set_major_formatter(FuncFormatter(lambda x, _: f"R${x:,.0f}".replace(",", ".")))
|
| 193 |
plt.tight_layout()
|
|
|
|
|
|
|
| 194 |
plt.savefig(buf, format="png")
|
| 195 |
buf.seek(0)
|
| 196 |
grafico_base64 = base64.b64encode(buf.read()).decode("utf-8")
|
|
@@ -209,7 +205,7 @@ def gerar_pdf():
|
|
| 209 |
"capital": capital,
|
| 210 |
"grafico": grafico_base64,
|
| 211 |
"tabela": tabela_html,
|
| 212 |
-
"analise_final": analise_final_ia
|
| 213 |
"data_hoje": datetime.now().strftime("São Paulo, %d de %B de %Y")
|
| 214 |
}
|
| 215 |
|
|
|
|
| 31 |
|
| 32 |
def gerar_analise_ia(investimentos_finais, capital, patrimonio_studio_final):
|
| 33 |
prompt = f"""
|
| 34 |
+
Faça uma análise profissional e detalhada em linguagem clara e acessível sobre os seguintes dados financeiros:
|
| 35 |
+
- Capital inicial: R$ {capital:,.2f}
|
| 36 |
+
- Valor patrimonial final do Studio: R$ {patrimonio_studio_final:,.2f}
|
| 37 |
+
- Investimentos finais após 5 anos:
|
| 38 |
+
"""
|
| 39 |
for nome, valor in investimentos_finais.items():
|
| 40 |
+
prompt += f" - {nome}: R$ {valor:,.2f}\n"
|
| 41 |
|
| 42 |
prompt += """
|
| 43 |
+
Destaque qual foi o melhor investimento, o retorno percentual sobre o capital, e comente sobre possíveis estratégias e perfis de risco. Seja objetivo, claro e com tom consultivo.
|
| 44 |
+
"""
|
| 45 |
|
| 46 |
resposta = openai.ChatCompletion.create(
|
| 47 |
model="gpt-4o",
|
|
|
|
| 55 |
def render_pdf(template_src, context_dict):
|
| 56 |
html = render_template(template_src, **context_dict)
|
| 57 |
result = io.BytesIO()
|
| 58 |
+
# Passa o HTML diretamente para CreatePDF (mais confiável)
|
| 59 |
+
pisa_status = pisa.CreatePDF(src=html, dest=result)
|
| 60 |
+
if pisa_status.err:
|
| 61 |
+
print(f"[ERRO] Pisa CreatePDF falhou com código: {pisa_status.err}")
|
| 62 |
+
return None
|
| 63 |
+
result.seek(0)
|
| 64 |
+
return result
|
| 65 |
|
| 66 |
@app.route("/", methods=["GET", "POST"])
|
| 67 |
def index():
|
| 68 |
if request.method == "POST":
|
| 69 |
+
capital = float(request.form["capital"])
|
| 70 |
+
studio_ret = float(request.form["studio_ret"])
|
| 71 |
+
valorizacao = float(request.form["valorizacao"])
|
| 72 |
+
franquia_ret = float(request.form["franquia_ret"])
|
| 73 |
+
acoes_ret = float(request.form["acoes_ret"])
|
| 74 |
+
renda_fixa = float(request.form["renda_fixa"])
|
| 75 |
+
inflacao = float(request.form["inflacao"])
|
|
|
|
|
|
|
|
|
|
| 76 |
|
| 77 |
anos = list(range(1, 6))
|
| 78 |
|
|
|
|
| 124 |
for col in df.columns:
|
| 125 |
if col != "Ano":
|
| 126 |
df_formatado[col] = df_formatado[col].apply(formatar_brl)
|
| 127 |
+
tabela = df_formatado.to_html(index=False, classes="table table-striped table-sm text-end", border=0)
|
| 128 |
|
| 129 |
analise_final = gerar_analise(investimentos_finais, capital, patrimonio_studio[-1])
|
| 130 |
|
|
|
|
| 140 |
|
| 141 |
@app.route("/gerar-pdf", methods=["POST"])
|
| 142 |
def gerar_pdf():
|
| 143 |
+
capital = float(request.form["capital"])
|
| 144 |
+
studio_ret = float(request.form["studio_ret"])
|
| 145 |
+
valorizacao = float(request.form["valorizacao"])
|
| 146 |
+
franquia_ret = float(request.form["franquia_ret"])
|
| 147 |
+
acoes_ret = float(request.form["acoes_ret"])
|
| 148 |
+
renda_fixa = float(request.form["renda_fixa"])
|
| 149 |
+
inflacao = float(request.form["inflacao"])
|
|
|
|
|
|
|
|
|
|
| 150 |
|
| 151 |
anos = list(range(1, 6))
|
| 152 |
|
|
|
|
| 173 |
"Renda Fixa": renda_fixa_valores[-1],
|
| 174 |
}
|
| 175 |
|
|
|
|
| 176 |
plt.figure(figsize=(8, 5))
|
| 177 |
plt.plot(anos, studio_total, label="Studio (Patrimônio + Renda)", marker="o")
|
| 178 |
plt.plot(anos, franquia, label="Franquia", marker="o")
|
|
|
|
| 185 |
plt.grid(True)
|
| 186 |
plt.gca().yaxis.set_major_formatter(FuncFormatter(lambda x, _: f"R${x:,.0f}".replace(",", ".")))
|
| 187 |
plt.tight_layout()
|
| 188 |
+
|
| 189 |
+
buf = io.BytesIO()
|
| 190 |
plt.savefig(buf, format="png")
|
| 191 |
buf.seek(0)
|
| 192 |
grafico_base64 = base64.b64encode(buf.read()).decode("utf-8")
|
|
|
|
| 205 |
"capital": capital,
|
| 206 |
"grafico": grafico_base64,
|
| 207 |
"tabela": tabela_html,
|
| 208 |
+
"analise_final": analise_final_ia,
|
| 209 |
"data_hoje": datetime.now().strftime("São Paulo, %d de %B de %Y")
|
| 210 |
}
|
| 211 |
|