flowise1 / app.py
Persano's picture
Update app.py
4e0fbb5 verified
raw
history blame
13.6 kB
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 io
import base64
from datetime import datetime
import pandas as pd
app = Flask(__name__)
# Função para formatar valor em reais
def formatar_brl(valor):
return f"R$ {valor:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".")
# Função para gerar gráfico e retornar base64
def gerar_grafico(valores, labels):
plt.figure(figsize=(8,4))
for label in labels:
plt.plot(valores['Ano'], valores[label], label=label)
plt.title("Projeção dos Investimentos ao longo dos anos")
plt.xlabel("Ano")
plt.ylabel("Valor (R$)")
plt.legend()
plt.grid(True)
plt.tight_layout()
img = io.BytesIO()
plt.savefig(img, format='png')
plt.close()
img.seek(0)
img_base64 = base64.b64encode(img.getvalue()).decode()
return img_base64
# Rota principal com formulário e relatório
@app.route("/", methods=["GET", "POST"])
def index():
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"])
anos = int(request.form["anos"])
# Cálculo dos valores ao longo dos anos
anos_lista = list(range(0, anos + 1))
df = pd.DataFrame({"Ano": anos_lista})
# Studio: capital * (1 + retorno + valorização)^ano
df["Studio"] = capital * ((1 + (studio_ret + valorizacao)/100) ** df["Ano"])
# Franquia: capital + retorno fixo anual * ano
df["Franquia"] = capital + franquia_ret * df["Ano"]
# Ações: capital * (1 + retorno)^ano
df["Ações"] = capital * ((1 + acoes_ret/100) ** df["Ano"])
# Renda Fixa: capital * (1 + retorno)^ano
df["Renda Fixa"] = capital * ((1 + renda_fixa/100) ** df["Ano"])
# Valores finais para comparação
valores_finais = df.iloc[-1, 1:]
investimento_mais_valorizado = valores_finais.idxmax()
valor_mais_alto = valores_finais.max()
# Preparar resumo tabela
resumo = []
for investimento in ["Studio", "Franquia", "Ações", "Renda Fixa"]:
valor_final = valores_finais[investimento]
retorno_abs = valor_final - capital
retorno_pct = (retorno_abs / capital) * 100
resumo.append({
"Investimento": investimento,
"Valor Final": formatar_brl(valor_final),
"Retorno Absoluto": formatar_brl(retorno_abs),
"Retorno (%)": f"{retorno_pct:.2f}%"
})
# Montar tabela html para PDF
tabela_html = """
<table>
<thead>
<tr>
<th style="text-align:left;">Investimento</th>
<th>Valor Final</th>
<th>Retorno Absoluto</th>
<th>Retorno (%)</th>
</tr>
</thead>
<tbody>
"""
for r in resumo:
tabela_html += f"""
<tr>
<td style="text-align:left;">{r['Investimento']}</td>
<td>{r['Valor Final']}</td>
<td>{r['Retorno Absoluto']}</td>
<td>{r['Retorno (%)']}</td>
</tr>
"""
tabela_html += "</tbody></table>"
# Gerar gráfico
img_base64 = gerar_grafico(df, ["Studio", "Franquia", "Ações", "Renda Fixa"])
analise_final = (f"Após análise dos cenários projetados para {anos} anos, o investimento "
f"<strong>{investimento_mais_valorizado}</strong> apresenta o melhor desempenho, "
f"com um valor final estimado de <strong>{formatar_brl(valor_mais_alto)}</strong>, "
"equivalente a um retorno significativo sobre o capital inicial.")
comentario_extra = None # Caso queira adicionar algo extra
return render_template("relatorio.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,
resumo=resumo,
tabela_html=tabela_html,
grafico=img_base64,
analise_final=analise_final,
comentario_extra=comentario_extra,
investimento_mais_valorizado=investimento_mais_valorizado,
valor_mais_alto=valor_mais_alto,
now=datetime.now(),
formatar_brl=formatar_brl)
except Exception as e:
return f"Erro no processamento: {e}"
# GET: apenas mostra o formulário
return '''
<h2>Simulação de Investimentos</h2>
<form method="post">
<label>Capital Inicial (R$): <input name="capital" type="number" step="0.01" value="100000" required></label><br><br>
<label>Retorno Studio (% ao ano): <input name="studio_ret" type="number" step="0.01" value="8" required></label><br><br>
<label>Valorização Studio (% ao ano): <input name="valorizacao" type="number" step="0.01" value="5" required></label><br><br>
<label>Retorno Franquia (R$ ao ano): <input name="franquia_ret" type="number" step="0.01" value="7000" required></label><br><br>
<label>Retorno Ações (% ao ano): <input name="acoes_ret" type="number" step="0.01" value="10" required></label><br><br>
<label>Retorno Renda Fixa (% ao ano): <input name="renda_fixa" type="number" step="0.01" value="6" required></label><br><br>
<label>Inflação (% ao ano): <input name="inflacao" type="number" step="0.01" value="4" required></label><br><br>
<label>Anos de Projeção: <input name="anos" type="number" value="5" required></label><br><br>
<button type="submit">Gerar Relatório</button>
</form>
'''
# Página do relatório com template HTML
@app.route("/relatorio")
def relatorio():
# Esta rota só funciona se o formulário for submetido,
# por isso recomendamos usar a rota '/' para gerar o relatório.
return "Acesse a página inicial e preencha o formulário para gerar o relatório."
# Geração do PDF com WeasyPrint ou pdfkit (exemplo com pdfkit)
from flask import make_response
import pdfkit
@app.route("/download_pdf", methods=["POST"])
def download_pdf():
try:
# Receber os dados do form para gerar relatório no pdf
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 = int(request.form["anos"])
# Repetir cálculo para gerar dados e gráfico
anos_lista = list(range(0, anos + 1))
df = pd.DataFrame({"Ano": anos_lista})
df["Studio"] = capital * ((1 + (studio_ret + valorizacao)/100) ** df["Ano"])
df["Franquia"] = capital + franquia_ret * df["Ano"]
df["Ações"] = capital * ((1 + acoes_ret/100) ** df["Ano"])
df["Renda Fixa"] = capital * ((1 + renda_fixa/100) ** df["Ano"])
valores_finais = df.iloc[-1, 1:]
investimento_mais_valorizado = valores_finais.idxmax()
valor_mais_alto = valores_finais.max()
resumo = []
for investimento in ["Studio", "Franquia", "Ações", "Renda Fixa"]:
valor_final = valores_finais[investimento]
retorno_abs = valor_final - capital
retorno_pct = (retorno_abs / capital) * 100
resumo.append({
"Investimento": investimento,
"Valor Final": formatar_brl(valor_final),
"Retorno Absoluto": formatar_brl(retorno_abs),
"Retorno (%)": f"{retorno_pct:.2f}%"
})
tabela_html = """
<table>
<thead>
<tr>
<th style="text-align:left;">Investimento</th>
<th>Valor Final</th>
<th>Retorno Absoluto</th>
<th>Retorno (%)</th>
</tr>
</thead>
<tbody>
"""
for r in resumo:
tabela_html += f"""
<tr>
<td style="text-align:left;">{r['Investimento']}</td>
<td>{r['Valor Final']}</td>
<td>{r['Retorno Absoluto']}</td>
<td>{r['Retorno (%)']}</td>
</tr>
"""
tabela_html += "</tbody></table>"
img_base64 = gerar_grafico(df, ["Studio", "Franquia", "Ações", "Renda Fixa"])
analise_final = (f"Após análise dos cenários projetados para {anos} anos, o investimento "
f"<strong>{investimento_mais_valorizado}</strong> apresenta o melhor desempenho, "
f"com um valor final estimado de <strong>{formatar_brl(valor_mais_alto)}</strong>, "
"equivalente a um retorno significativo sobre o capital inicial.")
consideracoes_finais = f"""
<h2>Considerações Finais</h2>
<p>{analise_final}</p>
<p>
O investimento que apresentou o maior retorno neste cenário foi o <strong>{investimento_mais_valorizado}</strong>,
atingindo um valor patrimonial final estimado em <strong>{formatar_brl(valor_mais_alto)}</strong>.
</p>
<p>
<strong>Valor Patrimonial</strong> refere-se ao valor total acumulado do investimento, incluindo a valorização do ativo e os rendimentos obtidos ao longo do tempo.
Conforme as normas contábeis e práticas de avaliação de investidores profissionais, o valor patrimonial é fundamental para mensurar a saúde financeira e o crescimento do patrimônio líquido do investidor.
Ele serve como indicador da capacidade do investimento de gerar riqueza real, levando em conta tanto a valorização de mercado quanto a geração de renda.
</p>
"""
html = f"""
<html>
<head>
<meta charset="utf-8">
<style>
body {{ font-family: Arial, sans-serif; font-size: 14px; margin: 20px; }}
h2 {{ color: #2c3e50; }}
table {{ width: 100%; border-collapse: collapse; margin-top: 20px; }}
th, td {{ border: 1px solid #ccc; padding: 6px; text-align: right; }}
th {{ background-color: #f0f0f0; }}
.destaque {{ background: #e8f5e9; padding: 10px; margin-top: 20px; border-left: 6px solid #2e7d32; }}
</style>
</head>
<body>
<h2>Relatório de Simulação de Investimentos</h2>
<p>Data da Simulação: {datetime.today().strftime('%d/%m/%Y')}</p>
<p>Capital Inicial: <strong>{formatar_brl(capital)}</strong></p>
<h3>Dados de Entrada</h3>
<table>
<tr><th>Parâmetro</th><th>Valor</th></tr>
<tr><td>Retorno Studio (%)</td><td>{studio_ret}%</td></tr>
<tr><td>Valorização Studio (%)</td><td>{valorizacao}%</td></tr>
<tr><td>Retorno Franquia (R$)</td><td>{formatar_brl(franquia_ret)}</td></tr>
<tr><td>Retorno Ações (%)</td><td>{acoes_ret}%</td></tr>
<tr><td>Retorno Renda Fixa (%)</td><td>{renda_fixa}%</td></tr>
<tr><td>Inflação (%)</td><td>{inflacao}%</td></tr>
</table>
<div class="destaque">{analise_final}</div>
<img src="data:image/png;base64,{img_base64}" width="100%" />
<h3>Resumo dos Investimentos</h3>
{tabela_html}
{consideracoes_finais}
</body>
</html>
"""
# Gerar PDF com pdfkit (você precisa do wkhtmltopdf instalado)
options = {
'encoding': 'UTF-8',
'page-size': 'A4',
'margin-top': '10mm',
'margin-bottom': '10mm',
'margin-left': '10mm',
'margin-right': '10mm',
}
pdf = pdfkit.from_string(html, False, options=options)
response = make_response(pdf)
response.headers['Content-Type'] = 'application/pdf'
response.headers['Content-Disposition'] = 'attachment; filename=relatorio_investimentos.pdf'
return response
except Exception as e:
return f"Erro na geração do PDF: {e}"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=7860, debug=True)