Persano commited on
Commit
4250b25
·
verified ·
1 Parent(s): f5a3dac

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +95 -107
app.py CHANGED
@@ -2,88 +2,19 @@
2
  import os
3
  os.environ['FONTCONFIG_PATH'] = '/tmp/fontconfig'
4
  os.makedirs('/tmp/fontconfig', exist_ok=True)
5
-
6
- from flask import Flask, render_template, request, send_file, make_response
7
- import matplotlib.pyplot as plt
8
- import pandas as pd
9
  import io
 
 
 
10
  import base64
11
- from weasyprint import HTML
12
- from datetime import datetime
13
 
14
  app = Flask(__name__)
15
 
16
- def formata_real(valor):
17
- return f"R$ {valor:,.2f}".replace(',', 'v').replace('.', ',').replace('v', '.')
18
-
19
- def gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, anos=10, inflacao=4.5):
20
- data = []
21
- cap_studio = capital
22
- cap_acoes = capital
23
- cap_renda = capital
24
- cap_franquia = capital
25
-
26
- for ano in range(anos + 1):
27
- if ano == 0:
28
- studio_valor = cap_studio
29
- acoes_valor = cap_acoes
30
- renda_valor = cap_renda
31
- franquia_valor = cap_franquia
32
- else:
33
- renda_aluguel = cap_studio * (studio_ret / 100) * 12
34
- cap_studio += renda_aluguel
35
- cap_studio *= (1 + valorizacao / 100)
36
-
37
- cap_franquia += franquia_ret
38
-
39
- cap_acoes *= (1 + acoes_ret / 100)
40
- cap_renda *= (1 + renda_fixa / 100)
41
-
42
- cap_studio /= (1 + inflacao / 100)
43
- cap_acoes /= (1 + inflacao / 100)
44
- cap_renda /= (1 + inflacao / 100)
45
- cap_franquia /= (1 + inflacao / 100)
46
-
47
- studio_valor = cap_studio
48
- franquia_valor = cap_franquia
49
- acoes_valor = cap_acoes
50
- renda_valor = cap_renda
51
-
52
- data.append({
53
- "Ano": ano,
54
- "Studio (R$)": round(studio_valor, 2),
55
- "Franquia (R$)": round(franquia_valor, 2),
56
- "Ações (R$)": round(acoes_valor, 2),
57
- "Renda Fixa (R$)": round(renda_valor, 2),
58
- })
59
-
60
- return pd.DataFrame(data)
61
-
62
- def plotar_grafico(df):
63
- plt.style.use('ggplot')
64
- fig, ax = plt.subplots(figsize=(10, 6))
65
- cores = ['#2c3e50', '#16a085', '#2980b9', '#8e44ad']
66
-
67
- for i, col in enumerate(df.columns[1:]):
68
- ax.plot(df['Ano'], df[col], label=col, color=cores[i], linewidth=2)
69
-
70
- ax.set_title('Comparação de Investimentos (valores corrigidos pela inflação)', fontsize=16, fontweight='bold')
71
- ax.set_xlabel('Ano', fontsize=14)
72
- ax.set_ylabel('Valor (R$)', fontsize=14)
73
- ax.legend(fontsize=12)
74
- ax.grid(True, linestyle='--', alpha=0.7)
75
- plt.tight_layout()
76
-
77
- img = io.BytesIO()
78
- plt.savefig(img, format='png', dpi=150)
79
- plt.close(fig)
80
- img.seek(0)
81
- img_base64 = base64.b64encode(img.read()).decode()
82
- return img_base64
83
-
84
- @app.route('/download_pdf', methods=['POST'])
85
- def download_pdf():
86
- try:
87
  capital = float(request.form['capital'])
88
  studio_ret = float(request.form['studio_ret'])
89
  valorizacao = float(request.form['valorizacao'])
@@ -92,38 +23,95 @@ def download_pdf():
92
  renda_fixa = float(request.form['renda_fixa'])
93
  inflacao = float(request.form['inflacao'])
94
 
95
- df = gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao=inflacao)
96
- grafico = plotar_grafico(df)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97
 
98
- valores_finais = df.iloc[-1, 1:]
99
- investimento_mais_valorizado = valores_finais.idxmax()
100
- valor_mais_alto = valores_finais.max()
101
-
102
- ano_atual = datetime.now().year
103
-
104
- # Formata os valores no DataFrame antes de converter para HTML
105
- df_formatado = df.copy()
106
- for col in df.columns[1:]:
107
- df_formatado[col] = df_formatado[col].apply(formata_real)
108
-
109
- tabela_html = df_formatado.to_html(classes="table table-striped table-hover", index=False)
110
-
111
- html_content = render_template('relatorio.html',
112
- tabela=tabela_html,
113
- grafico=grafico,
114
- capital=formata_real(capital),
115
- investimento_mais_valorizado=investimento_mais_valorizado,
116
- valor_mais_alto=formata_real(valor_mais_alto),
117
- year=ano_atual)
118
-
119
- pdf = HTML(string=html_content).write_pdf()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
120
 
121
- response = make_response(pdf)
122
- response.headers['Content-Type'] = 'application/pdf'
123
- response.headers['Content-Disposition'] = 'attachment; filename=relatorio_simulacao.pdf'
124
- return response
125
- except Exception as e:
126
- return f"Erro: {e}"
127
 
128
 
129
  if __name__ == '__main__':
 
2
  import os
3
  os.environ['FONTCONFIG_PATH'] = '/tmp/fontconfig'
4
  os.makedirs('/tmp/fontconfig', exist_ok=True)
5
+ from flask import Flask, request, render_template, send_file
 
 
 
6
  import io
7
+ from xhtml2pdf import pisa
8
+ import pandas as pd
9
+ import matplotlib.pyplot as plt
10
  import base64
 
 
11
 
12
  app = Flask(__name__)
13
 
14
+ @app.route('/', methods=['GET', 'POST'])
15
+ def index():
16
+ if request.method == 'POST':
17
+ # Extrair dados do formulário
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  capital = float(request.form['capital'])
19
  studio_ret = float(request.form['studio_ret'])
20
  valorizacao = float(request.form['valorizacao'])
 
23
  renda_fixa = float(request.form['renda_fixa'])
24
  inflacao = float(request.form['inflacao'])
25
 
26
+ # Simulação fictícia
27
+ anos = list(range(1, 6))
28
+ resultados = {
29
+ "Studio": [capital * (1 + studio_ret/100)**(12 * ano/12) for ano in anos],
30
+ "Imóvel": [capital * (1 + valorizacao/100)**ano for ano in anos],
31
+ "Franquia": [capital + franquia_ret * ano for ano in anos],
32
+ "Ações": [capital * (1 + acoes_ret/100)**ano for ano in anos],
33
+ "Renda Fixa": [capital * (1 + renda_fixa/100)**ano for ano in anos]
34
+ }
35
+
36
+ df = pd.DataFrame(resultados, index=[f'{ano}º ano' for ano in anos])
37
+ tabela = df.to_html(classes='table', float_format='R$ {:,.2f}'.format)
38
+
39
+ investimento_mais_valorizado = df.iloc[-1].idxmax()
40
+ valor_mais_alto = df.iloc[-1].max()
41
+
42
+ # Gráfico
43
+ fig, ax = plt.subplots()
44
+ df.plot(ax=ax)
45
+ ax.set_ylabel("Valor (R$)")
46
+ ax.set_title("Comparativo de Investimentos")
47
+
48
+ img = io.BytesIO()
49
+ plt.tight_layout()
50
+ plt.savefig(img, format='png')
51
+ img.seek(0)
52
+ grafico = base64.b64encode(img.getvalue()).decode()
53
+
54
+ return render_template("index.html",
55
+ tabela=tabela,
56
+ grafico=grafico,
57
+ investimento_mais_valorizado=investimento_mais_valorizado,
58
+ valor_mais_alto=valor_mais_alto,
59
+ capital=capital,
60
+ studio_ret=studio_ret,
61
+ valorizacao=valorizacao,
62
+ franquia_ret=franquia_ret,
63
+ acoes_ret=acoes_ret,
64
+ renda_fixa=renda_fixa,
65
+ inflacao=inflacao,
66
+ gerar_pdf=False)
67
+ return render_template("index.html")
68
 
69
+ @app.route('/download_pdf', methods=['POST'])
70
+ def download_pdf():
71
+ # Reutilize os mesmos dados do formulário para refazer a simulação
72
+ capital = float(request.form['capital'])
73
+ studio_ret = float(request.form['studio_ret'])
74
+ valorizacao = float(request.form['valorizacao'])
75
+ franquia_ret = float(request.form['franquia_ret'])
76
+ acoes_ret = float(request.form['acoes_ret'])
77
+ renda_fixa = float(request.form['renda_fixa'])
78
+ inflacao = float(request.form['inflacao'])
79
+
80
+ anos = list(range(1, 6))
81
+ resultados = {
82
+ "Studio": [capital * (1 + studio_ret/100)**(12 * ano/12) for ano in anos],
83
+ "Imóvel": [capital * (1 + valorizacao/100)**ano for ano in anos],
84
+ "Franquia": [capital + franquia_ret * ano for ano in anos],
85
+ "Ações": [capital * (1 + acoes_ret/100)**ano for ano in anos],
86
+ "Renda Fixa": [capital * (1 + renda_fixa/100)**ano for ano in anos]
87
+ }
88
+
89
+ df = pd.DataFrame(resultados, index=[f'{ano}º ano' for ano in anos])
90
+ tabela = df.to_html(classes='table', float_format='R$ {:,.2f}'.format)
91
+
92
+ investimento_mais_valorizado = df.iloc[-1].idxmax()
93
+ valor_mais_alto = df.iloc[-1].max()
94
+
95
+ html = render_template("index.html",
96
+ tabela=tabela,
97
+ grafico="",
98
+ investimento_mais_valorizado=investimento_mais_valorizado,
99
+ valor_mais_alto=valor_mais_alto,
100
+ capital=capital,
101
+ studio_ret=studio_ret,
102
+ valorizacao=valorizacao,
103
+ franquia_ret=franquia_ret,
104
+ acoes_ret=acoes_ret,
105
+ renda_fixa=renda_fixa,
106
+ inflacao=inflacao,
107
+ gerar_pdf=True)
108
+
109
+ pdf = io.BytesIO()
110
+ pisa.CreatePDF(io.StringIO(html), dest=pdf)
111
+ pdf.seek(0)
112
+
113
+ return send_file(pdf, download_name="relatorio_simulacao.pdf", as_attachment=True)
114
 
 
 
 
 
 
 
115
 
116
 
117
  if __name__ == '__main__':