Persano commited on
Commit
5e13118
·
verified ·
1 Parent(s): d28ef9f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +161 -89
app.py CHANGED
@@ -2,115 +2,187 @@
2
  import os
3
  os.environ['FONTCONFIG_PATH'] = '/tmp/fontconfig'
4
  os.makedirs('/tmp/fontconfig', exist_ok=True)
5
- from flask import Flask, request, render_template, send_file
6
- import io
7
- from xhtml2pdf import pisa
8
- import pandas as pd
9
  import matplotlib.pyplot as plt
 
 
10
  import base64
 
 
 
 
11
 
12
  app = Flask(__name__)
13
 
14
- @app.route('/', methods=['GET', 'POST'])
15
  def index():
16
- if request.method == 'POST':
17
- # Extrair dados do formulário
18
- capital = float(request.form['capital'])
19
- studio_ret = float(request.form['studio_ret'])
20
- valorizacao = float(request.form['valorizacao'])
21
- franquia_ret = float(request.form['franquia_ret'])
22
- acoes_ret = float(request.form['acoes_ret'])
23
- renda_fixa = float(request.form['renda_fixa'])
24
- inflacao = float(request.form['inflacao'])
25
-
26
- # Simulação fictícia
27
- anos = list(range(1, 6))
28
- resultados = {
29
- "Studio": [capital * (1 + studio_ret/100)**(12 * ano/12) for ano in anos],
30
- "Imóvel": [capital * (1 + valorizacao/100)**ano for ano in anos],
31
- "Franquia": [capital + franquia_ret * ano for ano in anos],
32
- "Ações": [capital * (1 + acoes_ret/100)**ano for ano in anos],
33
- "Renda Fixa": [capital * (1 + renda_fixa/100)**ano for ano in anos]
34
- }
35
 
36
- df = pd.DataFrame(resultados, index=[f'{ano}º ano' for ano in anos])
37
- tabela = df.to_html(classes='table', float_format='R$ {:,.2f}'.format)
38
 
39
- investimento_mais_valorizado = df.iloc[-1].idxmax()
40
- valor_mais_alto = df.iloc[-1].max()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
 
42
- # Gráfico
43
- fig, ax = plt.subplots()
44
- df.plot(ax=ax)
45
- ax.set_ylabel("Valor (R$)")
46
- ax.set_title("Comparativo de Investimentos")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
 
48
- img = io.BytesIO()
49
- plt.tight_layout()
50
- plt.savefig(img, format='png')
51
- img.seek(0)
52
- grafico = base64.b64encode(img.getvalue()).decode()
53
-
54
- return render_template("index.html",
55
- tabela=tabela,
56
- grafico=grafico,
57
- investimento_mais_valorizado=investimento_mais_valorizado,
58
- valor_mais_alto=valor_mais_alto,
59
- capital=capital,
60
- studio_ret=studio_ret,
61
- valorizacao=valorizacao,
62
- franquia_ret=franquia_ret,
63
- acoes_ret=acoes_ret,
64
- renda_fixa=renda_fixa,
65
- inflacao=inflacao,
66
- gerar_pdf=False)
67
  return render_template("index.html")
68
 
69
- @app.route('/download_pdf', methods=['POST'])
70
  def download_pdf():
71
- # Reutilize os mesmos dados do formulário para refazer a simulação
72
- capital = float(request.form['capital'])
73
- studio_ret = float(request.form['studio_ret'])
74
- valorizacao = float(request.form['valorizacao'])
75
- franquia_ret = float(request.form['franquia_ret'])
76
- acoes_ret = float(request.form['acoes_ret'])
77
- renda_fixa = float(request.form['renda_fixa'])
78
- inflacao = float(request.form['inflacao'])
 
79
 
80
  anos = list(range(1, 6))
81
- resultados = {
82
- "Studio": [capital * (1 + studio_ret/100)**(12 * ano/12) for ano in anos],
83
- "Imóvel": [capital * (1 + valorizacao/100)**ano for ano in anos],
84
- "Franquia": [capital + franquia_ret * ano for ano in anos],
85
- "Ações": [capital * (1 + acoes_ret/100)**ano for ano in anos],
86
- "Renda Fixa": [capital * (1 + renda_fixa/100)**ano for ano in anos]
 
 
 
 
 
 
 
 
87
  }
 
88
 
89
- df = pd.DataFrame(resultados, index=[f'{ano}º ano' for ano in anos])
90
- tabela = df.to_html(classes='table', float_format='R$ {:,.2f}'.format)
91
-
92
- investimento_mais_valorizado = df.iloc[-1].idxmax()
93
- valor_mais_alto = df.iloc[-1].max()
94
-
95
- html = render_template("index.html",
96
- tabela=tabela,
97
- grafico="",
98
- investimento_mais_valorizado=investimento_mais_valorizado,
99
- valor_mais_alto=valor_mais_alto,
100
- capital=capital,
101
- studio_ret=studio_ret,
102
- valorizacao=valorizacao,
103
- franquia_ret=franquia_ret,
104
- acoes_ret=acoes_ret,
105
- renda_fixa=renda_fixa,
106
- inflacao=inflacao,
107
- gerar_pdf=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
 
109
  pdf = io.BytesIO()
110
- pisa.CreatePDF(io.StringIO(html), dest=pdf)
111
  pdf.seek(0)
112
-
113
- return send_file(pdf, download_name="relatorio_simulacao.pdf", as_attachment=True)
114
 
115
 
116
 
 
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
8
+ 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"])
24
+ franquia_ret = float(request.form["franquia_ret"])
25
+ acoes_ret = float(request.form["acoes_ret"])
26
+ renda_fixa = float(request.form["renda_fixa"])
27
+ inflacao = float(request.form["inflacao"])
 
 
 
 
 
 
 
 
 
 
28
 
29
+ anos = list(range(1, 6))
 
30
 
31
+ # Cálculos
32
+ studio = [capital * ((1 + studio_ret / 100) ** (12 * ano)) for ano in anos]
33
+ franquia = [capital + (franquia_ret * ano) for ano in anos]
34
+ acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
35
+ renda_fixa = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
36
+ ajustado_inflacao = [valor / ((1 + inflacao / 100) ** ano) for valor, ano in zip(studio, anos)]
37
+
38
+ # Tabela com pandas
39
+ dados = {
40
+ "Ano": anos,
41
+ "Studio": studio,
42
+ "Franquia": franquia,
43
+ "Ações": acoes,
44
+ "Renda Fixa": renda_fixa,
45
+ "Studio c/ Inflação": ajustado_inflacao,
46
+ }
47
+ df = pd.DataFrame(dados)
48
+
49
+ # Maior retorno
50
+ investimentos_finais = {
51
+ "Studio": studio[-1],
52
+ "Franquia": franquia[-1],
53
+ "Ações": acoes[-1],
54
+ "Renda Fixa": renda_fixa[-1],
55
+ }
56
+ investimento_mais_valorizado = max(investimentos_finais, key=investimentos_finais.get)
57
+ valor_mais_alto = investimentos_finais[investimento_mais_valorizado]
58
+
59
+ # Gerar gráfico
60
+ plt.figure(figsize=(10, 6))
61
+ plt.plot(anos, studio, label="Studio", marker="o")
62
+ plt.plot(anos, franquia, label="Franquia", marker="o")
63
+ plt.plot(anos, acoes, label="Ações", marker="o")
64
+ plt.plot(anos, renda_fixa, label="Renda Fixa", marker="o")
65
+ plt.plot(anos, ajustado_inflacao, label="Studio c/ Inflação", linestyle="--", marker="o")
66
+ plt.title("Simulação de Investimentos")
67
+ plt.xlabel("Ano")
68
+ plt.ylabel("Valor Projetado (R$)")
69
+ plt.legend()
70
+ plt.grid(True)
71
+
72
+ def formatar_moeda(x, _):
73
+ return f"R${x:,.0f}".replace(",", ".")
74
+
75
+ plt.gca().yaxis.set_major_formatter(FuncFormatter(formatar_moeda))
76
+ plt.tight_layout()
77
 
78
+ buf = io.BytesIO()
79
+ plt.savefig(buf, format="png")
80
+ buf.seek(0)
81
+ grafico_base64 = base64.b64encode(buf.getvalue()).decode("utf-8")
82
+ buf.close()
83
+ plt.close()
84
+
85
+ # Tabela formatada para HTML
86
+ tabela_html = df.to_html(index=False, classes="table table-striped", float_format="R${:,.2f}".format)
87
+
88
+ return render_template(
89
+ "index.html",
90
+ capital=capital,
91
+ studio_ret=studio_ret,
92
+ valorizacao=valorizacao,
93
+ franquia_ret=franquia_ret,
94
+ acoes_ret=acoes_ret,
95
+ renda_fixa=renda_fixa,
96
+ inflacao=inflacao,
97
+ grafico=grafico_base64,
98
+ tabela=tabela_html,
99
+ investimento_mais_valorizado=investimento_mais_valorizado,
100
+ valor_mais_alto=valor_mais_alto,
101
+ gerar_pdf=False
102
+ )
103
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
  return render_template("index.html")
105
 
106
+ @app.route("/download_pdf", methods=["POST"])
107
  def download_pdf():
108
+ from flask import render_template_string
109
+
110
+ capital = float(request.form["capital"])
111
+ studio_ret = float(request.form["studio_ret"])
112
+ valorizacao = float(request.form["valorizacao"])
113
+ franquia_ret = float(request.form["franquia_ret"])
114
+ acoes_ret = float(request.form["acoes_ret"])
115
+ renda_fixa = float(request.form["renda_fixa"])
116
+ inflacao = float(request.form["inflacao"])
117
 
118
  anos = list(range(1, 6))
119
+
120
+ studio = [capital * ((1 + studio_ret / 100) ** (12 * ano)) for ano in anos]
121
+ franquia = [capital + (franquia_ret * ano) for ano in anos]
122
+ acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
123
+ renda_fixa = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
124
+ ajustado_inflacao = [valor / ((1 + inflacao / 100) ** ano) for valor, ano in zip(studio, anos)]
125
+
126
+ dados = {
127
+ "Ano": anos,
128
+ "Studio": studio,
129
+ "Franquia": franquia,
130
+ "Ações": acoes,
131
+ "Renda Fixa": renda_fixa,
132
+ "Studio c/ Inflação": ajustado_inflacao,
133
  }
134
+ df = pd.DataFrame(dados)
135
 
136
+ investimentos_finais = {
137
+ "Studio": studio[-1],
138
+ "Franquia": franquia[-1],
139
+ "Ações": acoes[-1],
140
+ "Renda Fixa": renda_fixa[-1],
141
+ }
142
+ investimento_mais_valorizado = max(investimentos_finais, key=investimentos_finais.get)
143
+ valor_mais_alto = investimentos_finais[investimento_mais_valorizado]
144
+
145
+ # Gráfico
146
+ plt.figure(figsize=(10, 6))
147
+ plt.plot(anos, studio, label="Studio", marker="o")
148
+ plt.plot(anos, franquia, label="Franquia", marker="o")
149
+ plt.plot(anos, acoes, label="Ações", marker="o")
150
+ plt.plot(anos, renda_fixa, label="Renda Fixa", marker="o")
151
+ plt.plot(anos, ajustado_inflacao, label="Studio c/ Inflação", linestyle="--", marker="o")
152
+ plt.title("Simulação de Investimentos")
153
+ plt.xlabel("Ano")
154
+ plt.ylabel("Valor Projetado (R$)")
155
+ plt.legend()
156
+ plt.grid(True)
157
+ plt.tight_layout()
158
+
159
+ buf = io.BytesIO()
160
+ plt.savefig(buf, format="png")
161
+ buf.seek(0)
162
+ grafico_base64 = base64.b64encode(buf.getvalue()).decode("utf-8")
163
+ buf.close()
164
+ plt.close()
165
+
166
+ tabela_html = df.to_html(index=False, classes="table table-striped", float_format="R${:,.2f}".format)
167
+
168
+ rendered_html = render_template("index.html",
169
+ capital=capital,
170
+ studio_ret=studio_ret,
171
+ valorizacao=valorizacao,
172
+ franquia_ret=franquia_ret,
173
+ acoes_ret=acoes_ret,
174
+ renda_fixa=renda_fixa,
175
+ inflacao=inflacao,
176
+ grafico=grafico_base64,
177
+ tabela=tabela_html,
178
+ investimento_mais_valorizado=investimento_mais_valorizado,
179
+ valor_mais_alto=valor_mais_alto,
180
+ gerar_pdf=True)
181
 
182
  pdf = io.BytesIO()
183
+ pisa.CreatePDF(io.StringIO(rendered_html), dest=pdf)
184
  pdf.seek(0)
185
+ return send_file(pdf, as_attachment=True, download_name="relatorio_simulacao.pdf", mimetype="application/pdf")
 
186
 
187
 
188