Update app.py
Browse files
app.py
CHANGED
@@ -108,92 +108,120 @@ def index():
|
|
108 |
|
109 |
@app.route("/download_pdf", methods=["POST"])
|
110 |
def download_pdf():
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
127 |
dados = {
|
128 |
"Ano": anos,
|
129 |
-
"Studio":
|
130 |
-
"Franquia":
|
131 |
-
"Ações":
|
132 |
-
"Renda Fixa":
|
133 |
-
"Studio c/ Inflação":
|
134 |
}
|
135 |
df = pd.DataFrame(dados)
|
136 |
|
|
|
137 |
investimentos_finais = {
|
138 |
-
"Studio":
|
139 |
-
"Franquia":
|
140 |
-
"Ações":
|
141 |
-
"Renda Fixa":
|
142 |
}
|
143 |
investimento_mais_valorizado = max(investimentos_finais, key=investimentos_finais.get)
|
144 |
valor_mais_alto = investimentos_finais[investimento_mais_valorizado]
|
145 |
|
146 |
-
# Gerar gráfico (
|
147 |
-
plt.figure(figsize=(
|
148 |
-
plt.plot(anos,
|
149 |
-
plt.plot(anos,
|
150 |
-
plt.plot(anos,
|
151 |
-
plt.plot(anos,
|
152 |
-
plt.plot(anos,
|
153 |
-
plt.title("
|
154 |
plt.xlabel("Ano")
|
155 |
-
plt.ylabel("Valor
|
156 |
plt.legend()
|
157 |
plt.grid(True)
|
158 |
plt.tight_layout()
|
159 |
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
plt.close()
|
166 |
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
171 |
"relatorio_pdf.html",
|
172 |
-
capital=
|
173 |
-
studio_ret=
|
174 |
-
valorizacao=
|
175 |
-
franquia_ret=
|
176 |
-
acoes_ret=
|
177 |
-
renda_fixa=
|
178 |
-
inflacao=
|
|
|
|
|
179 |
grafico=grafico_base64,
|
180 |
-
tabela=tabela_html,
|
181 |
investimento_mais_valorizado=investimento_mais_valorizado,
|
182 |
valor_mais_alto=valor_mais_alto,
|
183 |
)
|
184 |
|
|
|
185 |
pdf = io.BytesIO()
|
186 |
-
pisa_status = pisa.CreatePDF(
|
187 |
-
pdf.seek(0)
|
188 |
-
|
189 |
if pisa_status.err:
|
190 |
return "Erro ao gerar PDF", 500
|
191 |
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
|
198 |
|
199 |
|
|
|
108 |
|
109 |
@app.route("/download_pdf", methods=["POST"])
|
110 |
def download_pdf():
|
111 |
+
# Recebe os dados do formulário
|
112 |
+
capital_inicial = float(request.form["capital"])
|
113 |
+
retorno_mensal_studio = float(request.form["studio_ret"])
|
114 |
+
valorizacao_anual = float(request.form["valorizacao"])
|
115 |
+
lucro_anual_franquia = float(request.form["franquia_ret"])
|
116 |
+
retorno_anual_acoes = float(request.form["acoes_ret"])
|
117 |
+
retorno_anual_renda_fixa = float(request.form["renda_fixa"])
|
118 |
+
inflacao_anual = float(request.form["inflacao"])
|
119 |
+
|
120 |
+
anos = list(range(1, 6)) # Simulação de 5 anos
|
121 |
+
|
122 |
+
# Calcula os valores ano a ano para cada investimento
|
123 |
+
valores_studio = [
|
124 |
+
capital_inicial * ((1 + retorno_mensal_studio / 100) ** (12 * ano))
|
125 |
+
for ano in anos
|
126 |
+
]
|
127 |
+
valores_franquia = [
|
128 |
+
capital_inicial + (lucro_anual_franquia * ano)
|
129 |
+
for ano in anos
|
130 |
+
]
|
131 |
+
valores_acoes = [
|
132 |
+
capital_inicial * ((1 + retorno_anual_acoes / 100) ** ano)
|
133 |
+
for ano in anos
|
134 |
+
]
|
135 |
+
valores_renda_fixa = [
|
136 |
+
capital_inicial * ((1 + retorno_anual_renda_fixa / 100) ** ano)
|
137 |
+
for ano in anos
|
138 |
+
]
|
139 |
+
valores_studio_ajustado_inflacao = [
|
140 |
+
valor / ((1 + inflacao_anual / 100) ** ano)
|
141 |
+
for valor, ano in zip(valores_studio, anos)
|
142 |
+
]
|
143 |
+
|
144 |
+
# Monta DataFrame para tabela
|
145 |
dados = {
|
146 |
"Ano": anos,
|
147 |
+
"Studio": valores_studio,
|
148 |
+
"Franquia": valores_franquia,
|
149 |
+
"Ações": valores_acoes,
|
150 |
+
"Renda Fixa": valores_renda_fixa,
|
151 |
+
"Studio c/ Inflação": valores_studio_ajustado_inflacao,
|
152 |
}
|
153 |
df = pd.DataFrame(dados)
|
154 |
|
155 |
+
# Define investimento com maior retorno final (considerando valores nominais)
|
156 |
investimentos_finais = {
|
157 |
+
"Studio": valores_studio[-1],
|
158 |
+
"Franquia": valores_franquia[-1],
|
159 |
+
"Ações": valores_acoes[-1],
|
160 |
+
"Renda Fixa": valores_renda_fixa[-1],
|
161 |
}
|
162 |
investimento_mais_valorizado = max(investimentos_finais, key=investimentos_finais.get)
|
163 |
valor_mais_alto = investimentos_finais[investimento_mais_valorizado]
|
164 |
|
165 |
+
# Gerar gráfico comparativo (linha)
|
166 |
+
plt.figure(figsize=(8,5))
|
167 |
+
plt.plot(anos, valores_studio, label="Studio")
|
168 |
+
plt.plot(anos, valores_franquia, label="Franquia")
|
169 |
+
plt.plot(anos, valores_acoes, label="Ações")
|
170 |
+
plt.plot(anos, valores_renda_fixa, label="Renda Fixa")
|
171 |
+
plt.plot(anos, valores_studio_ajustado_inflacao, label="Studio c/ Inflação", linestyle='--')
|
172 |
+
plt.title("Comparação dos Investimentos")
|
173 |
plt.xlabel("Ano")
|
174 |
+
plt.ylabel("Valor (R$)")
|
175 |
plt.legend()
|
176 |
plt.grid(True)
|
177 |
plt.tight_layout()
|
178 |
|
179 |
+
# Salvar gráfico em base64 para usar no template PDF
|
180 |
+
img_buffer = io.BytesIO()
|
181 |
+
plt.savefig(img_buffer, format='png')
|
182 |
+
img_buffer.seek(0)
|
183 |
+
grafico_base64 = base64.b64encode(img_buffer.getvalue()).decode('utf-8')
|
184 |
plt.close()
|
185 |
|
186 |
+
# Criar tabela HTML estilizada para o relatório
|
187 |
+
tabela = df.style.format({
|
188 |
+
"Studio": "R$ {:,.2f}",
|
189 |
+
"Franquia": "R$ {:,.2f}",
|
190 |
+
"Ações": "R$ {:,.2f}",
|
191 |
+
"Renda Fixa": "R$ {:,.2f}",
|
192 |
+
"Studio c/ Infla�o": "R$ {:,.2f}",
|
193 |
+
}).hide_index().set_table_styles([
|
194 |
+
{'selector': 'th', 'props': [('background-color', '#007bff'), ('color', 'white'), ('text-align', 'center')]},
|
195 |
+
{'selector': 'td', 'props': [('text-align', 'right'), ('padding', '6px 8px')]},
|
196 |
+
{'selector': 'table', 'props': [('border-collapse', 'collapse'), ('width', '100%')]},
|
197 |
+
{'selector': 'th, td', 'props': [('border', '1px solid #000')]},
|
198 |
+
]).render()
|
199 |
+
|
200 |
+
# Renderiza template PDF
|
201 |
+
html = render_template(
|
202 |
"relatorio_pdf.html",
|
203 |
+
capital=capital_inicial,
|
204 |
+
studio_ret=retorno_mensal_studio,
|
205 |
+
valorizacao=valorizacao_anual,
|
206 |
+
franquia_ret=lucro_anual_franquia,
|
207 |
+
acoes_ret=retorno_anual_acoes,
|
208 |
+
renda_fixa=retorno_anual_renda_fixa,
|
209 |
+
inflacao=inflacao_anual,
|
210 |
+
anos=anos,
|
211 |
+
tabela=tabela,
|
212 |
grafico=grafico_base64,
|
|
|
213 |
investimento_mais_valorizado=investimento_mais_valorizado,
|
214 |
valor_mais_alto=valor_mais_alto,
|
215 |
)
|
216 |
|
217 |
+
# Gera PDF usando xhtml2pdf
|
218 |
pdf = io.BytesIO()
|
219 |
+
pisa_status = pisa.CreatePDF(html, dest=pdf)
|
|
|
|
|
220 |
if pisa_status.err:
|
221 |
return "Erro ao gerar PDF", 500
|
222 |
|
223 |
+
pdf.seek(0)
|
224 |
+
return send_file(pdf, mimetype="application/pdf", as_attachment=True, download_name="relatorio_simulacao.pdf")
|
|
|
|
|
|
|
225 |
|
226 |
|
227 |
|