File size: 7,048 Bytes
091ac8c 57521f3 75098b5 091ac8c 75098b5 4d9884a 75098b5 b107c50 03a48f1 276f84f 88b5b11 c009ac1 75098b5 57521f3 75098b5 57521f3 75098b5 57521f3 75098b5 57521f3 75098b5 57521f3 75098b5 57521f3 75098b5 23e60da 75098b5 57521f3 75098b5 57521f3 8773908 75098b5 57521f3 8773908 75098b5 03a48f1 8773908 b107c50 03a48f1 8773908 03a48f1 75098b5 c5a9b0c c009ac1 75098b5 c5a9b0c b107c50 75098b5 b107c50 23e60da 75098b5 b107c50 03a48f1 75098b5 23e60da 75098b5 5fe396b 03a48f1 75098b5 03a48f1 57521f3 75098b5 57521f3 75098b5 f501264 03a48f1 75098b5 45c466d 0586bcf 75098b5 |
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 |
import os
# Corrige problema fontconfig (necessário para WeasyPrint em alguns ambientes)
os.environ['FONTCONFIG_PATH'] = '/tmp/fontconfig'
os.makedirs('/tmp/fontconfig', exist_ok=True)
from flask import Flask, render_template, request, send_file, make_response
import matplotlib.pyplot as plt
import pandas as pd
import io
import base64
from weasyprint import HTML
app = Flask(__name__)
def gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, anos=10, inflacao=4.5):
data = []
cap_studio = capital
cap_acoes = capital
cap_renda = capital
cap_franquia = capital
for ano in range(anos + 1):
if ano == 0:
studio_valor = cap_studio
acoes_valor = cap_acoes
renda_valor = cap_renda
franquia_valor = cap_franquia
else:
# Renda de aluguel anual (studio_ret é mensal)
renda_aluguel = cap_studio * (studio_ret / 100) * 12
cap_studio += renda_aluguel
cap_studio *= (1 + valorizacao / 100)
cap_franquia += franquia_ret
cap_acoes *= (1 + acoes_ret / 100)
cap_renda *= (1 + renda_fixa / 100)
# Ajusta pela inflação anual
cap_studio /= (1 + inflacao / 100)
cap_acoes /= (1 + inflacao / 100)
cap_renda /= (1 + inflacao / 100)
cap_franquia /= (1 + inflacao / 100)
studio_valor = cap_studio
franquia_valor = cap_franquia
acoes_valor = cap_acoes
renda_valor = cap_renda
data.append({
"Ano": ano,
"Studio (R$)": round(studio_valor, 2),
"Franquia (R$)": round(franquia_valor, 2),
"Ações (R$)": round(acoes_valor, 2),
"Renda Fixa (R$)": round(renda_valor, 2),
})
return pd.DataFrame(data)
def plotar_grafico(df):
plt.style.use('ggplot')
fig, ax = plt.subplots(figsize=(10, 6))
cores = ['#2c3e50', '#16a085', '#2980b9', '#8e44ad']
for i, col in enumerate(df.columns[1:]):
ax.plot(df['Ano'], df[col], label=col, color=cores[i], linewidth=2)
ax.set_title('Comparação de Investimentos (valores corrigidos pela inflação)', fontsize=14, fontweight='bold')
ax.set_xlabel('Ano', fontsize=12)
ax.set_ylabel('Valor (R$)', fontsize=12)
ax.legend()
ax.grid(True, linestyle='--', alpha=0.7)
plt.tight_layout()
img = io.BytesIO()
plt.savefig(img, format='png', dpi=150)
plt.close(fig)
img.seek(0)
img_base64 = base64.b64encode(img.read()).decode()
return img_base64
@app.route('/', methods=['GET', 'POST'])
def index():
grafico = None
df = None
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'])
df = gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao=inflacao)
grafico = plotar_grafico(df)
return render_template('index.html', grafico=grafico, tabela=df.to_html(classes="table table-striped table-hover", index=False),
capital=capital, studio_ret=studio_ret, valorizacao=valorizacao, franquia_ret=franquia_ret,
acoes_ret=acoes_ret, renda_fixa=renda_fixa, inflacao=inflacao)
except Exception as e:
return f"Erro: {e}"
return render_template('index.html')
@app.route('/download_excel', methods=['POST'])
def download_excel():
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'])
df = gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao=inflacao)
output = io.BytesIO()
with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
df.to_excel(writer, sheet_name='Simulação', index=False)
output.seek(0)
return send_file(output,
as_attachment=True,
download_name="simulacao_investimentos.xlsx",
mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
except Exception as e:
return f"Erro: {e}"
@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'])
df = gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao=inflacao)
grafico = plotar_grafico(df)
# Calcula o investimento mais valorizado para o destaque do relatório
valores_finais = df.iloc[-1, 1:] # pega a última linha, exceto a coluna 'Ano'
investimento_mais_valorizado = valores_finais.idxmax()
valor_mais_alto = valores_finais.max()
html_content = render_template('relatorio.html',
tabela=df.to_html(classes="table table-striped table-hover", index=False),
grafico=grafico,
capital=capital,
studio_ret=studio_ret,
valorizacao=valorizacao,
franquia_ret=franquia_ret,
acoes_ret=acoes_ret,
renda_fixa=renda_fixa,
inflacao=inflacao,
df=df,
investimento_mais_valorizado=investimento_mais_valorizado,
valor_mais_alto=valor_mais_alto)
pdf = HTML(string=html_content).write_pdf()
response = make_response(pdf)
response.headers['Content-Type'] = 'application/pdf'
response.headers['Content-Disposition'] = 'attachment; filename=relatorio_simulacao.pdf'
return response
except Exception as e:
return f"Erro: {e}"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=7860, debug=True)
|