Persano commited on
Commit
03a48f1
·
verified ·
1 Parent(s): 62e8649

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +132 -107
app.py CHANGED
@@ -1,93 +1,87 @@
1
- from flask import Flask, render_template, request, send_file
2
  import matplotlib.pyplot as plt
3
  import pandas as pd
4
  import io
5
  import base64
 
6
 
7
  app = Flask(__name__)
8
 
9
- def gerar_simulacao(capital, studio_ret_mensal, valorizacao_anual, franquia_ret_anual,
10
- acoes_ret_anual, renda_fixa_anual, inflacao_anual, anos=10):
11
- """
12
- Gera DataFrame com projeção de investimentos ao longo dos anos.
13
- - studio_ret_mensal em % (ex: 1.0)
14
- - valorizacao_anual em % (ex: 6.0)
15
- - franquia_ret_anual em R$ (lucro fixo anual)
16
- - acoes_ret_anual em % (ex: 10.0)
17
- - renda_fixa_anual em % (ex: 9.0)
18
- - inflacao_anual em %
19
- """
20
-
21
- # Inicializa listas para armazenar os valores ano a ano
22
- anos_lista = list(range(1, anos + 1))
23
- studio_valor = []
24
- franquia_valor = []
25
- acoes_valor = []
26
- renda_fixa_valor = []
27
-
28
- # Capital inicial para cada investimento
29
- studio_capital = capital
30
- franquia_capital = capital
31
- acoes_capital = capital
32
- renda_fixa_capital = capital
33
-
34
- # Retornos mensais para o studio (convertendo % para decimal)
35
- studio_ret_mensal /= 100
36
- valorizacao_anual /= 100
37
- acoes_ret_anual /= 100
38
- renda_fixa_anual /= 100
39
- inflacao_anual /= 100
40
-
41
- for ano in anos_lista:
42
- # Studio:
43
- # 1) Rentabilidade mensal capitalizada 12 meses
44
- renda_mensal = studio_capital * studio_ret_mensal
45
- renda_anual = renda_mensal * 12
46
- # 2) Valorização anual do imóvel aplicada ao capital investido
47
- studio_capital = (studio_capital + renda_anual) * (1 + valorizacao_anual)
48
- studio_valor.append(studio_capital)
49
-
50
- # Franquia:
51
- # Considera lucro anual fixo + reinvestimento (simplificação)
52
- franquia_capital = (franquia_capital + franquia_ret_anual) * (1 + inflacao_anual * 0.2) # pequena valorização pela inflação
53
- franquia_valor.append(franquia_capital)
54
-
55
- # Ações:
56
- acoes_capital = acoes_capital * (1 + acoes_ret_anual)
57
- acoes_valor.append(acoes_capital)
58
-
59
- # Renda Fixa:
60
- renda_fixa_capital = renda_fixa_capital * (1 + renda_fixa_anual)
61
- renda_fixa_valor.append(renda_fixa_capital)
62
-
63
- df = pd.DataFrame({
64
- 'Ano': anos_lista,
65
- 'Studio (R$)': studio_valor,
66
- 'Franquia (R$)': franquia_valor,
67
- 'Ações (R$)': acoes_valor,
68
- 'Renda Fixa (R$)': renda_fixa_valor
69
- })
70
-
71
  return df
72
 
73
  def plotar_grafico(df):
74
- plt.figure(figsize=(10,6))
75
- plt.plot(df['Ano'], df['Studio (R$)'], marker='o', label='Studio')
76
- plt.plot(df['Ano'], df['Franquia (R$)'], marker='o', label='Franquia')
77
- plt.plot(df['Ano'], df['Ações (R$)'], marker='o', label='Ações')
78
- plt.plot(df['Ano'], df['Renda Fixa (R$)'], marker='o', label='Renda Fixa')
79
- plt.title('Projeção de Investimentos ao Longo dos Anos')
80
- plt.xlabel('Ano')
81
- plt.ylabel('Valor acumulado (R$)')
82
- plt.grid(True, alpha=0.3)
83
- plt.legend()
84
  plt.tight_layout()
85
 
86
- buf = io.BytesIO()
87
- plt.savefig(buf, format='png', transparent=True)
88
- plt.close()
89
- buf.seek(0)
90
- img_base64 = base64.b64encode(buf.getvalue()).decode('utf8')
91
  return img_base64
92
 
93
  @app.route('/', methods=['GET', 'POST'])
@@ -104,40 +98,71 @@ def index():
104
  renda_fixa = float(request.form['renda_fixa'])
105
  inflacao = float(request.form['inflacao'])
106
 
107
- df = gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao)
108
  grafico = plotar_grafico(df)
109
-
110
- # Passa variáveis para renderizar no template
111
- return render_template('index.html', grafico=grafico, capital=capital, studio_ret=studio_ret,
112
- valorizacao=valorizacao, franquia_ret=franquia_ret, acoes_ret=acoes_ret,
113
- renda_fixa=renda_fixa, inflacao=inflacao)
114
  except Exception as e:
115
- return f"Erro ao processar dados: {e}", 400
116
-
117
- return render_template('index.html', grafico=None)
118
 
119
  @app.route('/download_excel', methods=['POST'])
120
  def download_excel():
121
- capital = float(request.form['capital'])
122
- studio_ret = float(request.form['studio_ret'])
123
- valorizacao = float(request.form['valorizacao'])
124
- franquia_ret = float(request.form['franquia_ret'])
125
- acoes_ret = float(request.form['acoes_ret'])
126
- renda_fixa = float(request.form['renda_fixa'])
127
- inflacao = float(request.form['inflacao'])
128
-
129
- df = gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao)
130
-
131
- output = io.BytesIO()
132
- with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
133
- df.to_excel(writer, index=False, sheet_name='Simulação')
134
- output.seek(0)
135
-
136
- return send_file(output,
137
- download_name="simulacao_investimentos.xlsx",
138
- as_attachment=True,
139
- mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
140
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
141
 
142
  if __name__ == '__main__':
143
  app.run(host='0.0.0.0', port=7860, debug=True)
 
1
+ from flask import Flask, render_template, request, send_file, make_response
2
  import matplotlib.pyplot as plt
3
  import pandas as pd
4
  import io
5
  import base64
6
+ from weasyprint import HTML
7
 
8
  app = Flask(__name__)
9
 
10
+ def gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, anos=10, inflacao=4.5):
11
+ # Dados anuais: simulação simples para 10 anos
12
+ # capital: valor inicial
13
+ # studio_ret: retorno mensal % do aluguel short stay
14
+ # valorizacao: valorização anual do imóvel %
15
+ # franquia_ret: lucro anual fixo da franquia (em R$)
16
+ # acoes_ret: retorno anual em ações %
17
+ # renda_fixa: retorno anual em renda fixa %
18
+ # inflacao: inflação anual %
19
+
20
+ data = []
21
+ cap_studio = capital
22
+ cap_acoes = capital
23
+ cap_renda = capital
24
+ cap_franquia = capital
25
+ for ano in range(anos+1):
26
+ # Estimativas anuais
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
+ # Studio: aluguel mensal 1% x 12 meses + valorização imóvel
34
+ renda_aluguel = cap_studio * (studio_ret/100) * 12
35
+ cap_studio += renda_aluguel
36
+ cap_studio *= (1 + valorizacao/100)
37
+
38
+ # Franquia: lucro fixo anual reinvestido
39
+ cap_franquia += franquia_ret
40
+
41
+ # Ações: cresce com taxa anual
42
+ cap_acoes *= (1 + acoes_ret/100)
43
+
44
+ # Renda fixa:
45
+ cap_renda *= (1 + renda_fixa/100)
46
+
47
+ # Corrige pela inflação para "real"
48
+ cap_studio /= (1 + inflacao/100)
49
+ cap_acoes /= (1 + inflacao/100)
50
+ cap_renda /= (1 + inflacao/100)
51
+ cap_franquia /= (1 + inflacao/100)
52
+
53
+ studio_valor = cap_studio
54
+ franquia_valor = cap_franquia
55
+ acoes_valor = cap_acoes
56
+ renda_valor = cap_renda
57
+
58
+ data.append({
59
+ "Ano": ano,
60
+ "Studio (R$)": round(studio_valor, 2),
61
+ "Franquia (R$)": round(franquia_valor, 2),
62
+ "Ações (R$)": round(acoes_valor, 2),
63
+ "Renda Fixa (R$)": round(renda_valor, 2),
64
+ })
65
+
66
+ df = pd.DataFrame(data)
 
 
 
 
 
67
  return df
68
 
69
  def plotar_grafico(df):
70
+ plt.style.use('seaborn-darkgrid')
71
+ fig, ax = plt.subplots(figsize=(10,6))
72
+ for col in df.columns[1:]:
73
+ ax.plot(df['Ano'], df[col], label=col)
74
+ ax.set_title('Comparação de Investimentos (valores corrigidos pela inflação)')
75
+ ax.set_xlabel('Ano')
76
+ ax.set_ylabel('Valor (R$)')
77
+ ax.legend()
 
 
78
  plt.tight_layout()
79
 
80
+ img = io.BytesIO()
81
+ plt.savefig(img, format='png')
82
+ plt.close(fig)
83
+ img.seek(0)
84
+ img_base64 = base64.b64encode(img.read()).decode()
85
  return img_base64
86
 
87
  @app.route('/', methods=['GET', 'POST'])
 
98
  renda_fixa = float(request.form['renda_fixa'])
99
  inflacao = float(request.form['inflacao'])
100
 
101
+ df = gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao=inflacao)
102
  grafico = plotar_grafico(df)
103
+ return render_template('index.html', grafico=grafico, tabela=df.to_html(classes="table table-striped", index=False),
104
+ capital=capital, studio_ret=studio_ret, valorizacao=valorizacao, franquia_ret=franquia_ret,
105
+ acoes_ret=acoes_ret, renda_fixa=renda_fixa, inflacao=inflacao)
 
 
106
  except Exception as e:
107
+ return f"Erro: {e}"
108
+ return render_template('index.html')
 
109
 
110
  @app.route('/download_excel', methods=['POST'])
111
  def download_excel():
112
+ try:
113
+ capital = float(request.form['capital'])
114
+ studio_ret = float(request.form['studio_ret'])
115
+ valorizacao = float(request.form['valorizacao'])
116
+ franquia_ret = float(request.form['franquia_ret'])
117
+ acoes_ret = float(request.form['acoes_ret'])
118
+ renda_fixa = float(request.form['renda_fixa'])
119
+ inflacao = float(request.form['inflacao'])
120
+
121
+ df = gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao=inflacao)
122
+
123
+ output = io.BytesIO()
124
+ with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
125
+ df.to_excel(writer, sheet_name='Simulação', index=False)
126
+ output.seek(0)
127
+ return send_file(output,
128
+ as_attachment=True,
129
+ download_name="simulacao_investimentos.xlsx",
130
+ mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
131
+ except Exception as e:
132
+ return f"Erro: {e}"
133
+
134
+ @app.route('/download_pdf', methods=['POST'])
135
+ def download_pdf():
136
+ try:
137
+ capital = float(request.form['capital'])
138
+ studio_ret = float(request.form['studio_ret'])
139
+ valorizacao = float(request.form['valorizacao'])
140
+ franquia_ret = float(request.form['franquia_ret'])
141
+ acoes_ret = float(request.form['acoes_ret'])
142
+ renda_fixa = float(request.form['renda_fixa'])
143
+ inflacao = float(request.form['inflacao'])
144
+
145
+ df = gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao=inflacao)
146
+ grafico = plotar_grafico(df)
147
+
148
+ html_content = render_template('relatorio.html',
149
+ tabela=df.to_html(classes="table table-striped", index=False),
150
+ grafico=grafico,
151
+ capital=capital,
152
+ studio_ret=studio_ret,
153
+ valorizacao=valorizacao,
154
+ franquia_ret=franquia_ret,
155
+ acoes_ret=acoes_ret,
156
+ renda_fixa=renda_fixa,
157
+ inflacao=inflacao)
158
+ pdf = HTML(string=html_content).write_pdf()
159
+
160
+ response = make_response(pdf)
161
+ response.headers['Content-Type'] = 'application/pdf'
162
+ response.headers['Content-Disposition'] = 'attachment; filename=relatorio_simulacao.pdf'
163
+ return response
164
+ except Exception as e:
165
+ return f"Erro: {e}"
166
 
167
  if __name__ == '__main__':
168
  app.run(host='0.0.0.0', port=7860, debug=True)