File size: 3,451 Bytes
0f0ef8d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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

import streamlit as st
from datetime import datetime, timedelta
from banco import SessionLocal
from models import LogAcesso   # ✅ usar a tabela correta
from utils_auditoria import registrar_log


def main():
    st.title("🧹 Limpeza de Logs de Auditoria")

    st.markdown(
        """

        Este módulo permite excluir registros antigos de auditoria

        para suavizar o banco de dados.

        """
    )

    opcoes = {
        "Último mês": 30,
        "Últimos 2 meses": 60,
        "Últimos 6 meses": 180,
        "Últimos 12 meses": 365,
        "Personalizado": None,
    }

    escolha = st.selectbox("📅 Escolha o período:", list(opcoes.keys()))

    data_inicio = None
    data_fim = datetime.now()

    if escolha != "Personalizado":
        dias = opcoes[escolha]
        data_inicio = datetime.now() - timedelta(days=dias)
    else:
        col1, col2 = st.columns(2)
        with col1:
            data_inicio = st.date_input("Data inicial")
        with col2:
            data_fim = st.date_input("Data final")
        data_inicio = datetime.combine(data_inicio, datetime.min.time())
        data_fim = datetime.combine(data_fim, datetime.max.time())

    st.info(f"🗓️ Registros de auditoria entre {data_inicio.date()} e {data_fim.date()} serão excluídos.")

    st.divider()

    # ✅ Prévia do total (opcional, ajuda na decisão)
    with SessionLocal() as db:
        total_prev = (
            db.query(LogAcesso)
            .filter(LogAcesso.data_hora >= data_inicio, LogAcesso.data_hora <= data_fim)
            .count()
        )
    st.info(f"🔎 Prévia: {total_prev} registro(s) serão removidos no período selecionado.")

    # ✅ Etapa de confirmação via caixa de seleção
    st.warning(
        "⚠️ **Atenção:** Todos os registros de auditoria no período selecionado serão apagados.\n\n"
        "Confirme abaixo para prosseguir."
    )
    confirmacao = st.selectbox("Confirmar exclusão?", ["Não", "SIM"], index=0)

    # Botão de exclusão (só prossegue se confirmação for SIM)
    if st.button("❌ Excluir registros de auditoria"):
        if confirmacao != "SIM":
            st.error("Operação cancelada. Se desejar prosseguir, selecione **SIM** na confirmação.")
            return

        with SessionLocal() as db:
            try:
                registros = (
                    db.query(LogAcesso)
                    .filter(LogAcesso.data_hora >= data_inicio, LogAcesso.data_hora <= data_fim)
                    .all()
                )

                total = len(registros)

                if total == 0:
                    st.warning("Nenhum registro encontrado para exclusão.")
                    return

                for r in registros:
                    db.delete(r)

                db.commit()

                registrar_log(
                    usuario=st.session_state.get("usuario"),
                    acao=f"Excluiu {total} registros de auditoria entre {data_inicio.date()} e {data_fim.date()}",
                    tabela="log_acesso",
                    registro_id=None
                )

                st.success(f"🎉 {total} registro(s) de auditoria foram excluídos com sucesso!")

            except Exception as e:
                db.rollback()
                st.error(f"❌ Erro ao excluir registros: {e}")