Entrada 12: R07
Bitácora de Sesión
Fecha: 10/06/2026
Inicio: [17:00] | Fin: [19:30] || Total: [2 hora 30 minutos]
Presente: Matías Benavides Sandoval
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
¿QUÉ HICIMOS HOY?
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Se implementó R07 (visor de bitácora de eventos) completo: stored procedure, controller, rutas y frontend.
Se creó sp_GetBitacora como SP de solo lectura (sin transacción) que acepta filtros opcionales (@inIdUsuario, @inIdTipoEvento, @inFechaDesde, @inFechaHasta) y paginación (@inPageNumber, @inPageSize). Retorna dos result sets: la data paginada con joins a TipoEvento y Username de Usuario, y el count total de filas que cumplen los filtros.
Se creó bitacoraController.ts con una única función getBitacora que parsea los query params, llama al SP, y retorna los dos result sets. Se registraron las rutas en bitacora.ts bajo /api/bitacora (GET / con filtros, GET /tipos-evento para el dropdown).
Se creó la página bitacora.html con el mismo layout dark theme del proyecto. El formulario de filtros tiene 4 campos: usuario (select dinámico), tipo de evento (select dinámico), fecha desde, fecha hasta. La tabla muestra 10 filas por página con columnas: Fecha, Usuario, IP, Evento, Descripción. Se agregó paginación con botones Anterior/Siguiente.
Se agregó el menú "Bitácora" al sidebar de admin (solo visible cuando tipo='1').
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PROBLEMAS DETECTADOS Y CÓMO SE RESOLVIERON
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Problema: el frontend no mostraba el total de registros para calcular páginas.
Causa: sp_GetBitacora solo devolvía la data, no el count total.
Solución: se modificó el SP para que haga un segundo SELECT con COUNT(*). El controller captura ambos result sets y los retorna como { data, total }. El frontend usa Math.ceil(total / pageSize).
Problema: los SPs de solo lectura tenían SET XACT_ABORT ON, que causaba Msg 3930.
Causa: SET XACT_ABORT ON es innecesario en SPs que no escriben nada.
Solución: se quitó SET XACT_ABORT ON de sp_GetError, sp_GetEmpleados y sp_GetEmpleadoById.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
AVANCE DEL CÓDIGO
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
MORALEJAS / BUENAS PRÁCTICAS
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Un SP de consulta con paginación siempre debe retornar dos result sets: la data y el count total. Sin el count, el frontend no puede calcular el total de páginas.
Los SPs de solo lectura no necesitan SET XACT_ABORT ON ni BEGIN TRANSACTION. Solo complican el código y pueden causar bugs como Msg 3930.
El sidebar del admin debe ser condicional (tipo='1') para que los empleados impersonados no vean menús de administrador.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PRÓXIMA SESIÓN: ¿QUÉ SIGUE?
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Tengo ganas de refactorizar buena parte del codigo, ya que hay mucho obsoleto que no se usa en lo mas minimo, asi que antes de cualquier cosa iria eso
Comentarios
Publicar un comentario