File size: 13,600 Bytes
f13ed7d
 
b5871c4
 
 
f13ed7d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4e0fbb5
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310


import os
os.environ['FONTCONFIG_PATH'] = '/tmp/fontconfig'
os.makedirs('/tmp/fontconfig', exist_ok=True)


from flask import Flask, render_template, request, send_file
import matplotlib.pyplot as plt
import io
import base64
from datetime import datetime
import pandas as pd

app = Flask(__name__)

# Função para formatar valor em reais
def formatar_brl(valor):
    return f"R$ {valor:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".")

# Função para gerar gráfico e retornar base64
def gerar_grafico(valores, labels):
    plt.figure(figsize=(8,4))
    for label in labels:
        plt.plot(valores['Ano'], valores[label], label=label)
    plt.title("Projeção dos Investimentos ao longo dos anos")
    plt.xlabel("Ano")
    plt.ylabel("Valor (R$)")
    plt.legend()
    plt.grid(True)
    plt.tight_layout()

    img = io.BytesIO()
    plt.savefig(img, format='png')
    plt.close()
    img.seek(0)
    img_base64 = base64.b64encode(img.getvalue()).decode()
    return img_base64

# Rota principal com formulário e relatório
@app.route("/", methods=["GET", "POST"])
def index():
    if request.method == "POST":
        try:
            capital = float(request.form["capital"])
            studio_ret = float(request.form["studio_ret"])
            valorizacao = float(request.form["valorizacao"])
            franquia_ret = float(request.form["franquia_ret"])
            acoes_ret = float(request.form["acoes_ret"])
            renda_fixa = float(request.form["renda_fixa"])
            inflacao = float(request.form["inflacao"])
            anos = int(request.form["anos"])

            # Cálculo dos valores ao longo dos anos
            anos_lista = list(range(0, anos + 1))

            df = pd.DataFrame({"Ano": anos_lista})
            # Studio: capital * (1 + retorno + valorização)^ano
            df["Studio"] = capital * ((1 + (studio_ret + valorizacao)/100) ** df["Ano"])
            # Franquia: capital + retorno fixo anual * ano
            df["Franquia"] = capital + franquia_ret * df["Ano"]
            # Ações: capital * (1 + retorno)^ano
            df["Ações"] = capital * ((1 + acoes_ret/100) ** df["Ano"])
            # Renda Fixa: capital * (1 + retorno)^ano
            df["Renda Fixa"] = capital * ((1 + renda_fixa/100) ** df["Ano"])

            # Valores finais para comparação
            valores_finais = df.iloc[-1, 1:]
            investimento_mais_valorizado = valores_finais.idxmax()
            valor_mais_alto = valores_finais.max()

            # Preparar resumo tabela
            resumo = []
            for investimento in ["Studio", "Franquia", "Ações", "Renda Fixa"]:
                valor_final = valores_finais[investimento]
                retorno_abs = valor_final - capital
                retorno_pct = (retorno_abs / capital) * 100
                resumo.append({
                    "Investimento": investimento,
                    "Valor Final": formatar_brl(valor_final),
                    "Retorno Absoluto": formatar_brl(retorno_abs),
                    "Retorno (%)": f"{retorno_pct:.2f}%"
                })

            # Montar tabela html para PDF
            tabela_html = """
            <table>
                <thead>
                    <tr>
                        <th style="text-align:left;">Investimento</th>
                        <th>Valor Final</th>
                        <th>Retorno Absoluto</th>
                        <th>Retorno (%)</th>
                    </tr>
                </thead>
                <tbody>
            """
            for r in resumo:
                tabela_html += f"""
                <tr>
                    <td style="text-align:left;">{r['Investimento']}</td>
                    <td>{r['Valor Final']}</td>
                    <td>{r['Retorno Absoluto']}</td>
                    <td>{r['Retorno (%)']}</td>
                </tr>
                """
            tabela_html += "</tbody></table>"

            # Gerar gráfico
            img_base64 = gerar_grafico(df, ["Studio", "Franquia", "Ações", "Renda Fixa"])

            analise_final = (f"Após análise dos cenários projetados para {anos} anos, o investimento "
                             f"<strong>{investimento_mais_valorizado}</strong> apresenta o melhor desempenho, "
                             f"com um valor final estimado de <strong>{formatar_brl(valor_mais_alto)}</strong>, "
                             "equivalente a um retorno significativo sobre o capital inicial.")

            comentario_extra = None  # Caso queira adicionar algo extra

            return render_template("relatorio.html",
                                   capital=capital,
                                   studio_ret=studio_ret,
                                   valorizacao=valorizacao,
                                   franquia_ret=franquia_ret,
                                   acoes_ret=acoes_ret,
                                   renda_fixa=renda_fixa,
                                   inflacao=inflacao,
                                   anos=anos,
                                   resumo=resumo,
                                   tabela_html=tabela_html,
                                   grafico=img_base64,
                                   analise_final=analise_final,
                                   comentario_extra=comentario_extra,
                                   investimento_mais_valorizado=investimento_mais_valorizado,
                                   valor_mais_alto=valor_mais_alto,
                                   now=datetime.now(),
                                   formatar_brl=formatar_brl)
        except Exception as e:
            return f"Erro no processamento: {e}"

    # GET: apenas mostra o formulário
    return '''
    <h2>Simulação de Investimentos</h2>
    <form method="post">
      <label>Capital Inicial (R$): <input name="capital" type="number" step="0.01" value="100000" required></label><br><br>
      <label>Retorno Studio (% ao ano): <input name="studio_ret" type="number" step="0.01" value="8" required></label><br><br>
      <label>Valorização Studio (% ao ano): <input name="valorizacao" type="number" step="0.01" value="5" required></label><br><br>
      <label>Retorno Franquia (R$ ao ano): <input name="franquia_ret" type="number" step="0.01" value="7000" required></label><br><br>
      <label>Retorno Ações (% ao ano): <input name="acoes_ret" type="number" step="0.01" value="10" required></label><br><br>
      <label>Retorno Renda Fixa (% ao ano): <input name="renda_fixa" type="number" step="0.01" value="6" required></label><br><br>
      <label>Inflação (% ao ano): <input name="inflacao" type="number" step="0.01" value="4" required></label><br><br>
      <label>Anos de Projeção: <input name="anos" type="number" value="5" required></label><br><br>
      <button type="submit">Gerar Relatório</button>
    </form>
    '''

# Página do relatório com template HTML
@app.route("/relatorio")
def relatorio():
    # Esta rota só funciona se o formulário for submetido,
    # por isso recomendamos usar a rota '/' para gerar o relatório.
    return "Acesse a página inicial e preencha o formulário para gerar o relatório."

# Geração do PDF com WeasyPrint ou pdfkit (exemplo com pdfkit)
from flask import make_response
import pdfkit

@app.route("/download_pdf", methods=["POST"])
def download_pdf():
    try:
        # Receber os dados do form para gerar relatório no pdf
        capital = float(request.form["capital"])
        studio_ret = float(request.form["studio_ret"])
        valorizacao = float(request.form["valorizacao"])
        franquia_ret = float(request.form["franquia_ret"])
        acoes_ret = float(request.form["acoes_ret"])
        renda_fixa = float(request.form["renda_fixa"])
        inflacao = float(request.form["inflacao"])
        anos = int(request.form["anos"])

        # Repetir cálculo para gerar dados e gráfico
        anos_lista = list(range(0, anos + 1))

        df = pd.DataFrame({"Ano": anos_lista})
        df["Studio"] = capital * ((1 + (studio_ret + valorizacao)/100) ** df["Ano"])
        df["Franquia"] = capital + franquia_ret * df["Ano"]
        df["Ações"] = capital * ((1 + acoes_ret/100) ** df["Ano"])
        df["Renda Fixa"] = capital * ((1 + renda_fixa/100) ** df["Ano"])

        valores_finais = df.iloc[-1, 1:]
        investimento_mais_valorizado = valores_finais.idxmax()
        valor_mais_alto = valores_finais.max()

        resumo = []
        for investimento in ["Studio", "Franquia", "Ações", "Renda Fixa"]:
            valor_final = valores_finais[investimento]
            retorno_abs = valor_final - capital
            retorno_pct = (retorno_abs / capital) * 100
            resumo.append({
                "Investimento": investimento,
                "Valor Final": formatar_brl(valor_final),
                "Retorno Absoluto": formatar_brl(retorno_abs),
                "Retorno (%)": f"{retorno_pct:.2f}%"
            })

        tabela_html = """
        <table>
            <thead>
                <tr>
                    <th style="text-align:left;">Investimento</th>
                    <th>Valor Final</th>
                    <th>Retorno Absoluto</th>
                    <th>Retorno (%)</th>
                </tr>
            </thead>
            <tbody>
        """
        for r in resumo:
            tabela_html += f"""
            <tr>
                <td style="text-align:left;">{r['Investimento']}</td>
                <td>{r['Valor Final']}</td>
                <td>{r['Retorno Absoluto']}</td>
                <td>{r['Retorno (%)']}</td>
            </tr>
            """
        tabela_html += "</tbody></table>"

        img_base64 = gerar_grafico(df, ["Studio", "Franquia", "Ações", "Renda Fixa"])

        analise_final = (f"Após análise dos cenários projetados para {anos} anos, o investimento "
                         f"<strong>{investimento_mais_valorizado}</strong> apresenta o melhor desempenho, "
                         f"com um valor final estimado de <strong>{formatar_brl(valor_mais_alto)}</strong>, "
                         "equivalente a um retorno significativo sobre o capital inicial.")

        consideracoes_finais = f"""
        <h2>Considerações Finais</h2>
        <p>{analise_final}</p>
        <p>
            O investimento que apresentou o maior retorno neste cenário foi o <strong>{investimento_mais_valorizado}</strong>,
            atingindo um valor patrimonial final estimado em <strong>{formatar_brl(valor_mais_alto)}</strong>.
        </p>
        <p>
            <strong>Valor Patrimonial</strong> refere-se ao valor total acumulado do investimento, incluindo a valorização do ativo e os rendimentos obtidos ao longo do tempo. 
            Conforme as normas contábeis e práticas de avaliação de investidores profissionais, o valor patrimonial é fundamental para mensurar a saúde financeira e o crescimento do patrimônio líquido do investidor.
            Ele serve como indicador da capacidade do investimento de gerar riqueza real, levando em conta tanto a valorização de mercado quanto a geração de renda.
        </p>
        """

        html = f"""
        <html>
        <head>
        <meta charset="utf-8">
        <style>
          body {{ font-family: Arial, sans-serif; font-size: 14px; margin: 20px; }}
          h2 {{ color: #2c3e50; }}
          table {{ width: 100%; border-collapse: collapse; margin-top: 20px; }}
          th, td {{ border: 1px solid #ccc; padding: 6px; text-align: right; }}
          th {{ background-color: #f0f0f0; }}
          .destaque {{ background: #e8f5e9; padding: 10px; margin-top: 20px; border-left: 6px solid #2e7d32; }}
        </style>
        </head>
        <body>
          <h2>Relatório de Simulação de Investimentos</h2>
          <p>Data da Simulação: {datetime.today().strftime('%d/%m/%Y')}</p>
          <p>Capital Inicial: <strong>{formatar_brl(capital)}</strong></p>

          <h3>Dados de Entrada</h3>
          <table>
            <tr><th>Parâmetro</th><th>Valor</th></tr>
            <tr><td>Retorno Studio (%)</td><td>{studio_ret}%</td></tr>
            <tr><td>Valorização Studio (%)</td><td>{valorizacao}%</td></tr>
            <tr><td>Retorno Franquia (R$)</td><td>{formatar_brl(franquia_ret)}</td></tr>
            <tr><td>Retorno Ações (%)</td><td>{acoes_ret}%</td></tr>
            <tr><td>Retorno Renda Fixa (%)</td><td>{renda_fixa}%</td></tr>
            <tr><td>Inflação (%)</td><td>{inflacao}%</td></tr>
          </table>

          <div class="destaque">{analise_final}</div>

          <img src="data:image/png;base64,{img_base64}" width="100%" />

          <h3>Resumo dos Investimentos</h3>
          {tabela_html}

          {consideracoes_finais}
        </body>
        </html>
        """

        # Gerar PDF com pdfkit (você precisa do wkhtmltopdf instalado)
        options = {
            'encoding': 'UTF-8',
            'page-size': 'A4',
            'margin-top': '10mm',
            'margin-bottom': '10mm',
            'margin-left': '10mm',
            'margin-right': '10mm',
        }
        pdf = pdfkit.from_string(html, False, options=options)

        response = make_response(pdf)
        response.headers['Content-Type'] = 'application/pdf'
        response.headers['Content-Disposition'] = 'attachment; filename=relatorio_investimentos.pdf'
        return response
    except Exception as e:
        return f"Erro na geração do PDF: {e}"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=7860, debug=True)