Persano commited on
Commit
965bdc3
·
verified ·
1 Parent(s): 99ec7a4

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +87 -59
app.py CHANGED
@@ -108,92 +108,120 @@ def index():
108
 
109
  @app.route("/download_pdf", methods=["POST"])
110
  def download_pdf():
111
- capital = float(request.form["capital"])
112
- studio_ret = float(request.form["studio_ret"])
113
- valorizacao = float(request.form["valorizacao"])
114
- franquia_ret = float(request.form["franquia_ret"])
115
- acoes_ret = float(request.form["acoes_ret"])
116
- renda_fixa = float(request.form["renda_fixa"])
117
- inflacao = float(request.form["inflacao"])
118
-
119
- anos = list(range(1, 6))
120
-
121
- studio = [capital * ((1 + studio_ret / 100) ** (12 * ano)) for ano in anos]
122
- franquia = [capital + (franquia_ret * ano) for ano in anos]
123
- acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
124
- renda_fixa = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
125
- ajustado_inflacao = [valor / ((1 + inflacao / 100) ** ano) for valor, ano in zip(studio, anos)]
126
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
  dados = {
128
  "Ano": anos,
129
- "Studio": studio,
130
- "Franquia": franquia,
131
- "Ações": acoes,
132
- "Renda Fixa": renda_fixa,
133
- "Studio c/ Inflação": ajustado_inflacao,
134
  }
135
  df = pd.DataFrame(dados)
136
 
 
137
  investimentos_finais = {
138
- "Studio": studio[-1],
139
- "Franquia": franquia[-1],
140
- "Ações": acoes[-1],
141
- "Renda Fixa": renda_fixa[-1],
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 (base64)
147
- plt.figure(figsize=(10, 6))
148
- plt.plot(anos, studio, label="Studio", marker="o")
149
- plt.plot(anos, franquia, label="Franquia", marker="o")
150
- plt.plot(anos, acoes, label="Ações", marker="o")
151
- plt.plot(anos, renda_fixa, label="Renda Fixa", marker="o")
152
- plt.plot(anos, ajustado_inflacao, label="Studio c/ Inflação", linestyle="--", marker="o")
153
- plt.title("Simulação de Investimentos")
154
  plt.xlabel("Ano")
155
- plt.ylabel("Valor Projetado (R$)")
156
  plt.legend()
157
  plt.grid(True)
158
  plt.tight_layout()
159
 
160
- buf = io.BytesIO()
161
- plt.savefig(buf, format="png")
162
- buf.seek(0)
163
- grafico_base64 = base64.b64encode(buf.getvalue()).decode("utf-8")
164
- buf.close()
165
  plt.close()
166
 
167
- tabela_html = df.to_html(index=False, classes="", float_format="R${:,.2f}".format)
168
-
169
- # Renderizar template simplificado para PDF
170
- rendered_html = render_template(
 
 
 
 
 
 
 
 
 
 
 
 
171
  "relatorio_pdf.html",
172
- capital=capital,
173
- studio_ret=studio_ret,
174
- valorizacao=valorizacao,
175
- franquia_ret=franquia_ret,
176
- acoes_ret=acoes_ret,
177
- renda_fixa=renda_fixa,
178
- inflacao=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(rendered_html, dest=pdf)
187
- pdf.seek(0)
188
-
189
  if pisa_status.err:
190
  return "Erro ao gerar PDF", 500
191
 
192
- return send_file(pdf, as_attachment=True, download_name="relatorio_simulacao.pdf", mimetype="application/pdf")
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