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 pandas as pd import io import base64 from matplotlib.ticker import FuncFormatter from xhtml2pdf import pisa from datetime import datetime app = Flask(__name__) def formatar_brl(valor): return f"R$ {valor:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".") def gerar_analise(investimentos_finais, capital): melhor = max(investimentos_finais, key=investimentos_finais.get) valor_melhor = investimentos_finais[melhor] retorno_pct = ((valor_melhor - capital) / capital) * 100 analise = f""" Após análise dos cenários projetados para 5 anos, o investimento {melhor} apresenta o melhor desempenho, com um valor final estimado de {formatar_brl(valor_melhor)}, equivalente a um retorno de {retorno_pct:.1f}%. """ return analise def gerar_consideracoes_finais(): return """
Esta simulação compara quatro estratégias de investimento ao longo de 5 anos: studio (com renda e valorização), franquia, ações e renda fixa. A principal vantagem observada na estratégia do studio está na composição de dois pilares: renda passiva mensal (aluguéis) e valorização patrimonial do imóvel. Esse modelo resulta em um crescimento acelerado e composto ao longo do tempo.
A franquia apresenta um retorno estável, baseado em um lucro fixo anual, mas sem reinvestimento dos ganhos. Já os investimentos em ações simulam retornos compostos anuais, com potencial mais elevado, porém com maior exposição a riscos. Por fim, a renda fixa representa uma alternativa mais conservadora, com crescimento previsível e menor oscilação.
É importante destacar que o valor patrimonial representa a soma do capital inicial e os rendimentos acumulados (ou valor de revenda do ativo). Investimentos que geram renda recorrente e se valorizam ao longo do tempo, como o studio, tendem a maximizar esse patrimônio. Porém, a escolha da estratégia ideal depende do perfil do investidor, tolerância a riscos e objetivos financeiros.
Este relatório tem caráter informativo e os valores simulados não representam garantias de retorno futuro.
""" @app.route("/", methods=["GET", "POST"]) def index(): if request.method == "POST": 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 = list(range(1, 6)) patrimonio_studio = [capital * ((1 + valorizacao / 100) ** ano) for ano in anos] renda_acumulada_studio = [capital * (((1 + studio_ret / 100) ** (12 * ano)) - 1) for ano in anos] studio_total = [p + r for p, r in zip(patrimonio_studio, renda_acumulada_studio)] franquia = [capital + (franquia_ret * ano) for ano in anos] acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos] renda_fixa_valores = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos] dados = { "Ano": anos, "Studio (Patrimônio + Renda)": studio_total, "Franquia": franquia, "Ações": acoes, "Renda Fixa": renda_fixa_valores } df = pd.DataFrame(dados) investimentos_finais = { "Studio": studio_total[-1], "Franquia": franquia[-1], "Ações": acoes[-1], "Renda Fixa": renda_fixa_valores[-1], } investimento_mais_valorizado = max(investimentos_finais, key=investimentos_finais.get) valor_mais_alto = investimentos_finais[investimento_mais_valorizado] plt.figure(figsize=(8, 5)) plt.plot(anos, studio_total, label="Studio (Patrimônio + Renda)", marker="o") plt.plot(anos, franquia, label="Franquia", marker="o") plt.plot(anos, acoes, label="Ações", marker="o") plt.plot(anos, renda_fixa_valores, label="Renda Fixa", marker="o") plt.title("Projeção de Investimentos") plt.xlabel("Ano") plt.ylabel("Valor (R$)") plt.legend() plt.grid(True) def formatar_moeda(x, _): return f"R${x:,.0f}".replace(",", ".") plt.gca().yaxis.set_major_formatter(FuncFormatter(formatar_moeda)) plt.tight_layout() buf = io.BytesIO() plt.savefig(buf, format="png") buf.seek(0) grafico_base64 = base64.b64encode(buf.getvalue()).decode("utf-8") buf.close() plt.close() df_formatado = df.copy() for col in df.columns: if col != "Ano": df_formatado[col] = df_formatado[col].apply(formatar_brl) tabela = df_formatado.to_html(index=False, classes="table table-striped table-sm", border=0) analise_final = gerar_analise(investimentos_finais, capital) resumo = [] for nome, valor_final in investimentos_finais.items(): retorno_abs = valor_final - capital retorno_pct = (retorno_abs / capital) * 100 resumo.append({ "Investimento": nome, "Valor Final": formatar_brl(valor_final), "Retorno Absoluto": formatar_brl(retorno_abs), "Retorno (%)": f"{retorno_pct:.1f}%" }) resumo = sorted(resumo, key=lambda x: float(x["Retorno (%)"].replace("%", "").replace(",", ".")), reverse=True) diferenca_pct = float(resumo[0]["Retorno (%)"].replace("%", "").replace(",", ".")) - float(resumo[1]["Retorno (%)"].replace("%", "").replace(",", ".")) comentario_extra = "" if diferenca_pct < 5: comentario_extra = f""" Apesar do {resumo[0]['Investimento']} ter se destacado, a diferença em relação ao segundo colocado ({resumo[1]['Investimento']}) foi de apenas {diferenca_pct:.1f} pontos percentuais. Isso indica que ambas as estratégias podem ser consideradas, dependendo do perfil de risco e objetivos do investidor. """ return render_template( "index.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, tabela=tabela, grafico=grafico_base64, investimento_mais_valorizado=investimento_mais_valorizado, valor_mais_alto=valor_mais_alto, analise_final=analise_final, comentario_extra=comentario_extra, resumo=resumo ) return render_template("index.html") @app.route("/download_pdf", methods=["POST"]) def download_pdf(): # Leitura dos dados do formulário 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 = list(range(1, 6)) # Cálculo investimentos patrimonio_studio = [capital * ((1 + valorizacao / 100) ** ano) for ano in anos] renda_acumulada_studio = [capital * (((1 + studio_ret / 100) ** (12 * ano)) - 1) for ano in anos] studio_total = [p + r for p, r in zip(patrimonio_studio, renda_acumulada_studio)] franquia = [capital + (franquia_ret * ano) for ano in anos] acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos] renda_fixa_valores = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos] investimentos_finais = { "Studio": studio_total[-1], "Franquia": franquia[-1], "Ações": acoes[-1], "Renda Fixa": renda_fixa_valores[-1], } investimento_mais_valorizado = max(investimentos_finais, key=investimentos_finais.get) valor_mais_alto = investimentos_finais[investimento_mais_valorizado] # Tabela detalhada dos anos dados = { "Ano": anos, "Studio (Patrimônio + Renda)": studio_total, "Franquia": franquia, "Ações": acoes, "Renda Fixa": renda_fixa_valores } df = pd.DataFrame(dados) # Formatar valores para BRL df_formatado = df.copy() for col in df.columns: if col != "Ano": df_formatado[col] = df_formatado[col].apply(formatar_brl) tabela_html = df_formatado.to_html(index=False, border=0) # Gerar gráfico plt.figure(figsize=(8, 5)) plt.plot(anos, studio_total, label="Studio (Patrimônio + Renda)", marker="o") plt.plot(anos, franquia, label="Franquia", marker="o") plt.plot(anos, acoes, label="Ações", marker="o") plt.plot(anos, renda_fixa_valores, label="Renda Fixa", marker="o") plt.title("Projeção de Investimentos (5 anos)") plt.xlabel("Ano") plt.ylabel("Valor (R$)") plt.legend() plt.grid(True) plt.gca().yaxis.set_major_formatter(FuncFormatter(lambda x, _: f"R${x:,.0f}".replace(",", "."))) plt.tight_layout() img_buf = io.BytesIO() plt.savefig(img_buf, format='png') img_buf.seek(0) img_base64 = base64.b64encode(img_buf.getvalue()).decode("utf-8") img_buf.close() plt.close() # Texto análise com valor patrimonial inserido analise = f""" Após análise dos cenários projetados para 5 anos, o investimento {investimento_mais_valorizado} apresenta o melhor desempenho, com um valor final estimado de {formatar_brl(valor_mais_alto)}, equivalente a um retorno significativo sobre o capital inicial. """ # Considerações finais com valor patrimonial destacado consideracoes = f"""Esta simulação compara quatro estratégias de investimento ao longo de 5 anos: studio (com renda e valorização), franquia, ações e renda fixa. A principal vantagem observada na estratégia do studio está na composição de dois pilares: renda passiva mensal (aluguéis) e valorização patrimonial do imóvel. Esse modelo resulta em um crescimento acelerado e composto ao longo do tempo, chegando a um valor patrimonial de {formatar_brl(valor_mais_alto)} no cenário mais otimista.
A franquia apresenta um retorno estável, baseado em um lucro fixo anual, mas sem reinvestimento dos ganhos. Já os investimentos em ações simulam retornos compostos anuais, com potencial mais elevado, porém com maior exposição a riscos. Por fim, a renda fixa representa uma alternativa mais conservadora, com crescimento previsível e menor oscilação.
É importante destacar que o valor patrimonial representa a soma do capital inicial e os rendimentos acumulados (ou valor de revenda do ativo). Investimentos que geram renda recorrente e se valorizam ao longo do tempo, como o studio, tendem a maximizar esse patrimônio. Porém, a escolha da estratégia ideal depende do perfil do investidor, tolerância a riscos e objetivos financeiros.
Este relatório tem caráter informativo e os valores simulados não representam garantias de retorno futuro.
""" # Exibir os dados de entrada do formulário no relatório dados_entrada = f"""Parâmetro | Valor |
---|---|
Capital Inicial | {formatar_brl(capital)} |
Rentabilidade Mensal Studio (%) | {studio_ret:.2f}% |
Valorização Anual Studio (%) | {valorizacao:.2f}% |
Retorno Anual Franquia (R$) | {formatar_brl(franquia_ret)} |
Rentabilidade Anual Ações (%) | {acoes_ret:.2f}% |
Rentabilidade Anual Renda Fixa (%) | {renda_fixa:.2f}% |
Inflação Anual (%) | {inflacao:.2f}% |
Data da Simulação: {datetime.today().strftime('%d/%m/%Y')}
{dados_entrada}