Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,123 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
app.run(debug=True)
|