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}")