Update app.py
Browse files
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 |
-
|
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 |
-
|
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":
|
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":
|
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,
|
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 |
-
#
|
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)
|
|