File size: 6,836 Bytes
091ac8c 75098b5 a131519 5e13118 4250b25 5e13118 b107c50 5e13118 848327c c009ac1 76663a7 200b8a3 dbfe4cd 200b8a3 dbfe4cd 200b8a3 dbfe4cd 200b8a3 5e13118 4250b25 5e13118 ee2108e 4250b25 5e13118 4250b25 5e13118 a131519 dbfe4cd 5e13118 dbfe4cd 5e13118 200b8a3 dbfe4cd 5e13118 a131519 5e13118 200b8a3 dbfe4cd 5e13118 dbfe4cd 6fd651d 200b8a3 76663a7 6fd651d 200b8a3 6fd651d dbfe4cd 200b8a3 6fd651d 4250b25 03a48f1 5e13118 4250b25 dbfe4cd 965bdc3 336130e dbfe4cd 336130e 6fd651d 5e13118 dbfe4cd 6fd651d 4250b25 5e13118 dbfe4cd 5e13118 200b8a3 dbfe4cd 5e13118 dbfe4cd 52f0241 76663a7 52f0241 dbfe4cd 965bdc3 dbfe4cd 200b8a3 965bdc3 f6d248f dbfe4cd 965bdc3 dbfe4cd 200b8a3 6fd651d f6d248f 4250b25 dbfe4cd f6d248f dbfe4cd fad6f0f dbfe4cd 200b8a3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
import os
os.environ['FONTCONFIG_PATH'] = '/tmp/fontconfig'
os.makedirs('/tmp/fontconfig', exist_ok=True)
from flask import Flask, render_template, request, send_file
import matplotlib.pyplot as plt
import pandas as pd
import io
import base64
from matplotlib.ticker import FuncFormatter
from xhtml2pdf import pisa
from datetime import datetime
app = Flask(__name__)
def formatar_brl(valor):
"""Formata número para moeda brasileira: R$ 1.234,56"""
return f"R$ {valor:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".")
def gerar_analise(investimentos_finais, capital):
melhor = max(investimentos_finais, key=investimentos_finais.get)
valor_melhor = investimentos_finais[melhor]
retorno_pct = ((valor_melhor - capital) / capital) * 100
return f"""
Após análise dos cenários projetados para 5 anos, o investimento <strong>{melhor}</strong> apresenta o melhor desempenho,
com valor final estimado de <strong>{formatar_brl(valor_melhor)}</strong>, equivalente a um retorno de <strong>{retorno_pct:.1f}%</strong>.
"""
def gerar_grafico(anos, studio, franquia, acoes, renda_fixa, studio_inflacao):
plt.switch_backend('Agg') # backend sem display
plt.figure(figsize=(8,5))
plt.plot(anos, studio, label="Studio", marker="o")
plt.plot(anos, franquia, label="Franquia", marker="o")
plt.plot(anos, acoes, label="Ações", marker="o")
plt.plot(anos, renda_fixa, label="Renda Fixa", marker="o")
plt.plot(anos, studio_inflacao, label="Studio c/ Inflação", linestyle="--", marker="o")
plt.title("Projeção de Investimentos")
plt.xlabel("Ano")
plt.ylabel("Valor (R$)")
plt.legend()
plt.grid(True)
plt.gca().yaxis.set_major_formatter(FuncFormatter(lambda x, _: f"R${x:,.0f}".replace(",", ".")))
plt.tight_layout()
buf = io.BytesIO()
plt.savefig(buf, format='png')
plt.close()
buf.seek(0)
return base64.b64encode(buf.read()).decode('utf-8')
@app.route("/", methods=["GET", "POST"])
def index():
if request.method == "POST":
capital = float(request.form["capital"])
studio_ret = float(request.form["studio_ret"])
valorizacao = float(request.form["valorizacao"])
franquia_ret = float(request.form["franquia_ret"])
acoes_ret = float(request.form["acoes_ret"])
renda_fixa = float(request.form["renda_fixa"])
inflacao = float(request.form["inflacao"])
anos = list(range(1, 6))
studio = [capital * ((1 + studio_ret / 100) ** (12 * ano)) for ano in anos]
franquia = [capital + (franquia_ret * ano) for ano in anos]
acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
renda_fixa_valores = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
studio_inflacao = [v / ((1 + inflacao / 100) ** ano) for v, ano in zip(studio, anos)]
df = pd.DataFrame({
"Ano": anos,
"Studio": studio,
"Franquia": franquia,
"Ações": acoes,
"Renda Fixa": renda_fixa_valores,
"Studio c/ Inflação": studio_inflacao,
})
investimentos_finais = {
"Studio": studio[-1],
"Franquia": franquia[-1],
"Ações": acoes[-1],
"Renda Fixa": renda_fixa_valores[-1],
}
grafico = gerar_grafico(anos, studio, franquia, acoes, renda_fixa_valores, studio_inflacao)
# Formatação da tabela para exibição HTML
df_formatado = df.copy()
for col in ["Studio", "Franquia", "Ações", "Renda Fixa", "Studio c/ Inflação"]:
df_formatado[col] = df_formatado[col].apply(formatar_brl)
tabela = df_formatado.to_html(index=False, classes="table table-striped table-sm", border=0)
analise_final = gerar_analise(investimentos_finais, capital)
return render_template(
"index.html",
capital=capital,
studio_ret=studio_ret,
valorizacao=valorizacao,
franquia_ret=franquia_ret,
acoes_ret=acoes_ret,
renda_fixa=renda_fixa,
inflacao=inflacao,
anos=anos,
tabela=tabela,
grafico=grafico,
analise_final=analise_final,
)
return render_template("index.html")
@app.route("/download_pdf", methods=["POST"])
def download_pdf():
# Mesmos dados do POST
capital = float(request.form["capital"])
studio_ret = float(request.form["studio_ret"])
valorizacao = float(request.form["valorizacao"])
franquia_ret = float(request.form["franquia_ret"])
acoes_ret = float(request.form["acoes_ret"])
renda_fixa = float(request.form["renda_fixa"])
inflacao = float(request.form["inflacao"])
anos = list(range(1, 6))
studio = [capital * ((1 + studio_ret / 100) ** (12 * ano)) for ano in anos]
franquia = [capital + (franquia_ret * ano) for ano in anos]
acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
renda_fixa_valores = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
df = pd.DataFrame({
"Ano": anos,
"Studio": studio,
"Franquia": franquia,
"Ações": acoes,
"Renda Fixa": renda_fixa_valores,
})
investimentos_finais = {
"Studio": studio[-1],
"Franquia": franquia[-1],
"Ações": acoes[-1],
"Renda Fixa": renda_fixa_valores[-1],
}
grafico = gerar_grafico(anos, studio, franquia, acoes, renda_fixa_valores, [0]*len(anos)) # Passa lista zero só para gráfico com 4 linhas
# Formatar tabela para PDF (sem coluna "Studio c/ Inflação")
df_formatado = df.copy()
for col in ["Studio", "Franquia", "Ações", "Renda Fixa"]:
df_formatado[col] = df_formatado[col].apply(formatar_brl)
tabela_html = df_formatado.to_html(index=False, border=1, classes="table table-sm table-bordered")
analise_final = gerar_analise(investimentos_finais, capital)
html = render_template(
"relatorio_pdf.html",
capital=capital,
studio_ret=studio_ret,
valorizacao=valorizacao,
franquia_ret=franquia_ret,
acoes_ret=acoes_ret,
renda_fixa=renda_fixa,
inflacao=inflacao,
anos=anos,
tabela=tabela_html,
grafico=grafico,
analise_final=analise_final,
now=datetime.now()
)
pdf_buffer = io.BytesIO()
pisa_status = pisa.CreatePDF(io.StringIO(html), dest=pdf_buffer)
if pisa_status.err:
return "Erro ao gerar PDF", 500
pdf_buffer.seek(0)
return send_file(
pdf_buffer,
mimetype="application/pdf",
as_attachment=True,
download_name="relatorio_investimentos.pdf"
)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=7860, debug=True)
|