Update app.py
Browse files
app.py
CHANGED
@@ -1,126 +1,94 @@
|
|
1 |
-
from flask import Flask,
|
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 |
-
|
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 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
'
|
49 |
-
'
|
50 |
-
'
|
51 |
-
'
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
80 |
buf = io.BytesIO()
|
|
|
81 |
plt.savefig(buf, format='png')
|
|
|
82 |
buf.seek(0)
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
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 |
|