Persano commited on
Commit
6265dca
·
verified ·
1 Parent(s): bc25456

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +199 -221
app.py CHANGED
@@ -3,86 +3,191 @@ os.environ['FONTCONFIG_PATH'] = '/tmp/fontconfig'
3
  os.makedirs('/tmp/fontconfig', exist_ok=True)
4
 
5
 
6
- import base64
7
- from datetime import datetime
8
  from flask import Flask, render_template, request, send_file
9
  import pandas as pd
 
10
  import matplotlib.pyplot as plt
11
- from matplotlib.ticker import FuncFormatter
12
  from reportlab.lib.pagesizes import A4
13
- from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, Image, PageBreak
14
- from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
15
  from reportlab.lib import colors
16
- from reportlab.lib.units import cm
 
17
 
18
  app = Flask(__name__)
19
 
20
- def formatar_brl(valor):
21
- return f"R$ {valor:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
 
23
- def calcular_valor_patrimonial(capital, taxa_valorizacao_anual, anos=5):
24
- return capital * ((1 + taxa_valorizacao_anual / 100) ** anos)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
 
26
- def gerar_analise(investimentos_finais, capital):
27
- melhor = max(investimentos_finais, key=investimentos_finais.get)
28
- valor_melhor = investimentos_finais[melhor]
29
- retorno_pct = ((valor_melhor - capital) / capital) * 100
30
- analise = f"""
31
- Após análise dos cenários projetados para 5 anos, o investimento <strong>{melhor}</strong> apresenta o melhor desempenho,
32
- com um valor final estimado de <strong>{formatar_brl(valor_melhor)}</strong>, equivalente a um retorno de <strong>{retorno_pct:.1f}%</strong> sobre o capital inicial.
33
- """
34
- return analise, melhor, valor_melhor
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
 
36
  @app.route("/", methods=["GET", "POST"])
37
  def index():
38
  if request.method == "POST":
39
- # Captura dados do formulário
40
- capital = float(request.form["capital"])
41
- studio_ret = float(request.form["studio_ret"])
42
- valorizacao = float(request.form["valorizacao"])
43
- franquia_ret = float(request.form["franquia_ret"])
44
- acoes_ret = float(request.form["acoes_ret"])
45
- renda_fixa = float(request.form["renda_fixa"])
46
- inflacao = float(request.form["inflacao"])
47
-
48
- anos = list(range(1, 6))
49
-
50
- # Cálculos dos investimentos
51
- patrimonio_studio = [capital * ((1 + valorizacao / 100) ** ano) for ano in anos]
52
- renda_acumulada_studio = [capital * (((1 + studio_ret / 100) ** (12 * ano)) - 1) for ano in anos]
53
- studio_total = [p + r for p, r in zip(patrimonio_studio, renda_acumulada_studio)]
54
-
55
- franquia = [capital + (franquia_ret * ano) for ano in anos]
56
- acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
57
- renda_fixa_valores = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
58
-
59
- dados = {
60
- "Ano": anos,
61
- "Studio (Patrimônio + Renda)": studio_total,
62
- "Franquia": franquia,
63
- "Ações": acoes,
64
- "Renda Fixa": renda_fixa_valores
65
- }
66
- df = pd.DataFrame(dados)
67
-
68
- investimentos_finais = {
69
- "Studio": studio_total[-1],
70
- "Franquia": franquia[-1],
71
- "Ações": acoes[-1],
72
- "Renda Fixa": renda_fixa_valores[-1],
73
- }
74
-
75
- analise_final, investimento_mais_valorizado, valor_mais_alto = gerar_analise(investimentos_finais, capital)
76
-
77
- # Preparar tabela HTML formatada para o browser
78
- df_formatado = df.copy()
79
- for col in df.columns:
80
- if col != "Ano":
81
- df_formatado[col] = df_formatado[col].apply(formatar_brl)
82
- tabela = df_formatado.to_html(index=False, classes="table table-striped table-sm", border=0)
83
 
84
  return render_template(
85
  "index.html",
 
86
  capital=capital,
87
  studio_ret=studio_ret,
88
  valorizacao=valorizacao,
@@ -90,176 +195,49 @@ def index():
90
  acoes_ret=acoes_ret,
91
  renda_fixa=renda_fixa,
92
  inflacao=inflacao,
93
- anos=anos,
94
- tabela=tabela,
95
  analise_final=analise_final,
96
- investimento_mais_valorizado=investimento_mais_valorizado,
97
- valor_mais_alto=valor_mais_alto,
98
- resumo=investimentos_finais
99
  )
100
- return render_template("index.html")
 
101
 
102
  @app.route("/download_pdf", methods=["POST"])
103
  def download_pdf():
104
- capital = float(request.form["capital"])
105
- studio_ret = float(request.form["studio_ret"])
106
- valorizacao = float(request.form["valorizacao"])
107
- franquia_ret = float(request.form["franquia_ret"])
108
- acoes_ret = float(request.form["acoes_ret"])
109
- renda_fixa = float(request.form["renda_fixa"])
110
- inflacao = float(request.form["inflacao"])
111
-
112
- anos = list(range(1, 6))
113
-
114
- patrimonio_studio = [capital * ((1 + valorizacao / 100) ** ano) for ano in anos]
115
- renda_acumulada_studio = [capital * (((1 + studio_ret / 100) ** (12 * ano)) - 1) for ano in anos]
116
- studio_total = [p + r for p, r in zip(patrimonio_studio, renda_acumulada_studio)]
117
-
118
- franquia = [capital + (franquia_ret * ano) for ano in anos]
119
- acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
120
- renda_fixa_valores = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
121
-
122
- dados = {
123
- "Ano": anos,
124
- "Studio (Patrimônio + Renda)": studio_total,
125
- "Franquia": franquia,
126
- "Ações": acoes,
127
- "Renda Fixa": renda_fixa_valores
128
- }
129
- df = pd.DataFrame(dados)
130
-
131
- investimentos_finais = {
132
- "Studio": studio_total[-1],
133
- "Franquia": franquia[-1],
134
- "Ações": acoes[-1],
135
- "Renda Fixa": renda_fixa_valores[-1],
136
- }
137
 
138
- analise_final, investimento_mais_valorizado, valor_mais_alto = gerar_analise(investimentos_finais, capital)
 
139
 
140
- valor_patrimonial = calcular_valor_patrimonial(capital, valorizacao)
141
 
142
- # Gerar gráfico matplotlib e salvar em buffer para o PDF
143
- plt.figure(figsize=(8, 4.5))
144
- plt.plot(anos, studio_total, label="Studio (Patrimônio + Renda)", marker="o")
145
- plt.plot(anos, franquia, label="Franquia", marker="o")
146
- plt.plot(anos, acoes, label="Ações", marker="o")
147
- plt.plot(anos, renda_fixa_valores, label="Renda Fixa", marker="o")
148
- plt.title("Projeção de Investimentos - 5 anos")
149
- plt.xlabel("Ano")
150
- plt.ylabel("Valor (R$)")
151
- plt.legend()
152
- plt.grid(True)
153
- plt.gca().yaxis.set_major_formatter(FuncFormatter(lambda x, _: f"R${x:,.0f}".replace(",", ".")))
154
- plt.tight_layout()
155
 
156
- img_buffer = io.BytesIO()
157
- plt.savefig(img_buffer, format="PNG")
158
- img_buffer.seek(0)
159
- plt.close()
160
 
161
- # Montar PDF com reportlab
162
- pdf_buffer = io.BytesIO()
163
- doc = SimpleDocTemplate(pdf_buffer, pagesize=A4, rightMargin=2*cm,leftMargin=2*cm, topMargin=2*cm, bottomMargin=2*cm)
164
- styles = getSampleStyleSheet()
165
- styleN = styles['Normal']
166
- styleH = styles['Heading1']
167
-
168
- elementos = []
169
-
170
- # Página 1: Dados de entrada
171
- elementos.append(Paragraph("Dados de Entrada da Simulação", styleH))
172
- elementos.append(Spacer(1, 12))
173
- dados_entrada = [
174
- ["Parâmetro", "Valor"],
175
- ["Capital Inicial (R$)", formatar_brl(capital)],
176
- ["Retorno Mensal Studio (%)", f"{studio_ret:.2f}%"],
177
- ["Valorização Anual Studio (%)", f"{valorizacao:.2f}%"],
178
- ["Retorno Anual Franquia (R$)", formatar_brl(franquia_ret)],
179
- ["Retorno Anual Ações (%)", f"{acoes_ret:.2f}%"],
180
- ["Retorno Anual Renda Fixa (%)", f"{renda_fixa:.2f}%"],
181
- ["Inflação Anual Estimada (%)", f"{inflacao:.2f}%"],
182
- ]
183
- tabela_entrada = Table(dados_entrada, colWidths=[200, 150])
184
- tabela_entrada.setStyle(TableStyle([
185
- ('BACKGROUND', (0,0), (-1,0), colors.HexColor("#2E7D32")),
186
- ('TEXTCOLOR', (0,0), (-1,0), colors.white),
187
- ('ALIGN', (0,0), (-1,-1), 'LEFT'),
188
- ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
189
- ('FONTSIZE', (0,0), (-1,-1), 10),
190
- ('BOTTOMPADDING', (0,0), (-1,0), 8),
191
- ('BACKGROUND', (0,1), (-1,-1), colors.whitesmoke),
192
- ('GRID', (0,0), (-1,-1), 0.5, colors.grey),
193
- ]))
194
- elementos.append(tabela_entrada)
195
- elementos.append(PageBreak())
196
-
197
- # Página 2: Explicação valor patrimonial
198
- texto_patrimonial = f"""
199
- O valor patrimonial do Studio corresponde ao valor acumulado da valorização do imóvel, sem considerar a renda gerada pelo investimento.
200
- Após 5 anos, este valor é estimado em <strong>{formatar_brl(valor_patrimonial)}</strong>. Este cálculo segue as normas contábeis e práticas recomendadas por investidores profissionais,
201
- refletindo o aumento do patrimônio imobiliário ao longo do tempo.
202
- """
203
- elementos.append(Paragraph("Valor Patrimonial do Studio", styleH))
204
- elementos.append(Spacer(1, 12))
205
- elementos.append(Paragraph(texto_patrimonial, styleN))
206
- elementos.append(PageBreak())
207
-
208
- # Página 3: Gráfico de evolução
209
- elementos.append(Paragraph("Gráfico de Evolução dos Investimentos", styleH))
210
- elementos.append(Spacer(1, 12))
211
- img = Image(img_buffer)
212
- img._restrictSize(17*cm, 9*cm)
213
- elementos.append(img)
214
- elementos.append(PageBreak())
215
-
216
- # Página 4: Tabela evolução ano a ano
217
- elementos.append(Paragraph("Evolução Ano a Ano dos Investimentos", styleH))
218
- elementos.append(Spacer(1, 12))
219
-
220
- df_formatado = df.copy()
221
- for col in df.columns:
222
- if col != "Ano":
223
- df_formatado[col] = df_formatado[col].apply(formatar_brl)
224
- dados_tabela = [df_formatado.columns.to_list()] + df_formatado.values.tolist()
225
-
226
- tabela_invest = Table(dados_tabela, colWidths=[50, 120, 120, 120, 120])
227
- tabela_invest.setStyle(TableStyle([
228
- ('BACKGROUND', (0,0), (-1,0), colors.HexColor("#2E7D32")),
229
- ('TEXTCOLOR', (0,0), (-1,0), colors.white),
230
- ('ALIGN', (1,1), (-1,-1), 'RIGHT'),
231
- ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
232
- ('FONTSIZE', (0,0), (-1,-1), 9),
233
- ('BOTTOMPADDING', (0,0), (-1,0), 8),
234
- ('BACKGROUND', (0,1), (-1,-1), colors.whitesmoke),
235
- ('GRID', (0,0), (-1,-1), 0.5, colors.grey),
236
- ]))
237
- elementos.append(tabela_invest)
238
- elementos.append(PageBreak())
239
-
240
- # Página 5: Considerações finais
241
- elementos.append(Paragraph("Considerações Finais", styleH))
242
- elementos.append(Spacer(1, 12))
243
-
244
- analise_texto = analise_final.replace("<strong>", "").replace("</strong>", "")
245
- texto_final = (
246
- analise_texto +
247
- f"\n\nO valor patrimonial do investimento {investimento_mais_valorizado} é de {formatar_brl(valor_mais_alto)}.\n\n"
248
- "O valor patrimonial é uma métrica essencial para investidores profissionais, pois reflete o patrimônio líquido acumulado do investimento, "
249
- "de acordo com normas contábeis vigentes e práticas do mercado financeiro."
250
- )
251
- elementos.append(Paragraph(texto_final, styleN))
252
 
253
- doc.build(elementos)
 
254
 
255
- pdf_buffer.seek(0)
256
- return send_file(
257
- pdf_buffer,
258
- mimetype="application/pdf",
259
- as_attachment=True,
260
- download_name="relatorio_investimentos.pdf"
261
- )
262
-
263
  if __name__ == '__main__':
264
  app.run(host='0.0.0.0', port=7860, debug=True)
265
 
 
3
  os.makedirs('/tmp/fontconfig', exist_ok=True)
4
 
5
 
 
 
6
  from flask import Flask, render_template, request, send_file
7
  import pandas as pd
8
+ import io
9
  import matplotlib.pyplot as plt
 
10
  from reportlab.lib.pagesizes import A4
11
+ from reportlab.pdfgen import canvas
12
+ from reportlab.lib.utils import ImageReader
13
  from reportlab.lib import colors
14
+ from reportlab.platypus import Table, TableStyle, Paragraph, Spacer
15
+ from reportlab.lib.styles import getSampleStyleSheet
16
 
17
  app = Flask(__name__)
18
 
19
+ def calcula_investimentos(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao, anos=5):
20
+ # capital inicial
21
+ dados = []
22
+ # Valores iniciais
23
+ studio_valor = capital
24
+ franquia_valor = capital
25
+ acoes_valor = capital
26
+ renda_valor = capital
27
+
28
+ # Para calcular valor patrimonial do studio: só considera valorização acumulada (sem renda)
29
+ studio_valor_patrimonial = capital
30
+
31
+ for ano in range(1, anos+1):
32
+ # Studio: valor patrimonial aumenta pela valorização anual
33
+ studio_valor_patrimonial *= (1 + valorizacao / 100)
34
+ # Renda mensal acumulada convertida para anual, reinvestida mensalmente - simplificamos usando juros compostos anualizados aproximados
35
+ studio_valor *= (1 + studio_ret / 100) ** 12
36
+ studio_valor *= (1 + valorizacao / 100) # valor patrimonial cresce
37
+
38
+ # Franquia: apenas retorno anual fixo somado
39
+ franquia_valor += franquia_ret
40
+
41
+ # Ações: cresce pelo retorno anual
42
+ acoes_valor *= (1 + acoes_ret / 100)
43
+
44
+ # Renda fixa: cresce pelo retorno anual
45
+ renda_valor *= (1 + renda_fixa / 100)
46
+
47
+ # Ajuste pela inflação para valores reais (opcional)
48
+ # Para esse exemplo, só mostramos valores nominais
49
+
50
+ dados.append({
51
+ 'Ano': ano,
52
+ 'Studio Valor Total (R$)': round(studio_valor, 2),
53
+ 'Studio Valor Patrimonial (R$)': round(studio_valor_patrimonial, 2),
54
+ 'Franquia Valor Total (R$)': round(franquia_valor, 2),
55
+ 'Ações Valor Total (R$)': round(acoes_valor, 2),
56
+ 'Renda Fixa Valor Total (R$)': round(renda_valor, 2),
57
+ })
58
 
59
+ df = pd.DataFrame(dados)
60
+ return df, studio_valor_patrimonial, studio_valor
61
+
62
+ def gera_grafico(df):
63
+ plt.switch_backend('Agg')
64
+ plt.figure(figsize=(8,5))
65
+ plt.plot(df['Ano'], df['Studio Valor Total (R$)'], label='Studio Total')
66
+ plt.plot(df['Ano'], df['Franquia Valor Total (R$)'], label='Franquia Total')
67
+ plt.plot(df['Ano'], df['Ações Valor Total (R$)'], label='Ações Total')
68
+ plt.plot(df['Ano'], df['Renda Fixa Valor Total (R$)'], label='Renda Fixa Total')
69
+ plt.title('Evolução do Investimento ao Longo dos Anos')
70
+ plt.xlabel('Ano')
71
+ plt.ylabel('Valor (R$)')
72
+ plt.legend()
73
+ plt.grid(True)
74
+ buf = io.BytesIO()
75
+ plt.savefig(buf, format='PNG')
76
+ plt.close()
77
+ buf.seek(0)
78
+ return buf
79
 
80
+ def gera_pdf(df, grafico_buf, params, valor_patrimonial, analise_final):
81
+ buffer = io.BytesIO()
82
+ c = canvas.Canvas(buffer, pagesize=A4)
83
+ width, height = A4
84
+ styles = getSampleStyleSheet()
85
+ normal_style = styles["Normal"]
86
+ title_style = styles["Title"]
87
+
88
+ c.setFont("Helvetica-Bold", 16)
89
+ c.drawString(50, height-50, "Relatório de Investimentos")
90
+
91
+ y = height - 80
92
+
93
+ # Mostrar dados de entrada
94
+ c.setFont("Helvetica-Bold", 12)
95
+ c.drawString(50, y, "Parâmetros de Entrada:")
96
+ y -= 20
97
+ c.setFont("Helvetica", 10)
98
+ for k,v in params.items():
99
+ c.drawString(55, y, f"{k}: {v}")
100
+ y -= 15
101
+
102
+ y -= 15
103
+
104
+ # Mostrar explicação do valor patrimonial do Studio
105
+ c.setFont("Helvetica-Bold", 12)
106
+ c.drawString(50, y, "Valor Patrimonial do Studio:")
107
+ y -= 15
108
+ text = ("O valor patrimonial do Studio é o valor acumulado do aumento do patrimônio, "
109
+ "considerando apenas a valorização do imóvel, sem a renda gerada.")
110
+ p = Paragraph(text, normal_style)
111
+ w, h = p.wrap(width - 100, y)
112
+ p.drawOn(c, 50, y - h)
113
+ y -= h + 10
114
+
115
+ c.setFont("Helvetica", 10)
116
+ c.drawString(50, y, f"Valor Patrimonial estimado após 5 anos: R$ {valor_patrimonial:,.2f}".replace(",", "X").replace(".", ",").replace("X", "."))
117
+ y -= 30
118
+
119
+ # Inserir gráfico
120
+ img = ImageReader(grafico_buf)
121
+ c.drawImage(img, 50, y - 250, width=500, height=250)
122
+ y -= 260
123
+
124
+ # Criar tabela com dados
125
+ data = [df.columns.to_list()] + df.round(2).astype(str).values.tolist()
126
+
127
+ # Formatar números para formato brasileiro (vírgula)
128
+ for i in range(1, len(data)):
129
+ for j in range(1, len(data[i])):
130
+ data[i][j] = data[i][j].replace('.', ',')
131
+
132
+ table = Table(data, colWidths=[50, 100, 110, 110, 110, 110])
133
+ style = TableStyle([
134
+ ('BACKGROUND', (0,0), (-1,0), colors.HexColor('#2E7D32')),
135
+ ('TEXTCOLOR', (0,0), (-1,0), colors.white),
136
+ ('ALIGN', (1,1), (-1,-1), 'RIGHT'),
137
+ ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
138
+ ('GRID', (0,0), (-1,-1), 0.5, colors.grey),
139
+ ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.whitesmoke, colors.lightgrey]),
140
+ ])
141
+ table.setStyle(style)
142
+
143
+ w, h = table.wrapOn(c, width-100, y)
144
+ if y - h < 50:
145
+ c.showPage()
146
+ y = height - 50
147
+ table.drawOn(c, 50, y - h)
148
+ y -= h + 20
149
+
150
+ # Análise final
151
+ p2 = Paragraph(f"<b>Considerações finais:</b><br/>{analise_final}", normal_style)
152
+ w2, h2 = p2.wrap(width - 100, y)
153
+ if y - h2 < 50:
154
+ c.showPage()
155
+ y = height - 50
156
+ p2.drawOn(c, 50, y - h2)
157
+
158
+ c.save()
159
+ buffer.seek(0)
160
+ return buffer
161
 
162
  @app.route("/", methods=["GET", "POST"])
163
  def index():
164
  if request.method == "POST":
165
+ capital = float(request.form.get("capital"))
166
+ studio_ret = float(request.form.get("studio_ret"))
167
+ valorizacao = float(request.form.get("valorizacao"))
168
+ franquia_ret = float(request.form.get("franquia_ret"))
169
+ acoes_ret = float(request.form.get("acoes_ret"))
170
+ renda_fixa = float(request.form.get("renda_fixa"))
171
+ inflacao = float(request.form.get("inflacao"))
172
+
173
+ df, valor_patrimonial, valor_total_studio = calcula_investimentos(
174
+ capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao
175
+ )
176
+
177
+ # Construir tabela HTML simples para mostrar na página
178
+ tabela_html = df.to_html(classes="table table-striped table-bordered", index=False, float_format="R$ {:,.2f}".format)
179
+
180
+ # Identificar maior retorno final
181
+ max_valor = max(df.iloc[-1][1:])
182
+ max_col = df.columns[(df.iloc[-1][1:] == max_valor).idxmax()]
183
+
184
+ analise_final = (f"Após análise dos cenários projetados para 5 anos, o investimento Studio apresenta o melhor desempenho, "
185
+ f"com um valor final estimado de R$ {valor_total_studio:,.2f}. "
186
+ f"Isto representa um retorno significativo sobre o capital inicial.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
187
 
188
  return render_template(
189
  "index.html",
190
+ tabela=tabela_html,
191
  capital=capital,
192
  studio_ret=studio_ret,
193
  valorizacao=valorizacao,
 
195
  acoes_ret=acoes_ret,
196
  renda_fixa=renda_fixa,
197
  inflacao=inflacao,
 
 
198
  analise_final=analise_final,
199
+ investimento_mais_valorizado=max_col,
200
+ valor_mais_alto=max_valor
 
201
  )
202
+ else:
203
+ return render_template("index.html")
204
 
205
  @app.route("/download_pdf", methods=["POST"])
206
  def download_pdf():
207
+ capital = float(request.form.get("capital"))
208
+ studio_ret = float(request.form.get("studio_ret"))
209
+ valorizacao = float(request.form.get("valorizacao"))
210
+ franquia_ret = float(request.form.get("franquia_ret"))
211
+ acoes_ret = float(request.form.get("acoes_ret"))
212
+ renda_fixa = float(request.form.get("renda_fixa"))
213
+ inflacao = float(request.form.get("inflacao"))
214
+
215
+ df, valor_patrimonial, valor_total_studio = calcula_investimentos(
216
+ capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao
217
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
218
 
219
+ analise_final = (f"Após análise dos cenários projetados para 5 anos, o investimento Studio apresenta o melhor desempenho, "
220
+ f"com um valor final estimado de R$ {valor_total_studio:,.2f}, equivalente a um retorno significativo sobre o capital inicial.")
221
 
222
+ grafico_buf = gera_grafico(df)
223
 
224
+ params = {
225
+ "Capital Inicial (R$)": f"R$ {capital:,.2f}",
226
+ "Retorno Mensal Studio (%)": f"{studio_ret}%",
227
+ "Valorização Anual Studio (%)": f"{valorizacao}%",
228
+ "Retorno Anual Franquia (R$)": f"R$ {franquia_ret:,.2f}",
229
+ "Retorno Anual Ações (%)": f"{acoes_ret}%",
230
+ "Retorno Anual Renda Fixa (%)": f"{renda_fixa}%",
231
+ "Inflação Anual Estimada (%)": f"{inflacao}%"
232
+ }
 
 
 
 
233
 
234
+ pdf_buffer = gera_pdf(df, grafico_buf, params, valor_patrimonial, analise_final)
 
 
 
235
 
236
+ return send_file(pdf_buffer, as_attachment=True, download_name="relatorio_investimentos.pdf", mimetype="application/pdf")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
237
 
238
+ if __name__ == "__main__":
239
+ app.run(debug=True)
240
 
 
 
 
 
 
 
 
 
241
  if __name__ == '__main__':
242
  app.run(host='0.0.0.0', port=7860, debug=True)
243