|
|
|
|
|
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 io |
|
import base64 |
|
from datetime import datetime |
|
import pandas as pd |
|
|
|
app = Flask(__name__) |
|
|
|
|
|
def formatar_brl(valor): |
|
return f"R$ {valor:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".") |
|
|
|
|
|
def gerar_grafico(valores, labels): |
|
plt.figure(figsize=(8,4)) |
|
for label in labels: |
|
plt.plot(valores['Ano'], valores[label], label=label) |
|
plt.title("Projeção dos Investimentos ao longo dos anos") |
|
plt.xlabel("Ano") |
|
plt.ylabel("Valor (R$)") |
|
plt.legend() |
|
plt.grid(True) |
|
plt.tight_layout() |
|
|
|
img = io.BytesIO() |
|
plt.savefig(img, format='png') |
|
plt.close() |
|
img.seek(0) |
|
img_base64 = base64.b64encode(img.getvalue()).decode() |
|
return img_base64 |
|
|
|
|
|
@app.route("/", methods=["GET", "POST"]) |
|
def index(): |
|
if request.method == "POST": |
|
try: |
|
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 = int(request.form["anos"]) |
|
|
|
|
|
anos_lista = list(range(0, anos + 1)) |
|
|
|
df = pd.DataFrame({"Ano": anos_lista}) |
|
|
|
df["Studio"] = capital * ((1 + (studio_ret + valorizacao)/100) ** df["Ano"]) |
|
|
|
df["Franquia"] = capital + franquia_ret * df["Ano"] |
|
|
|
df["Ações"] = capital * ((1 + acoes_ret/100) ** df["Ano"]) |
|
|
|
df["Renda Fixa"] = capital * ((1 + renda_fixa/100) ** df["Ano"]) |
|
|
|
|
|
valores_finais = df.iloc[-1, 1:] |
|
investimento_mais_valorizado = valores_finais.idxmax() |
|
valor_mais_alto = valores_finais.max() |
|
|
|
|
|
resumo = [] |
|
for investimento in ["Studio", "Franquia", "Ações", "Renda Fixa"]: |
|
valor_final = valores_finais[investimento] |
|
retorno_abs = valor_final - capital |
|
retorno_pct = (retorno_abs / capital) * 100 |
|
resumo.append({ |
|
"Investimento": investimento, |
|
"Valor Final": formatar_brl(valor_final), |
|
"Retorno Absoluto": formatar_brl(retorno_abs), |
|
"Retorno (%)": f"{retorno_pct:.2f}%" |
|
}) |
|
|
|
|
|
tabela_html = """ |
|
<table> |
|
<thead> |
|
<tr> |
|
<th style="text-align:left;">Investimento</th> |
|
<th>Valor Final</th> |
|
<th>Retorno Absoluto</th> |
|
<th>Retorno (%)</th> |
|
</tr> |
|
</thead> |
|
<tbody> |
|
""" |
|
for r in resumo: |
|
tabela_html += f""" |
|
<tr> |
|
<td style="text-align:left;">{r['Investimento']}</td> |
|
<td>{r['Valor Final']}</td> |
|
<td>{r['Retorno Absoluto']}</td> |
|
<td>{r['Retorno (%)']}</td> |
|
</tr> |
|
""" |
|
tabela_html += "</tbody></table>" |
|
|
|
|
|
img_base64 = gerar_grafico(df, ["Studio", "Franquia", "Ações", "Renda Fixa"]) |
|
|
|
analise_final = (f"Após análise dos cenários projetados para {anos} anos, o investimento " |
|
f"<strong>{investimento_mais_valorizado}</strong> apresenta o melhor desempenho, " |
|
f"com um valor final estimado de <strong>{formatar_brl(valor_mais_alto)}</strong>, " |
|
"equivalente a um retorno significativo sobre o capital inicial.") |
|
|
|
comentario_extra = None |
|
|
|
return render_template("relatorio.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, |
|
resumo=resumo, |
|
tabela_html=tabela_html, |
|
grafico=img_base64, |
|
analise_final=analise_final, |
|
comentario_extra=comentario_extra, |
|
investimento_mais_valorizado=investimento_mais_valorizado, |
|
valor_mais_alto=valor_mais_alto, |
|
now=datetime.now(), |
|
formatar_brl=formatar_brl) |
|
except Exception as e: |
|
return f"Erro no processamento: {e}" |
|
|
|
|
|
return ''' |
|
<h2>Simulação de Investimentos</h2> |
|
<form method="post"> |
|
<label>Capital Inicial (R$): <input name="capital" type="number" step="0.01" value="100000" required></label><br><br> |
|
<label>Retorno Studio (% ao ano): <input name="studio_ret" type="number" step="0.01" value="8" required></label><br><br> |
|
<label>Valorização Studio (% ao ano): <input name="valorizacao" type="number" step="0.01" value="5" required></label><br><br> |
|
<label>Retorno Franquia (R$ ao ano): <input name="franquia_ret" type="number" step="0.01" value="7000" required></label><br><br> |
|
<label>Retorno Ações (% ao ano): <input name="acoes_ret" type="number" step="0.01" value="10" required></label><br><br> |
|
<label>Retorno Renda Fixa (% ao ano): <input name="renda_fixa" type="number" step="0.01" value="6" required></label><br><br> |
|
<label>Inflação (% ao ano): <input name="inflacao" type="number" step="0.01" value="4" required></label><br><br> |
|
<label>Anos de Projeção: <input name="anos" type="number" value="5" required></label><br><br> |
|
<button type="submit">Gerar Relatório</button> |
|
</form> |
|
''' |
|
|
|
|
|
@app.route("/relatorio") |
|
def relatorio(): |
|
|
|
|
|
return "Acesse a página inicial e preencha o formulário para gerar o relatório." |
|
|
|
|
|
from flask import make_response |
|
import pdfkit |
|
|
|
@app.route("/download_pdf", methods=["POST"]) |
|
def download_pdf(): |
|
try: |
|
|
|
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 = int(request.form["anos"]) |
|
|
|
|
|
anos_lista = list(range(0, anos + 1)) |
|
|
|
df = pd.DataFrame({"Ano": anos_lista}) |
|
df["Studio"] = capital * ((1 + (studio_ret + valorizacao)/100) ** df["Ano"]) |
|
df["Franquia"] = capital + franquia_ret * df["Ano"] |
|
df["Ações"] = capital * ((1 + acoes_ret/100) ** df["Ano"]) |
|
df["Renda Fixa"] = capital * ((1 + renda_fixa/100) ** df["Ano"]) |
|
|
|
valores_finais = df.iloc[-1, 1:] |
|
investimento_mais_valorizado = valores_finais.idxmax() |
|
valor_mais_alto = valores_finais.max() |
|
|
|
resumo = [] |
|
for investimento in ["Studio", "Franquia", "Ações", "Renda Fixa"]: |
|
valor_final = valores_finais[investimento] |
|
retorno_abs = valor_final - capital |
|
retorno_pct = (retorno_abs / capital) * 100 |
|
resumo.append({ |
|
"Investimento": investimento, |
|
"Valor Final": formatar_brl(valor_final), |
|
"Retorno Absoluto": formatar_brl(retorno_abs), |
|
"Retorno (%)": f"{retorno_pct:.2f}%" |
|
}) |
|
|
|
tabela_html = """ |
|
<table> |
|
<thead> |
|
<tr> |
|
<th style="text-align:left;">Investimento</th> |
|
<th>Valor Final</th> |
|
<th>Retorno Absoluto</th> |
|
<th>Retorno (%)</th> |
|
</tr> |
|
</thead> |
|
<tbody> |
|
""" |
|
for r in resumo: |
|
tabela_html += f""" |
|
<tr> |
|
<td style="text-align:left;">{r['Investimento']}</td> |
|
<td>{r['Valor Final']}</td> |
|
<td>{r['Retorno Absoluto']}</td> |
|
<td>{r['Retorno (%)']}</td> |
|
</tr> |
|
""" |
|
tabela_html += "</tbody></table>" |
|
|
|
img_base64 = gerar_grafico(df, ["Studio", "Franquia", "Ações", "Renda Fixa"]) |
|
|
|
analise_final = (f"Após análise dos cenários projetados para {anos} anos, o investimento " |
|
f"<strong>{investimento_mais_valorizado}</strong> apresenta o melhor desempenho, " |
|
f"com um valor final estimado de <strong>{formatar_brl(valor_mais_alto)}</strong>, " |
|
"equivalente a um retorno significativo sobre o capital inicial.") |
|
|
|
consideracoes_finais = f""" |
|
<h2>Considerações Finais</h2> |
|
<p>{analise_final}</p> |
|
<p> |
|
O investimento que apresentou o maior retorno neste cenário foi o <strong>{investimento_mais_valorizado}</strong>, |
|
atingindo um valor patrimonial final estimado em <strong>{formatar_brl(valor_mais_alto)}</strong>. |
|
</p> |
|
<p> |
|
<strong>Valor Patrimonial</strong> refere-se ao valor total acumulado do investimento, incluindo a valorização do ativo e os rendimentos obtidos ao longo do tempo. |
|
Conforme as normas contábeis e práticas de avaliação de investidores profissionais, o valor patrimonial é fundamental para mensurar a saúde financeira e o crescimento do patrimônio líquido do investidor. |
|
Ele serve como indicador da capacidade do investimento de gerar riqueza real, levando em conta tanto a valorização de mercado quanto a geração de renda. |
|
</p> |
|
""" |
|
|
|
html = f""" |
|
<html> |
|
<head> |
|
<meta charset="utf-8"> |
|
<style> |
|
body {{ font-family: Arial, sans-serif; font-size: 14px; margin: 20px; }} |
|
h2 {{ color: #2c3e50; }} |
|
table {{ width: 100%; border-collapse: collapse; margin-top: 20px; }} |
|
th, td {{ border: 1px solid #ccc; padding: 6px; text-align: right; }} |
|
th {{ background-color: #f0f0f0; }} |
|
.destaque {{ background: #e8f5e9; padding: 10px; margin-top: 20px; border-left: 6px solid #2e7d32; }} |
|
</style> |
|
</head> |
|
<body> |
|
<h2>Relatório de Simulação de Investimentos</h2> |
|
<p>Data da Simulação: {datetime.today().strftime('%d/%m/%Y')}</p> |
|
<p>Capital Inicial: <strong>{formatar_brl(capital)}</strong></p> |
|
|
|
<h3>Dados de Entrada</h3> |
|
<table> |
|
<tr><th>Parâmetro</th><th>Valor</th></tr> |
|
<tr><td>Retorno Studio (%)</td><td>{studio_ret}%</td></tr> |
|
<tr><td>Valorização Studio (%)</td><td>{valorizacao}%</td></tr> |
|
<tr><td>Retorno Franquia (R$)</td><td>{formatar_brl(franquia_ret)}</td></tr> |
|
<tr><td>Retorno Ações (%)</td><td>{acoes_ret}%</td></tr> |
|
<tr><td>Retorno Renda Fixa (%)</td><td>{renda_fixa}%</td></tr> |
|
<tr><td>Inflação (%)</td><td>{inflacao}%</td></tr> |
|
</table> |
|
|
|
<div class="destaque">{analise_final}</div> |
|
|
|
<img src="data:image/png;base64,{img_base64}" width="100%" /> |
|
|
|
<h3>Resumo dos Investimentos</h3> |
|
{tabela_html} |
|
|
|
{consideracoes_finais} |
|
</body> |
|
</html> |
|
""" |
|
|
|
|
|
options = { |
|
'encoding': 'UTF-8', |
|
'page-size': 'A4', |
|
'margin-top': '10mm', |
|
'margin-bottom': '10mm', |
|
'margin-left': '10mm', |
|
'margin-right': '10mm', |
|
} |
|
pdf = pdfkit.from_string(html, False, options=options) |
|
|
|
response = make_response(pdf) |
|
response.headers['Content-Type'] = 'application/pdf' |
|
response.headers['Content-Disposition'] = 'attachment; filename=relatorio_investimentos.pdf' |
|
return response |
|
except Exception as e: |
|
return f"Erro na geração do PDF: {e}" |
|
|
|
if __name__ == '__main__': |
|
app.run(host='0.0.0.0', port=7860, debug=True) |
|
|