Persano commited on
Commit
a131519
·
verified ·
1 Parent(s): 336130e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +9 -30
app.py CHANGED
@@ -1,7 +1,7 @@
1
-
2
  import os
3
  os.environ['FONTCONFIG_PATH'] = '/tmp/fontconfig'
4
  os.makedirs('/tmp/fontconfig', exist_ok=True)
 
5
  from flask import Flask, render_template, request, send_file
6
  import matplotlib.pyplot as plt
7
  import pandas as pd
@@ -9,15 +9,13 @@ import io
9
  import base64
10
  from matplotlib.ticker import FuncFormatter
11
  from xhtml2pdf import pisa
12
- from flask import make_response
13
- from jinja2 import Template
14
 
15
  app = Flask(__name__)
16
 
17
  @app.route("/", methods=["GET", "POST"])
18
  def index():
19
  if request.method == "POST":
20
- # Recebe dados do formulário
21
  capital = float(request.form["capital"])
22
  studio_ret = float(request.form["studio_ret"])
23
  valorizacao = float(request.form["valorizacao"])
@@ -25,34 +23,31 @@ def index():
25
  acoes_ret = float(request.form["acoes_ret"])
26
  renda_fixa = float(request.form["renda_fixa"])
27
  inflacao = float(request.form["inflacao"])
28
- # calcula os valores por ano a partir destes floats
29
 
30
  anos = list(range(1, 6))
31
 
32
- # Cálculos
33
  studio = [capital * ((1 + studio_ret / 100) ** (12 * ano)) for ano in anos]
34
  franquia = [capital + (franquia_ret * ano) for ano in anos]
35
  acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
36
- renda_fixa = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
37
  ajustado_inflacao = [valor / ((1 + inflacao / 100) ** ano) for valor, ano in zip(studio, anos)]
38
 
39
- # Tabela com pandas
40
  dados = {
41
  "Ano": anos,
42
  "Studio": studio,
43
  "Franquia": franquia,
44
  "Ações": acoes,
45
- "Renda Fixa": renda_fixa,
46
  "Studio c/ Inflação": ajustado_inflacao,
47
  }
48
  df = pd.DataFrame(dados)
49
 
50
- # Maior retorno
51
  investimentos_finais = {
52
  "Studio": studio[-1],
53
  "Franquia": franquia[-1],
54
  "Ações": acoes[-1],
55
- "Renda Fixa": renda_fixa[-1],
56
  }
57
  investimento_mais_valorizado = max(investimentos_finais, key=investimentos_finais.get)
58
  valor_mais_alto = investimentos_finais[investimento_mais_valorizado]
@@ -62,7 +57,7 @@ def index():
62
  plt.plot(anos, studio, label="Studio", marker="o")
63
  plt.plot(anos, franquia, label="Franquia", marker="o")
64
  plt.plot(anos, acoes, label="Ações", marker="o")
65
- plt.plot(anos, renda_fixa, label="Renda Fixa", marker="o")
66
  plt.plot(anos, ajustado_inflacao, label="Studio c/ Inflação", linestyle="--", marker="o")
67
  plt.title("Simulação de Investimentos")
68
  plt.xlabel("Ano")
@@ -83,7 +78,6 @@ def index():
83
  buf.close()
84
  plt.close()
85
 
86
- # Tabela formatada para HTML
87
  tabela_html = df.to_html(index=False, classes="table table-striped", float_format="R${:,.2f}".format)
88
 
89
  return render_template(
@@ -107,6 +101,7 @@ def index():
107
 
108
  @app.route("/download_pdf", methods=["POST"])
109
  def download_pdf():
 
110
  capital_inicial = float(request.form["capital"])
111
  retorno_mensal_studio = float(request.form["studio_ret"])
112
  valorizacao_anual = float(request.form["valorizacao"])
@@ -123,10 +118,6 @@ def download_pdf():
123
  valores_renda_fixa = [capital_inicial * ((1 + retorno_anual_renda_fixa / 100) ** ano) for ano in anos]
124
  valores_studio_ajustado_inflacao = [v / ((1 + inflacao_anual / 100) ** ano) for v, ano in zip(valores_studio, anos)]
125
 
126
- # resto do seu código continua igual...
127
-
128
-
129
- # Monta DataFrame para tabela
130
  dados = {
131
  "Ano": anos,
132
  "Studio": valores_studio,
@@ -137,7 +128,6 @@ def download_pdf():
137
  }
138
  df = pd.DataFrame(dados)
139
 
140
- # Define investimento com maior retorno final (considerando valores nominais)
141
  investimentos_finais = {
142
  "Studio": valores_studio[-1],
143
  "Franquia": valores_franquia[-1],
@@ -147,7 +137,7 @@ def download_pdf():
147
  investimento_mais_valorizado = max(investimentos_finais, key=investimentos_finais.get)
148
  valor_mais_alto = investimentos_finais[investimento_mais_valorizado]
149
 
150
- # Gerar gráfico comparativo (linha)
151
  plt.figure(figsize=(8,5))
152
  plt.plot(anos, valores_studio, label="Studio")
153
  plt.plot(anos, valores_franquia, label="Franquia")
@@ -161,14 +151,12 @@ def download_pdf():
161
  plt.grid(True)
162
  plt.tight_layout()
163
 
164
- # Salvar gráfico em base64 para usar no template PDF
165
  img_buffer = io.BytesIO()
166
  plt.savefig(img_buffer, format='png')
167
  img_buffer.seek(0)
168
  grafico_base64 = base64.b64encode(img_buffer.getvalue()).decode('utf-8')
169
  plt.close()
170
 
171
- # Criar tabela HTML estilizada para o relatório
172
  tabela = df.style.format({
173
  "Studio": "R$ {:,.2f}",
174
  "Franquia": "R$ {:,.2f}",
@@ -182,7 +170,6 @@ def download_pdf():
182
  {'selector': 'th, td', 'props': [('border', '1px solid #000')]},
183
  ]).render()
184
 
185
- # Renderiza template PDF
186
  html = render_template(
187
  "relatorio_pdf.html",
188
  capital=capital_inicial,
@@ -199,7 +186,6 @@ def download_pdf():
199
  valor_mais_alto=valor_mais_alto,
200
  )
201
 
202
- # Gera PDF usando xhtml2pdf
203
  pdf = io.BytesIO()
204
  pisa_status = pisa.CreatePDF(html, dest=pdf)
205
  if pisa_status.err:
@@ -209,12 +195,5 @@ def download_pdf():
209
  return send_file(pdf, mimetype="application/pdf", as_attachment=True, download_name="relatorio_simulacao.pdf")
210
 
211
 
212
-
213
-
214
-
215
-
216
-
217
-
218
  if __name__ == '__main__':
219
  app.run(host='0.0.0.0', port=7860, debug=True)
220
-
 
 
1
  import os
2
  os.environ['FONTCONFIG_PATH'] = '/tmp/fontconfig'
3
  os.makedirs('/tmp/fontconfig', exist_ok=True)
4
+
5
  from flask import Flask, render_template, request, send_file
6
  import matplotlib.pyplot as plt
7
  import pandas as pd
 
9
  import base64
10
  from matplotlib.ticker import FuncFormatter
11
  from xhtml2pdf import pisa
 
 
12
 
13
  app = Flask(__name__)
14
 
15
  @app.route("/", methods=["GET", "POST"])
16
  def index():
17
  if request.method == "POST":
18
+ # Recebe dados do formulário e converte para float
19
  capital = float(request.form["capital"])
20
  studio_ret = float(request.form["studio_ret"])
21
  valorizacao = float(request.form["valorizacao"])
 
23
  acoes_ret = float(request.form["acoes_ret"])
24
  renda_fixa = float(request.form["renda_fixa"])
25
  inflacao = float(request.form["inflacao"])
 
26
 
27
  anos = list(range(1, 6))
28
 
29
+ # Cálculos dos investimentos
30
  studio = [capital * ((1 + studio_ret / 100) ** (12 * ano)) for ano in anos]
31
  franquia = [capital + (franquia_ret * ano) for ano in anos]
32
  acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
33
+ renda_fixa_valores = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
34
  ajustado_inflacao = [valor / ((1 + inflacao / 100) ** ano) for valor, ano in zip(studio, anos)]
35
 
 
36
  dados = {
37
  "Ano": anos,
38
  "Studio": studio,
39
  "Franquia": franquia,
40
  "Ações": acoes,
41
+ "Renda Fixa": renda_fixa_valores,
42
  "Studio c/ Inflação": ajustado_inflacao,
43
  }
44
  df = pd.DataFrame(dados)
45
 
 
46
  investimentos_finais = {
47
  "Studio": studio[-1],
48
  "Franquia": franquia[-1],
49
  "Ações": acoes[-1],
50
+ "Renda Fixa": renda_fixa_valores[-1],
51
  }
52
  investimento_mais_valorizado = max(investimentos_finais, key=investimentos_finais.get)
53
  valor_mais_alto = investimentos_finais[investimento_mais_valorizado]
 
57
  plt.plot(anos, studio, label="Studio", marker="o")
58
  plt.plot(anos, franquia, label="Franquia", marker="o")
59
  plt.plot(anos, acoes, label="Ações", marker="o")
60
+ plt.plot(anos, renda_fixa_valores, label="Renda Fixa", marker="o")
61
  plt.plot(anos, ajustado_inflacao, label="Studio c/ Inflação", linestyle="--", marker="o")
62
  plt.title("Simulação de Investimentos")
63
  plt.xlabel("Ano")
 
78
  buf.close()
79
  plt.close()
80
 
 
81
  tabela_html = df.to_html(index=False, classes="table table-striped", float_format="R${:,.2f}".format)
82
 
83
  return render_template(
 
101
 
102
  @app.route("/download_pdf", methods=["POST"])
103
  def download_pdf():
104
+ # Recebe e converte dados
105
  capital_inicial = float(request.form["capital"])
106
  retorno_mensal_studio = float(request.form["studio_ret"])
107
  valorizacao_anual = float(request.form["valorizacao"])
 
118
  valores_renda_fixa = [capital_inicial * ((1 + retorno_anual_renda_fixa / 100) ** ano) for ano in anos]
119
  valores_studio_ajustado_inflacao = [v / ((1 + inflacao_anual / 100) ** ano) for v, ano in zip(valores_studio, anos)]
120
 
 
 
 
 
121
  dados = {
122
  "Ano": anos,
123
  "Studio": valores_studio,
 
128
  }
129
  df = pd.DataFrame(dados)
130
 
 
131
  investimentos_finais = {
132
  "Studio": valores_studio[-1],
133
  "Franquia": valores_franquia[-1],
 
137
  investimento_mais_valorizado = max(investimentos_finais, key=investimentos_finais.get)
138
  valor_mais_alto = investimentos_finais[investimento_mais_valorizado]
139
 
140
+ # Gráfico para PDF
141
  plt.figure(figsize=(8,5))
142
  plt.plot(anos, valores_studio, label="Studio")
143
  plt.plot(anos, valores_franquia, label="Franquia")
 
151
  plt.grid(True)
152
  plt.tight_layout()
153
 
 
154
  img_buffer = io.BytesIO()
155
  plt.savefig(img_buffer, format='png')
156
  img_buffer.seek(0)
157
  grafico_base64 = base64.b64encode(img_buffer.getvalue()).decode('utf-8')
158
  plt.close()
159
 
 
160
  tabela = df.style.format({
161
  "Studio": "R$ {:,.2f}",
162
  "Franquia": "R$ {:,.2f}",
 
170
  {'selector': 'th, td', 'props': [('border', '1px solid #000')]},
171
  ]).render()
172
 
 
173
  html = render_template(
174
  "relatorio_pdf.html",
175
  capital=capital_inicial,
 
186
  valor_mais_alto=valor_mais_alto,
187
  )
188
 
 
189
  pdf = io.BytesIO()
190
  pisa_status = pisa.CreatePDF(html, dest=pdf)
191
  if pisa_status.err:
 
195
  return send_file(pdf, mimetype="application/pdf", as_attachment=True, download_name="relatorio_simulacao.pdf")
196
 
197
 
 
 
 
 
 
 
198
  if __name__ == '__main__':
199
  app.run(host='0.0.0.0', port=7860, debug=True)