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)