Update app.py
Browse files
    	
        app.py
    CHANGED
    
    | @@ -7,19 +7,12 @@ from weasyprint import HTML | |
| 7 |  | 
| 8 | 
             
            app = Flask(__name__)
         | 
| 9 |  | 
|  | |
| 10 | 
             
            def gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao=0, anos=10):
         | 
| 11 | 
             
                anos_lista = list(range(1, anos + 1))
         | 
| 12 | 
            -
                studio = []
         | 
| 13 | 
            -
             | 
| 14 | 
            -
                 | 
| 15 | 
            -
                acoes = []
         | 
| 16 | 
            -
                renda_fixa_arr = []
         | 
| 17 | 
            -
             | 
| 18 | 
            -
                cap_studio = capital
         | 
| 19 | 
            -
                cap_imovel = capital
         | 
| 20 | 
            -
                cap_franquia = capital
         | 
| 21 | 
            -
                cap_acoes = capital
         | 
| 22 | 
            -
                cap_renda_fixa = capital
         | 
| 23 |  | 
| 24 | 
             
                for ano in anos_lista:
         | 
| 25 | 
             
                    inf_cum = (1 + inflacao / 100) ** ano
         | 
| @@ -44,13 +37,16 @@ def gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, r | |
| 44 | 
             
                    'Renda Fixa': renda_fixa_arr
         | 
| 45 | 
             
                })
         | 
| 46 |  | 
|  | |
| 47 | 
             
            def plotar_grafico(df):
         | 
| 48 | 
             
                plt.style.use('ggplot')
         | 
| 49 | 
             
                fig, ax = plt.subplots(figsize=(10, 6))
         | 
| 50 | 
             
                cores = ['#2c3e50', '#16a085', '#2980b9', '#8e44ad', '#d35400']
         | 
|  | |
| 51 | 
             
                for i, col in enumerate(df.columns[1:]):
         | 
| 52 | 
             
                    estilo = '--' if col.lower() == 'acoes' else '-'
         | 
| 53 | 
             
                    ax.plot(df['Ano'], df[col], label=col, color=cores[i], linewidth=2, linestyle=estilo)
         | 
|  | |
| 54 | 
             
                ax.set_title('Comparação de Investimentos (valores corrigidos pela inflação)', fontsize=14, fontweight='bold')
         | 
| 55 | 
             
                ax.set_xlabel('Ano')
         | 
| 56 | 
             
                ax.set_ylabel('Valor (R$)')
         | 
| @@ -64,70 +60,63 @@ def plotar_grafico(df): | |
| 64 | 
             
                img.seek(0)
         | 
| 65 | 
             
                return base64.b64encode(img.read()).decode()
         | 
| 66 |  | 
|  | |
| 67 | 
             
            @app.route('/', methods=['GET', 'POST'])
         | 
| 68 | 
             
            def index():
         | 
| 69 | 
             
                if request.method == 'POST':
         | 
| 70 | 
             
                    try:
         | 
| 71 | 
            -
                         | 
| 72 | 
            -
                         | 
| 73 | 
            -
             | 
| 74 | 
            -
             | 
| 75 | 
            -
                         | 
| 76 | 
            -
             | 
| 77 | 
            -
                         | 
| 78 | 
            -
             | 
| 79 | 
            -
                        df = gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao)
         | 
| 80 | 
             
                        grafico = plotar_grafico(df)
         | 
| 81 | 
             
                        tabela = df.to_html(classes="table table-striped table-hover", index=False)
         | 
| 82 | 
            -
             | 
| 83 | 
            -
             | 
| 84 | 
            -
             | 
| 85 | 
            -
                                               acoes_ret=acoes_ret, renda_fixa=renda_fixa, inflacao=inflacao)
         | 
| 86 | 
             
                    except Exception as e:
         | 
| 87 | 
             
                        return f"Erro: {e}"
         | 
|  | |
| 88 | 
             
                return render_template("index.html")
         | 
| 89 |  | 
|  | |
| 90 | 
             
            @app.route('/download_pdf', methods=['POST'])
         | 
| 91 | 
             
            def download_pdf():
         | 
| 92 | 
             
                try:
         | 
| 93 | 
            -
                     | 
| 94 | 
            -
             | 
| 95 | 
            -
             | 
| 96 | 
            -
                     | 
| 97 | 
            -
             | 
| 98 | 
            -
                     | 
| 99 | 
            -
                    inflacao = float(request.form['inflacao'])
         | 
| 100 | 
            -
             | 
| 101 | 
            -
                    df = gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao)
         | 
| 102 | 
             
                    grafico = plotar_grafico(df)
         | 
| 103 |  | 
| 104 | 
            -
                    ultimo_ano = df['Ano'].iloc[-1]
         | 
| 105 | 
             
                    valores_finais = df.iloc[-1, 1:]
         | 
| 106 | 
            -
                     | 
| 107 | 
             
                    valor_mais_alto = valores_finais.max()
         | 
| 108 | 
             
                    valor_mais_alto_str = f"{valor_mais_alto:,.2f}".replace(',', 'X').replace('.', ',').replace('X', '.')
         | 
| 109 |  | 
| 110 | 
             
                    html = render_template("relatorio.html",
         | 
| 111 | 
             
                                           grafico=grafico,
         | 
| 112 | 
             
                                           tabela=df.to_html(classes="table table-striped table-hover", index=False),
         | 
| 113 | 
            -
                                            | 
| 114 | 
            -
                                           studio_ret=studio_ret,
         | 
| 115 | 
            -
                                           valorizacao=valorizacao,
         | 
| 116 | 
            -
                                           franquia_ret=franquia_ret,
         | 
| 117 | 
            -
                                           acoes_ret=acoes_ret,
         | 
| 118 | 
            -
                                           renda_fixa=renda_fixa,
         | 
| 119 | 
            -
                                           inflacao=inflacao,
         | 
| 120 | 
            -
                                           investimento_mais_valorizado=nome_mais_alto,
         | 
| 121 | 
             
                                           valor_mais_alto=valor_mais_alto_str,
         | 
| 122 | 
            -
                                           df=df | 
|  | |
| 123 |  | 
| 124 | 
             
                    pdf = HTML(string=html).write_pdf()
         | 
| 125 | 
             
                    response = make_response(pdf)
         | 
| 126 | 
             
                    response.headers['Content-Type'] = 'application/pdf'
         | 
| 127 | 
             
                    response.headers['Content-Disposition'] = 'attachment; filename=relatorio_simulacao.pdf'
         | 
| 128 | 
             
                    return response
         | 
|  | |
| 129 | 
             
                except Exception as e:
         | 
| 130 | 
            -
                    return f"Erro: {e}"
         | 
| 131 |  | 
|  | |
| 132 | 
             
            if __name__ == '__main__':
         | 
| 133 | 
             
                app.run(debug=True, port=7860)
         | 
|  | 
|  | |
| 7 |  | 
| 8 | 
             
            app = Flask(__name__)
         | 
| 9 |  | 
| 10 | 
            +
            # Função principal de simulação
         | 
| 11 | 
             
            def gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao=0, anos=10):
         | 
| 12 | 
             
                anos_lista = list(range(1, anos + 1))
         | 
| 13 | 
            +
                studio, imovel, franquia, acoes, renda_fixa_arr = [], [], [], [], []
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                cap_studio = cap_imovel = cap_franquia = cap_acoes = cap_renda_fixa = capital
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 16 |  | 
| 17 | 
             
                for ano in anos_lista:
         | 
| 18 | 
             
                    inf_cum = (1 + inflacao / 100) ** ano
         | 
|  | |
| 37 | 
             
                    'Renda Fixa': renda_fixa_arr
         | 
| 38 | 
             
                })
         | 
| 39 |  | 
| 40 | 
            +
            # Geração do gráfico como imagem base64
         | 
| 41 | 
             
            def plotar_grafico(df):
         | 
| 42 | 
             
                plt.style.use('ggplot')
         | 
| 43 | 
             
                fig, ax = plt.subplots(figsize=(10, 6))
         | 
| 44 | 
             
                cores = ['#2c3e50', '#16a085', '#2980b9', '#8e44ad', '#d35400']
         | 
| 45 | 
            +
             | 
| 46 | 
             
                for i, col in enumerate(df.columns[1:]):
         | 
| 47 | 
             
                    estilo = '--' if col.lower() == 'acoes' else '-'
         | 
| 48 | 
             
                    ax.plot(df['Ano'], df[col], label=col, color=cores[i], linewidth=2, linestyle=estilo)
         | 
| 49 | 
            +
             | 
| 50 | 
             
                ax.set_title('Comparação de Investimentos (valores corrigidos pela inflação)', fontsize=14, fontweight='bold')
         | 
| 51 | 
             
                ax.set_xlabel('Ano')
         | 
| 52 | 
             
                ax.set_ylabel('Valor (R$)')
         | 
|  | |
| 60 | 
             
                img.seek(0)
         | 
| 61 | 
             
                return base64.b64encode(img.read()).decode()
         | 
| 62 |  | 
| 63 | 
            +
            # Página inicial com formulário e simulação
         | 
| 64 | 
             
            @app.route('/', methods=['GET', 'POST'])
         | 
| 65 | 
             
            def index():
         | 
| 66 | 
             
                if request.method == 'POST':
         | 
| 67 | 
             
                    try:
         | 
| 68 | 
            +
                        # Coleta dos dados do formulário
         | 
| 69 | 
            +
                        dados = {k: float(request.form[k]) for k in [
         | 
| 70 | 
            +
                            'capital', 'studio_ret', 'valorizacao',
         | 
| 71 | 
            +
                            'franquia_ret', 'acoes_ret', 'renda_fixa', 'inflacao'
         | 
| 72 | 
            +
                        ]}
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                        df = gerar_simulacao(**dados)
         | 
|  | |
|  | |
| 75 | 
             
                        grafico = plotar_grafico(df)
         | 
| 76 | 
             
                        tabela = df.to_html(classes="table table-striped table-hover", index=False)
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                        return render_template("index.html", grafico=grafico, tabela=tabela, **dados)
         | 
| 79 | 
            +
             | 
|  | |
| 80 | 
             
                    except Exception as e:
         | 
| 81 | 
             
                        return f"Erro: {e}"
         | 
| 82 | 
            +
             | 
| 83 | 
             
                return render_template("index.html")
         | 
| 84 |  | 
| 85 | 
            +
            # Geração e download do PDF
         | 
| 86 | 
             
            @app.route('/download_pdf', methods=['POST'])
         | 
| 87 | 
             
            def download_pdf():
         | 
| 88 | 
             
                try:
         | 
| 89 | 
            +
                    dados = {k: float(request.form[k]) for k in [
         | 
| 90 | 
            +
                        'capital', 'studio_ret', 'valorizacao',
         | 
| 91 | 
            +
                        'franquia_ret', 'acoes_ret', 'renda_fixa', 'inflacao'
         | 
| 92 | 
            +
                    ]}
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                    df = gerar_simulacao(**dados)
         | 
|  | |
|  | |
|  | |
| 95 | 
             
                    grafico = plotar_grafico(df)
         | 
| 96 |  | 
|  | |
| 97 | 
             
                    valores_finais = df.iloc[-1, 1:]
         | 
| 98 | 
            +
                    nome_mais_valorizado = valores_finais.idxmax()
         | 
| 99 | 
             
                    valor_mais_alto = valores_finais.max()
         | 
| 100 | 
             
                    valor_mais_alto_str = f"{valor_mais_alto:,.2f}".replace(',', 'X').replace('.', ',').replace('X', '.')
         | 
| 101 |  | 
| 102 | 
             
                    html = render_template("relatorio.html",
         | 
| 103 | 
             
                                           grafico=grafico,
         | 
| 104 | 
             
                                           tabela=df.to_html(classes="table table-striped table-hover", index=False),
         | 
| 105 | 
            +
                                           investimento_mais_valorizado=nome_mais_valorizado,
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 106 | 
             
                                           valor_mais_alto=valor_mais_alto_str,
         | 
| 107 | 
            +
                                           df=df,
         | 
| 108 | 
            +
                                           **dados)
         | 
| 109 |  | 
| 110 | 
             
                    pdf = HTML(string=html).write_pdf()
         | 
| 111 | 
             
                    response = make_response(pdf)
         | 
| 112 | 
             
                    response.headers['Content-Type'] = 'application/pdf'
         | 
| 113 | 
             
                    response.headers['Content-Disposition'] = 'attachment; filename=relatorio_simulacao.pdf'
         | 
| 114 | 
             
                    return response
         | 
| 115 | 
            +
             | 
| 116 | 
             
                except Exception as e:
         | 
| 117 | 
            +
                    return f"Erro ao gerar PDF: {e}"
         | 
| 118 |  | 
| 119 | 
            +
            # Execução local
         | 
| 120 | 
             
            if __name__ == '__main__':
         | 
| 121 | 
             
                app.run(debug=True, port=7860)
         | 
| 122 | 
            +
             |