Persano commited on
Commit
75098b5
·
verified ·
1 Parent(s): 091ac8c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +115 -82
app.py CHANGED
@@ -1,61 +1,69 @@
1
  import os
2
- os.environ['FONTCONFIG_CACHE'] = '/tmp/fontconfig_cache'
3
- os.makedirs('/tmp/fontconfig_cache', exist_ok=True)
4
 
 
 
 
5
 
6
-
7
- from flask import Flask, render_template, request, make_response
8
- import pandas as pd
9
  import matplotlib.pyplot as plt
 
10
  import io
11
  import base64
12
  from weasyprint import HTML
13
 
14
  app = Flask(__name__)
15
 
16
- # Função principal de simulação
17
- def gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao=0, anos=10):
18
- anos_lista = list(range(1, anos + 1))
19
- studio, imovel, franquia, acoes, renda_fixa_arr = [], [], [], [], []
20
-
21
- cap_studio = cap_imovel = cap_franquia = cap_acoes = cap_renda_fixa = capital
22
-
23
- for ano in anos_lista:
24
- inf_cum = (1 + inflacao / 100) ** ano
25
- cap_studio *= (1 + studio_ret / 100)
26
- cap_imovel *= (1 + valorizacao / 100)
27
- cap_franquia += franquia_ret
28
- cap_acoes *= (1 + acoes_ret / 100)
29
- cap_renda_fixa *= (1 + renda_fixa / 100)
30
-
31
- studio.append(cap_studio / inf_cum)
32
- imovel.append(cap_imovel / inf_cum)
33
- franquia.append(cap_franquia / inf_cum)
34
- acoes.append(cap_acoes / inf_cum)
35
- renda_fixa_arr.append(cap_renda_fixa / inf_cum)
36
-
37
- return pd.DataFrame({
38
- 'Ano': anos_lista,
39
- 'Studio': studio,
40
- 'Imovel': imovel,
41
- 'Franquia': franquia,
42
- 'Acoes': acoes,
43
- 'Renda Fixa': renda_fixa_arr
44
- })
45
-
46
- # Geração do gráfico como imagem base64
47
- def plotar_grafico(df):
48
- plt.style.use('ggplot')
49
- fig, ax = plt.subplots(figsize=(10, 6))
50
- cores = ['#2c3e50', '#16a085', '#2980b9', '#8e44ad', '#d35400']
 
 
 
 
 
 
51
 
 
 
 
 
52
  for i, col in enumerate(df.columns[1:]):
53
- estilo = '--' if col.lower() == 'acoes' else '-'
54
- ax.plot(df['Ano'], df[col], label=col, color=cores[i], linewidth=2, linestyle=estilo)
55
-
56
  ax.set_title('Comparação de Investimentos (valores corrigidos pela inflação)', fontsize=14, fontweight='bold')
57
- ax.set_xlabel('Ano')
58
- ax.set_ylabel('Valor (R$)')
59
  ax.legend()
60
  ax.grid(True, linestyle='--', alpha=0.7)
61
  plt.tight_layout()
@@ -64,65 +72,90 @@ def plotar_grafico(df):
64
  plt.savefig(img, format='png', dpi=150)
65
  plt.close(fig)
66
  img.seek(0)
67
- return base64.b64encode(img.read()).decode()
 
68
 
69
- # Página inicial com formulário e simulação
70
  @app.route('/', methods=['GET', 'POST'])
71
  def index():
 
 
72
  if request.method == 'POST':
73
  try:
74
- # Coleta dos dados do formulário
75
- dados = {k: float(request.form[k]) for k in [
76
- 'capital', 'studio_ret', 'valorizacao',
77
- 'franquia_ret', 'acoes_ret', 'renda_fixa', 'inflacao'
78
- ]}
79
-
80
- df = gerar_simulacao(**dados)
 
 
81
  grafico = plotar_grafico(df)
82
- tabela = df.to_html(classes="table table-striped table-hover", index=False)
83
-
84
- return render_template("index.html", grafico=grafico, tabela=tabela, **dados)
85
 
 
 
 
86
  except Exception as e:
87
  return f"Erro: {e}"
 
88
 
89
- return render_template("index.html")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
 
91
- # Geração e download do PDF
92
  @app.route('/download_pdf', methods=['POST'])
93
  def download_pdf():
94
  try:
95
- dados = {k: float(request.form[k]) for k in [
96
- 'capital', 'studio_ret', 'valorizacao',
97
- 'franquia_ret', 'acoes_ret', 'renda_fixa', 'inflacao'
98
- ]}
99
-
100
- df = gerar_simulacao(**dados)
 
 
 
101
  grafico = plotar_grafico(df)
102
 
103
- valores_finais = df.iloc[-1, 1:]
104
- nome_mais_valorizado = valores_finais.idxmax()
105
- valor_mais_alto = valores_finais.max()
106
- valor_mais_alto_str = f"{valor_mais_alto:,.2f}".replace(',', 'X').replace('.', ',').replace('X', '.')
107
-
108
- html = render_template("relatorio.html",
109
- grafico=grafico,
110
- tabela=df.to_html(classes="table table-striped table-hover", index=False),
111
- investimento_mais_valorizado=nome_mais_valorizado,
112
- valor_mais_alto=valor_mais_alto_str,
113
- df=df,
114
- **dados)
115
 
116
- pdf = HTML(string=html).write_pdf()
117
  response = make_response(pdf)
118
  response.headers['Content-Type'] = 'application/pdf'
119
  response.headers['Content-Disposition'] = 'attachment; filename=relatorio_simulacao.pdf'
120
  return response
121
-
122
  except Exception as e:
123
- return f"Erro ao gerar PDF: {e}"
124
 
125
- # Execução local
126
  if __name__ == '__main__':
127
- app.run(debug=True, port=7860)
128
 
 
1
  import os
 
 
2
 
3
+ # Corrige problema fontconfig
4
+ os.environ['FONTCONFIG_PATH'] = '/tmp/fontconfig'
5
+ os.makedirs('/tmp/fontconfig', exist_ok=True)
6
 
7
+ from flask import Flask, render_template, request, send_file, make_response
 
 
8
  import matplotlib.pyplot as plt
9
+ import pandas as pd
10
  import io
11
  import base64
12
  from weasyprint import HTML
13
 
14
  app = Flask(__name__)
15
 
16
+ def gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, anos=10, inflacao=4.5):
17
+ data = []
18
+ cap_studio = capital
19
+ cap_acoes = capital
20
+ cap_renda = capital
21
+ cap_franquia = capital
22
+ for ano in range(anos+1):
23
+ if ano == 0:
24
+ studio_valor = cap_studio
25
+ acoes_valor = cap_acoes
26
+ renda_valor = cap_renda
27
+ franquia_valor = cap_franquia
28
+ else:
29
+ renda_aluguel = cap_studio * (studio_ret/100) * 12
30
+ cap_studio += renda_aluguel
31
+ cap_studio *= (1 + valorizacao/100)
32
+
33
+ cap_franquia += franquia_ret
34
+
35
+ cap_acoes *= (1 + acoes_ret/100)
36
+ cap_renda *= (1 + renda_fixa/100)
37
+
38
+ # Corrige inflação
39
+ cap_studio /= (1 + inflacao/100)
40
+ cap_acoes /= (1 + inflacao/100)
41
+ cap_renda /= (1 + inflacao/100)
42
+ cap_franquia /= (1 + inflacao/100)
43
+
44
+ studio_valor = cap_studio
45
+ franquia_valor = cap_franquia
46
+ acoes_valor = cap_acoes
47
+ renda_valor = cap_renda
48
+
49
+ data.append({
50
+ "Ano": ano,
51
+ "Studio (R$)": round(studio_valor, 2),
52
+ "Franquia (R$)": round(franquia_valor, 2),
53
+ "Ações (R$)": round(acoes_valor, 2),
54
+ "Renda Fixa (R$)": round(renda_valor, 2),
55
+ })
56
+ return pd.DataFrame(data)
57
 
58
+ def plotar_grafico(df):
59
+ plt.style.use('ggplot') # estilo moderno simples
60
+ fig, ax = plt.subplots(figsize=(10,6))
61
+ cores = ['#2c3e50', '#16a085', '#2980b9', '#8e44ad']
62
  for i, col in enumerate(df.columns[1:]):
63
+ ax.plot(df['Ano'], df[col], label=col, color=cores[i], linewidth=2)
 
 
64
  ax.set_title('Comparação de Investimentos (valores corrigidos pela inflação)', fontsize=14, fontweight='bold')
65
+ ax.set_xlabel('Ano', fontsize=12)
66
+ ax.set_ylabel('Valor (R$)', fontsize=12)
67
  ax.legend()
68
  ax.grid(True, linestyle='--', alpha=0.7)
69
  plt.tight_layout()
 
72
  plt.savefig(img, format='png', dpi=150)
73
  plt.close(fig)
74
  img.seek(0)
75
+ img_base64 = base64.b64encode(img.read()).decode()
76
+ return img_base64
77
 
 
78
  @app.route('/', methods=['GET', 'POST'])
79
  def index():
80
+ grafico = None
81
+ df = None
82
  if request.method == 'POST':
83
  try:
84
+ capital = float(request.form['capital'])
85
+ studio_ret = float(request.form['studio_ret'])
86
+ valorizacao = float(request.form['valorizacao'])
87
+ franquia_ret = float(request.form['franquia_ret'])
88
+ acoes_ret = float(request.form['acoes_ret'])
89
+ renda_fixa = float(request.form['renda_fixa'])
90
+ inflacao = float(request.form['inflacao'])
91
+
92
+ df = gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao=inflacao)
93
  grafico = plotar_grafico(df)
 
 
 
94
 
95
+ return render_template('index.html', grafico=grafico, tabela=df.to_html(classes="table table-striped table-hover", index=False),
96
+ capital=capital, studio_ret=studio_ret, valorizacao=valorizacao, franquia_ret=franquia_ret,
97
+ acoes_ret=acoes_ret, renda_fixa=renda_fixa, inflacao=inflacao)
98
  except Exception as e:
99
  return f"Erro: {e}"
100
+ return render_template('index.html')
101
 
102
+ @app.route('/download_excel', methods=['POST'])
103
+ def download_excel():
104
+ try:
105
+ capital = float(request.form['capital'])
106
+ studio_ret = float(request.form['studio_ret'])
107
+ valorizacao = float(request.form['valorizacao'])
108
+ franquia_ret = float(request.form['franquia_ret'])
109
+ acoes_ret = float(request.form['acoes_ret'])
110
+ renda_fixa = float(request.form['renda_fixa'])
111
+ inflacao = float(request.form['inflacao'])
112
+
113
+ df = gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao=inflacao)
114
+
115
+ output = io.BytesIO()
116
+ with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
117
+ df.to_excel(writer, sheet_name='Simulação', index=False)
118
+ output.seek(0)
119
+ return send_file(output,
120
+ as_attachment=True,
121
+ download_name="simulacao_investimentos.xlsx",
122
+ mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
123
+ except Exception as e:
124
+ return f"Erro: {e}"
125
 
 
126
  @app.route('/download_pdf', methods=['POST'])
127
  def download_pdf():
128
  try:
129
+ capital = float(request.form['capital'])
130
+ studio_ret = float(request.form['studio_ret'])
131
+ valorizacao = float(request.form['valorizacao'])
132
+ franquia_ret = float(request.form['franquia_ret'])
133
+ acoes_ret = float(request.form['acoes_ret'])
134
+ renda_fixa = float(request.form['renda_fixa'])
135
+ inflacao = float(request.form['inflacao'])
136
+
137
+ df = gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao=inflacao)
138
  grafico = plotar_grafico(df)
139
 
140
+ html_content = render_template('relatorio.html',
141
+ tabela=df.to_html(classes="table table-striped table-hover", index=False),
142
+ grafico=grafico,
143
+ capital=capital,
144
+ studio_ret=studio_ret,
145
+ valorizacao=valorizacao,
146
+ franquia_ret=franquia_ret,
147
+ acoes_ret=acoes_ret,
148
+ renda_fixa=renda_fixa,
149
+ inflacao=inflacao)
150
+ pdf = HTML(string=html_content).write_pdf()
 
151
 
 
152
  response = make_response(pdf)
153
  response.headers['Content-Type'] = 'application/pdf'
154
  response.headers['Content-Disposition'] = 'attachment; filename=relatorio_simulacao.pdf'
155
  return response
 
156
  except Exception as e:
157
+ return f"Erro: {e}"
158
 
 
159
  if __name__ == '__main__':
160
+ app.run(host='0.0.0.0', port=7860, debug=True)
161