File size: 6,566 Bytes
8773908 03a48f1 0586bcf c5a9b0c b107c50 03a48f1 276f84f c009ac1 03a48f1 c5436c5 03a48f1 8773908 03a48f1 8773908 c5a9b0c b107c50 8773908 03a48f1 8773908 03a48f1 8773908 b107c50 03a48f1 8773908 03a48f1 0586bcf c5a9b0c c009ac1 b107c50 c5a9b0c b107c50 03a48f1 b107c50 c5436c5 8773908 03a48f1 b107c50 03a48f1 c5a9b0c 03a48f1 8773908 03a48f1 0aeb759 61b6886 03a48f1 0aeb759 0586bcf 61b6886 0586bcf c5436c5 8773908 |
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 |
import os
# Corrige problema fontconfig
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_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)
# Corrige inflação
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') # estilo moderno simples
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)
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)
# Não salva em disco: evita erro de permissão
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:
import traceback
tb = traceback.format_exc()
return f"Erro: {e}\n\n{tb}"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=7860, debug=True)
|