|
import os |
|
|
|
|
|
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) |
|
|
|
|
|
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) |
|
|
|
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) |
|
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) |
|
|
|
|