Persano commited on
Commit
d9cd7b4
·
verified ·
1 Parent(s): df7705a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +7 -151
app.py CHANGED
@@ -13,13 +13,8 @@ from datetime import datetime
13
 
14
  app = Flask(__name__)
15
 
16
- # Filtro para formatar valores em moeda BRL
17
- @app.template_filter('formatar_brl')
18
- def formatar_brl_filter(valor):
19
- try:
20
- return f"R$ {valor:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".")
21
- except Exception:
22
- return valor
23
 
24
  def gerar_analise(investimentos_finais, capital):
25
  melhor = max(investimentos_finais, key=investimentos_finais.get)
@@ -27,7 +22,7 @@ def gerar_analise(investimentos_finais, capital):
27
  retorno_pct = ((valor_melhor - capital) / capital) * 100
28
  analise = f"""
29
  Após análise dos cenários projetados para 5 anos, o investimento <strong>{melhor}</strong> apresenta o melhor desempenho,
30
- com um valor final estimado de <strong>{formatar_brl_filter(valor_melhor)}</strong>, equivalente a um retorno de <strong>{retorno_pct:.1f}%</strong>.
31
  """
32
  return analise
33
 
@@ -52,15 +47,12 @@ def index():
52
  acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
53
  renda_fixa_valores = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
54
 
55
- studio_ajustado_inflacao = [p / ((1 + inflacao / 100) ** ano) for p, ano in zip(patrimonio_studio, anos)]
56
-
57
  dados = {
58
  "Ano": anos,
59
  "Studio (Patrimônio + Renda)": studio_total,
60
  "Franquia": franquia,
61
  "Ações": acoes,
62
- "Renda Fixa": renda_fixa_valores,
63
- "Studio Patrimônio c/ Inflação": studio_ajustado_inflacao,
64
  }
65
  df = pd.DataFrame(dados)
66
 
@@ -74,13 +66,11 @@ def index():
74
  investimento_mais_valorizado = max(investimentos_finais, key=investimentos_finais.get)
75
  valor_mais_alto = investimentos_finais[investimento_mais_valorizado]
76
 
77
- # Gráfico
78
  plt.figure(figsize=(8, 5))
79
  plt.plot(anos, studio_total, label="Studio (Patrimônio + Renda)", marker="o")
80
  plt.plot(anos, franquia, label="Franquia", marker="o")
81
  plt.plot(anos, acoes, label="Ações", marker="o")
82
  plt.plot(anos, renda_fixa_valores, label="Renda Fixa", marker="o")
83
- plt.plot(anos, studio_ajustado_inflacao, label="Studio Patrimônio c/ Inflação", linestyle="--", marker="o")
84
  plt.title("Projeção de Investimentos")
85
  plt.xlabel("Ano")
86
  plt.ylabel("Valor (R$)")
@@ -100,11 +90,10 @@ def index():
100
  buf.close()
101
  plt.close()
102
 
103
- # Tabela formatada
104
  df_formatado = df.copy()
105
  for col in df.columns:
106
  if col != "Ano":
107
- df_formatado[col] = df_formatado[col].apply(formatar_brl_filter)
108
  tabela = df_formatado.to_html(index=False, classes="table table-striped table-sm", border=0)
109
 
110
  analise_final = gerar_analise(investimentos_finais, capital)
@@ -115,8 +104,8 @@ def index():
115
  retorno_pct = (retorno_abs / capital) * 100
116
  resumo.append({
117
  "Investimento": nome,
118
- "Valor Final": formatar_brl_filter(valor_final),
119
- "Retorno Absoluto": formatar_brl_filter(retorno_abs),
120
  "Retorno (%)": f"{retorno_pct:.1f}%"
121
  })
122
  resumo = sorted(resumo, key=lambda x: float(x["Retorno (%)"].replace("%", "").replace(",", ".")), reverse=True)
@@ -150,138 +139,5 @@ def index():
150
  )
151
  return render_template("index.html")
152
 
153
- @app.route("/download_pdf", methods=["POST"])
154
- def download_pdf():
155
- capital_inicial = float(request.form["capital"])
156
- retorno_mensal_studio = float(request.form["studio_ret"])
157
- valorizacao_anual = float(request.form["valorizacao"])
158
- lucro_anual_franquia = float(request.form["franquia_ret"])
159
- retorno_anual_acoes = float(request.form["acoes_ret"])
160
- retorno_anual_renda_fixa = float(request.form["renda_fixa"])
161
- inflacao_anual = float(request.form["inflacao"])
162
-
163
- anos = list(range(1, 6))
164
-
165
- patrimonio_studio = [capital_inicial * ((1 + valorizacao_anual / 100) ** ano) for ano in anos]
166
- renda_acumulada_studio = [capital_inicial * (((1 + retorno_mensal_studio / 100) ** (12 * ano)) - 1) for ano in anos]
167
- studio_total = [p + r for p, r in zip(patrimonio_studio, renda_acumulada_studio)]
168
-
169
- franquia = [capital_inicial + (lucro_anual_franquia * ano) for ano in anos]
170
- acoes = [capital_inicial * ((1 + retorno_anual_acoes / 100) ** ano) for ano in anos]
171
- renda_fixa = [capital_inicial * ((1 + retorno_anual_renda_fixa / 100) ** ano) for ano in anos]
172
- studio_ajustado_inflacao = [p / ((1 + inflacao_anual / 100) ** ano) for p, ano in zip(patrimonio_studio, anos)]
173
-
174
- df = pd.DataFrame({
175
- "Ano": anos,
176
- "Studio (Patrimônio + Renda)": studio_total,
177
- "Franquia": franquia,
178
- "Ações": acoes,
179
- "Renda Fixa": renda_fixa,
180
- "Studio Patrimônio c/ Inflação": studio_ajustado_inflacao,
181
- })
182
-
183
- investimentos_finais = {
184
- "Studio": studio_total[-1],
185
- "Franquia": franquia[-1],
186
- "Ações": acoes[-1],
187
- "Renda Fixa": renda_fixa[-1],
188
- }
189
-
190
- investimento_mais_valorizado = max(investimentos_finais, key=investimentos_finais.get)
191
- valor_mais_alto = investimentos_finais[investimento_mais_valorizado]
192
-
193
- plt.figure(figsize=(8, 5))
194
- plt.plot(anos, studio_total, label="Studio (Patrimônio + Renda)", marker="o")
195
- plt.plot(anos, franquia, label="Franquia", marker="o")
196
- plt.plot(anos, acoes, label="Ações", marker="o")
197
- plt.plot(anos, renda_fixa, label="Renda Fixa", marker="o")
198
- plt.plot(anos, studio_ajustado_inflacao, label="Studio Patrimônio c/ Inflação", linestyle="--", marker="o")
199
- plt.title("Comparação dos Investimentos")
200
- plt.xlabel("Ano")
201
- plt.ylabel("Valor (R$)")
202
- plt.legend()
203
- plt.grid(True)
204
- plt.tight_layout()
205
-
206
- img_buffer = io.BytesIO()
207
- plt.savefig(img_buffer, format='png')
208
- img_buffer.seek(0)
209
- grafico_base64 = base64.b64encode(img_buffer.getvalue()).decode('utf-8')
210
- plt.close()
211
-
212
- df_formatado = df.copy()
213
- for col in df.columns:
214
- if col != "Ano":
215
- df_formatado[col] = df_formatado[col].apply(formatar_brl_filter)
216
-
217
- tabela = df_formatado.to_html(index=False, classes="table table-sm table-bordered", border=1)
218
-
219
- analise_final = gerar_analise(investimentos_finais, capital_inicial)
220
-
221
- resumo = []
222
- for nome, valor_final in investimentos_finais.items():
223
- retorno_abs = valor_final - capital_inicial
224
- retorno_pct = (retorno_abs / capital_inicial) * 100
225
- resumo.append({
226
- "Investimento": nome,
227
- "Valor Final": formatar_brl_filter(valor_final),
228
- "Retorno Absoluto": formatar_brl_filter(retorno_abs),
229
- "Retorno (%)": f"{retorno_pct:.1f}%"
230
- })
231
- resumo = sorted(resumo, key=lambda x: float(x["Retorno (%)"].replace("%", "").replace(",", ".")), reverse=True)
232
-
233
- diferenca_pct = float(resumo[0]["Retorno (%)"].replace("%", "").replace(",", ".")) - float(resumo[1]["Retorno (%)"].replace("%", "").replace(",", "."))
234
- comentario_extra = ""
235
- if diferenca_pct < 5:
236
- comentario_extra = f"""
237
- Apesar do <strong>{resumo[0]['Investimento']}</strong> ter se destacado, a diferença em relação ao segundo colocado
238
- (<strong>{resumo[1]['Investimento']}</strong>) foi de apenas {diferenca_pct:.1f} pontos percentuais.
239
- Isso indica que ambas as estratégias podem ser consideradas, dependendo do perfil de risco e objetivos do investidor.
240
- """
241
-
242
- valor_patrimonial_studio = patrimonio_studio[-1]
243
-
244
- explicacao_detalhada = f"""
245
- <h3>Explicações e Detalhes</h3>
246
- <p>O investimento <strong>Studio</strong> considera dois componentes importantes: a valorização patrimonial do imóvel e a renda mensal obtida com o aluguel ou uso.</p>
247
- <ul>
248
- <li><strong>Valorização Patrimonial:</strong> o valor do imóvel cresce à taxa anual de {valorizacao_anual:.2f}% ao ano.</li>
249
- <li><strong>Renda Mensal:</strong> o retorno mensal de {retorno_mensal_studio:.2f}% é composto ao longo dos meses, acumulando no total projetado.</li>
250
- <li>Esses dois efeitos juntos proporcionam o valor total do Studio ao longo dos anos.</li>
251
- </ul>
252
- <p>Os demais investimentos são projetados de acordo com seus respectivos retornos e aportes.</p>
253
- <p>A inflação anual considerada é de {inflacao_anual:.2f}%, usada para ajustar o valor patrimonial do Studio e mostrar a valorização real.</p>
254
- """
255
-
256
- html = render_template(
257
- "relatorio_pdf.html",
258
- capital=capital_inicial,
259
- studio_ret=retorno_mensal_studio,
260
- valorizacao=valorizacao_anual,
261
- franquia_ret=lucro_anual_franquia,
262
- acoes_ret=retorno_anual_acoes,
263
- renda_fixa=retorno_anual_renda_fixa,
264
- inflacao=inflacao_anual,
265
- anos=anos,
266
- tabela=tabela,
267
- grafico=grafico_base64,
268
- investimento_mais_valorizado=investimento_mais_valorizado,
269
- valor_mais_alto=valor_mais_alto,
270
- analise_final=analise_final,
271
- comentario_extra=comentario_extra,
272
- resumo=resumo,
273
- explicacao_detalhada=explicacao_detalhada,
274
- valor_patrimonial_studio=valor_patrimonial_studio,
275
- now=datetime.now()
276
- )
277
-
278
- pdf = io.BytesIO()
279
- pisa_status = pisa.CreatePDF(html, dest=pdf)
280
- if pisa_status.err:
281
- return "Erro ao gerar PDF", 500
282
-
283
- pdf.seek(0)
284
- return send_file(pdf, mimetype="application/pdf", as_attachment=True, download_name="relatorio_simulacao.pdf")
285
-
286
  if __name__ == '__main__':
287
  app.run(host='0.0.0.0', port=7860, debug=True)
 
13
 
14
  app = Flask(__name__)
15
 
16
+ def formatar_brl(valor):
17
+ return f"R$ {valor:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".")
 
 
 
 
 
18
 
19
  def gerar_analise(investimentos_finais, capital):
20
  melhor = max(investimentos_finais, key=investimentos_finais.get)
 
22
  retorno_pct = ((valor_melhor - capital) / capital) * 100
23
  analise = f"""
24
  Após análise dos cenários projetados para 5 anos, o investimento <strong>{melhor}</strong> apresenta o melhor desempenho,
25
+ com um valor final estimado de <strong>{formatar_brl(valor_melhor)}</strong>, equivalente a um retorno de <strong>{retorno_pct:.1f}%</strong>.
26
  """
27
  return analise
28
 
 
47
  acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
48
  renda_fixa_valores = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
49
 
 
 
50
  dados = {
51
  "Ano": anos,
52
  "Studio (Patrimônio + Renda)": studio_total,
53
  "Franquia": franquia,
54
  "Ações": acoes,
55
+ "Renda Fixa": renda_fixa_valores
 
56
  }
57
  df = pd.DataFrame(dados)
58
 
 
66
  investimento_mais_valorizado = max(investimentos_finais, key=investimentos_finais.get)
67
  valor_mais_alto = investimentos_finais[investimento_mais_valorizado]
68
 
 
69
  plt.figure(figsize=(8, 5))
70
  plt.plot(anos, studio_total, label="Studio (Patrimônio + Renda)", marker="o")
71
  plt.plot(anos, franquia, label="Franquia", marker="o")
72
  plt.plot(anos, acoes, label="Ações", marker="o")
73
  plt.plot(anos, renda_fixa_valores, label="Renda Fixa", marker="o")
 
74
  plt.title("Projeção de Investimentos")
75
  plt.xlabel("Ano")
76
  plt.ylabel("Valor (R$)")
 
90
  buf.close()
91
  plt.close()
92
 
 
93
  df_formatado = df.copy()
94
  for col in df.columns:
95
  if col != "Ano":
96
+ df_formatado[col] = df_formatado[col].apply(formatar_brl)
97
  tabela = df_formatado.to_html(index=False, classes="table table-striped table-sm", border=0)
98
 
99
  analise_final = gerar_analise(investimentos_finais, capital)
 
104
  retorno_pct = (retorno_abs / capital) * 100
105
  resumo.append({
106
  "Investimento": nome,
107
+ "Valor Final": formatar_brl(valor_final),
108
+ "Retorno Absoluto": formatar_brl(retorno_abs),
109
  "Retorno (%)": f"{retorno_pct:.1f}%"
110
  })
111
  resumo = sorted(resumo, key=lambda x: float(x["Retorno (%)"].replace("%", "").replace(",", ".")), reverse=True)
 
139
  )
140
  return render_template("index.html")
141
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
142
  if __name__ == '__main__':
143
  app.run(host='0.0.0.0', port=7860, debug=True)