|
|
| import streamlit as st
|
| from banco import SessionLocal
|
| from models import LogAcesso, Usuario
|
| import pandas as pd
|
| from io import BytesIO
|
| import os
|
|
|
|
|
| print("📂 BANCO LIDO NA AUDITORIA:", os.path.abspath("load.db"))
|
|
|
|
|
| def main():
|
| st.title("🧾 Auditoria do Sistema Load")
|
|
|
| db = SessionLocal()
|
|
|
| try:
|
|
|
|
|
|
|
| perfis = (
|
| db.query(Usuario.perfil)
|
| .distinct()
|
| .order_by(Usuario.perfil)
|
| .all()
|
| )
|
|
|
| lista_perfis = ["Todos"] + [p[0] for p in perfis]
|
|
|
| perfil_selecionado = st.selectbox(
|
| "Filtrar por perfil:",
|
| lista_perfis
|
| )
|
|
|
|
|
|
|
|
|
|
|
| query = (
|
| db.query(
|
| LogAcesso.usuario,
|
| Usuario.perfil,
|
| Usuario.email,
|
| LogAcesso.acao,
|
| LogAcesso.tabela,
|
| LogAcesso.registro_id,
|
| LogAcesso.data_hora
|
| )
|
| .join(Usuario, Usuario.usuario == LogAcesso.usuario)
|
| .order_by(LogAcesso.data_hora.desc())
|
| )
|
|
|
| if perfil_selecionado != "Todos":
|
| query = query.filter(Usuario.perfil == perfil_selecionado)
|
|
|
| logs = query.all()
|
|
|
| if not logs:
|
| st.info("Nenhum registro encontrado.")
|
| return
|
|
|
|
|
|
|
|
|
| dados = []
|
| for l in logs:
|
|
|
| dados.append({
|
| "Usuário": l[0],
|
| "Perfil": l[1],
|
| "E-mail": l[2] or "—",
|
| "Ação": l[3],
|
| "Tabela": l[4],
|
| "Registro": l[5],
|
| "Data": l[6].strftime("%d/%m/%Y"),
|
| "Hora": l[6].strftime("%H:%M:%S"),
|
| })
|
|
|
| df = pd.DataFrame(dados)
|
|
|
| st.dataframe(df, use_container_width=True)
|
|
|
|
|
|
|
|
|
| buffer = BytesIO()
|
| with pd.ExcelWriter(buffer, engine="openpyxl") as writer:
|
| df.to_excel(writer, index=False, sheet_name="Auditoria")
|
|
|
| st.download_button(
|
| label="📥 Exportar Auditoria para Excel",
|
| data=buffer.getvalue(),
|
| file_name="auditoria_sistema.xlsx",
|
| mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
| )
|
|
|
| finally:
|
| db.close()
|
|
|
|
|