Persano commited on
Commit
e8c591c
·
verified ·
1 Parent(s): cddb3f3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +83 -115
app.py CHANGED
@@ -1,126 +1,94 @@
1
- from flask import Flask, render_template, request
2
  import matplotlib.pyplot as plt
3
  import io
4
  import base64
5
- import csv
6
- from flask import send_file
7
 
8
  app = Flask(__name__)
9
 
10
- def calcular_retornos(capital, studio_valor_anual, studio_valoriza, franquia_valor_anual, acoes_retorno, renda_fixa_retorno):
11
- anos = [2025, 2026, 2027, 2028, 2029]
12
- resultados = {
13
- 'studio': [],
14
- 'franquia': [],
15
- 'acoes': [],
16
- 'renda_fixa': []
17
- }
18
-
19
- valor_studio = capital
20
- valor_franquia = capital
21
- valor_acoes = capital
22
- valor_rf = capital
23
-
24
- for _ in anos:
25
- valor_studio += studio_valor_anual
26
- valor_studio *= (1 + studio_valoriza / 100)
27
- resultados['studio'].append(round(valor_studio, 2))
28
-
29
- valor_franquia += franquia_valor_anual
30
- resultados['franquia'].append(round(valor_franquia, 2))
31
-
32
- valor_acoes *= (1 + acoes_retorno / 100)
33
- resultados['acoes'].append(round(valor_acoes, 2))
34
-
35
- valor_rf *= (1 + renda_fixa_retorno / 100)
36
- resultados['renda_fixa'].append(round(valor_rf, 2))
37
-
38
- return anos, resultados
39
-
40
- @app.route('/', methods=['GET', 'POST'])
41
  def index():
42
- grafico = None
43
- resultados = {}
44
- anos = []
45
- params = {
46
- 'capital': 400000,
47
- 'studio_valor_anual': 49440,
48
- 'studio_valoriza': 6,
49
- 'franquia_valor_anual': 20000,
50
- 'acoes_retorno': 10,
51
- 'renda_fixa_retorno': 9,
52
- }
53
- if request.method == 'POST':
54
- params['capital'] = float(request.form.get('capital', params['capital']))
55
- params['studio_valor_anual'] = float(request.form.get('studio_valor_anual', params['studio_valor_anual']))
56
- params['studio_valoriza'] = float(request.form.get('studio_valoriza', params['studio_valoriza']))
57
- params['franquia_valor_anual'] = float(request.form.get('franquia_valor_anual', params['franquia_valor_anual']))
58
- params['acoes_retorno'] = float(request.form.get('acoes_retorno', params['acoes_retorno']))
59
- params['renda_fixa_retorno'] = float(request.form.get('renda_fixa_retorno', params['renda_fixa_retorno']))
60
-
61
- anos, resultados = calcular_retornos(
62
- params['capital'],
63
- params['studio_valor_anual'],
64
- params['studio_valoriza'],
65
- params['franquia_valor_anual'],
66
- params['acoes_retorno'],
67
- params['renda_fixa_retorno']
68
- )
69
-
70
- plt.figure(figsize=(8, 5))
71
- for tipo, valores in resultados.items():
72
- plt.plot(anos, valores, marker='o', label=tipo.title())
73
-
74
- plt.title("Comparativo de Investimentos (2025-2029)", fontsize=14)
75
- plt.xlabel("Ano")
76
- plt.ylabel("Valor acumulado (R$)")
77
- plt.grid(True, linestyle='--', alpha=0.7)
78
- plt.legend()
79
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
  buf = io.BytesIO()
 
81
  plt.savefig(buf, format='png')
 
82
  buf.seek(0)
83
- grafico = base64.b64encode(buf.getvalue()).decode('utf8')
84
- plt.close()
85
-
86
- return render_template('index.html', grafico=grafico, resultados=resultados, anos=anos, params=params)
87
-
88
- def gerar_csv(resultados, anos):
89
- buf = io.StringIO()
90
- writer = csv.writer(buf)
91
- header = ["Ano"] + list(resultados.keys())
92
- writer.writerow(header)
93
- for i in range(len(anos)):
94
- row = [anos[i]] + [resultados[tipo][i] for tipo in resultados]
95
- writer.writerow(row)
96
- buf.seek(0)
97
- return io.BytesIO(buf.read().encode('utf-8'))
98
-
99
- @app.route('/download_csv', methods=['POST'])
100
- def download_csv():
101
- params = {
102
- 'capital': float(request.form.get('capital', 400000)),
103
- 'studio_valor_anual': float(request.form.get('studio_valor_anual', 49440)),
104
- 'studio_valoriza': float(request.form.get('studio_valoriza', 6)),
105
- 'franquia_valor_anual': float(request.form.get('franquia_valor_anual', 20000)),
106
- 'acoes_retorno': float(request.form.get('acoes_retorno', 10)),
107
- 'renda_fixa_retorno': float(request.form.get('renda_fixa_retorno', 9)),
108
- }
109
-
110
- anos, resultados = calcular_retornos(
111
- params['capital'],
112
- params['studio_valor_anual'],
113
- params['studio_valoriza'],
114
- params['franquia_valor_anual'],
115
- params['acoes_retorno'],
116
- params['renda_fixa_retorno']
117
- )
118
-
119
- csv_file = gerar_csv(resultados, anos)
120
- return send_file(csv_file, mimetype='text/csv', as_attachment=True, download_name='simulacao_investimentos.csv')
121
-
122
- if __name__ == '__main__':
123
-
124
-
125
- app.run(host='0.0.0.0', port=7860, debug=True)
126
 
 
1
+ from flask import Flask, request, jsonify
2
  import matplotlib.pyplot as plt
3
  import io
4
  import base64
 
 
5
 
6
  app = Flask(__name__)
7
 
8
+ @app.route('/')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  def index():
10
+ return "Backend para o simulador está rodando."
11
+
12
+ @app.route('/simular', methods=['POST'])
13
+ def simular():
14
+ try:
15
+ # Recebe os dados do formulário
16
+ capital = float(request.form.get('capital', 0))
17
+ studio_ret = float(request.form.get('studio_ret', 0)) / 100
18
+ valorizacao = float(request.form.get('valorizacao', 0)) / 100
19
+ franquia_ret = float(request.form.get('franquia_ret', 0))
20
+ acoes_ret = float(request.form.get('acoes_ret', 0)) / 100
21
+ renda_fixa = float(request.form.get('renda_fixa', 0)) / 100
22
+ inflacao = float(request.form.get('inflacao', 0)) / 100
23
+
24
+ anos = 10
25
+
26
+ # Simulação simples: calcular valor acumulado após 10 anos para cada investimento
27
+
28
+ # Studio: retorno mensal aplicado com juros compostos
29
+ studio_acumulado = capital * ((1 + studio_ret) ** (12 * anos))
30
+
31
+ # Imóvel: valorização anual composta + franquia lucro fixo anual
32
+ valor_imovel = capital * ((1 + valorizacao) ** anos)
33
+ lucro_franquia_total = franquia_ret * anos
34
+ imovel_acumulado = valor_imovel + lucro_franquia_total
35
+
36
+ # Ações: retorno anual composto
37
+ acoes_acumulado = capital * ((1 + acoes_ret) ** anos)
38
+
39
+ # Renda fixa: retorno anual composto
40
+ renda_fixa_acumulado = capital * ((1 + renda_fixa) ** anos)
41
+
42
+ # Inflação acumulada
43
+ inflacao_acumulada = (1 + inflacao) ** anos
44
+
45
+ # Ajustando valores pela inflação (poder de compra atual)
46
+ studio_real = studio_acumulado / inflacao_acumulada
47
+ imovel_real = imovel_acumulado / inflacao_acumulada
48
+ acoes_real = acoes_acumulado / inflacao_acumulada
49
+ renda_fixa_real = renda_fixa_acumulado / inflacao_acumulada
50
+
51
+ # Texto explicativo
52
+ texto = f"""
53
+ Simulação para {anos} anos com capital inicial de R$ {capital:,.2f}:
54
+
55
+ - Studio (retorno mensal de {studio_ret*100:.2f}%): R$ {studio_real:,.2f} (valor corrigido pela inflação)
56
+ - Imóvel (valorização anual de {valorizacao*100:.2f}% + lucro franquia anual R$ {franquia_ret:,.2f}): R$ {imovel_real:,.2f}
57
+ - Ações (retorno anual de {acoes_ret*100:.2f}%): R$ {acoes_real:,.2f}
58
+ - Renda Fixa (retorno anual de {renda_fixa*100:.2f}%): R$ {renda_fixa_real:,.2f}
59
+
60
+ Nota: Todos os valores estão ajustados pela inflação média anual de {inflacao*100:.2f}%.
61
+ """
62
+
63
+ # Gerar gráfico comparativo
64
+ labels = ['Studio', 'Imóvel', 'Ações', 'Renda Fixa']
65
+ valores = [studio_real, imovel_real, acoes_real, renda_fixa_real]
66
+
67
+ fig, ax = plt.subplots(figsize=(8,5))
68
+ bars = ax.bar(labels, valores, color=['#00c9a7', '#007cf0', '#ffa500', '#dd1144'])
69
+ ax.set_title(f'Valor acumulado corrigido pela inflação em {anos} anos', fontsize=14, pad=15)
70
+ ax.set_ylabel('Valor (R$)')
71
+ ax.grid(axis='y', linestyle='--', alpha=0.6)
72
+
73
+ # Mostrar valores em cima das barras
74
+ for bar in bars:
75
+ yval = bar.get_height()
76
+ ax.text(bar.get_x() + bar.get_width()/2, yval + max(valores)*0.02, f'R$ {yval:,.0f}', ha='center', fontsize=11)
77
+
78
+ # Salvar gráfico em PNG na memória
79
  buf = io.BytesIO()
80
+ plt.tight_layout()
81
  plt.savefig(buf, format='png')
82
+ plt.close(fig)
83
  buf.seek(0)
84
+ img_base64 = base64.b64encode(buf.read()).decode('utf-8')
85
+
86
+ return jsonify({'texto': texto.strip(), 'graficoBase64': img_base64})
87
+
88
+ except Exception as e:
89
+ return jsonify({'error': str(e)}), 400
90
+
91
+ if __name__ == "__main__":
92
+ app.run(debug=True)
93
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94