diff --git a/app/controllers/bitacoras.php b/app/controllers/bitacoras.php index 7e5dbc5..18d22a9 100644 --- a/app/controllers/bitacoras.php +++ b/app/controllers/bitacoras.php @@ -17,13 +17,17 @@ function sistema() } $conn = getConnection(); - $sql = "SELECT bl.*, u.nombre + $sql = "SELECT bl.*, u.nombre FROM bitacora_login bl INNER JOIN usuarios_sistema u - ON bl.id_usuario = u.id_usuario + ON bl.id_usuario = u.id_usuario ORDER BY fecha DESC"; $stmt = sqlsrv_query($conn, $sql); + if ($stmt === false) { + die(print_r(sqlsrv_errors(), true)); + } + $registros = []; while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $registros[] = $row; @@ -34,7 +38,67 @@ function sistema() function sistemaAgencia() { - + if (!isset($_SESSION['usuario_id']) || !in_array($_SESSION['tipo_usuario'], ['admin_agencia', 'agente_aduanal'])) { + header('Location: /IMPORTADORES/login'); + exit; + } + + $conn = getConnection(); + $id_usuario = $_SESSION['usuario_id']; + + // Obtener ID de agencia asociada + $sql_agencia = "SELECT id_agencia FROM agente_agencia WHERE id_agente = ? AND activo = 1"; + $stmt_agencia = sqlsrv_query($conn, $sql_agencia, [$id_usuario]); + + $id_agencia = null; + if ($stmt_agencia && ($row = sqlsrv_fetch_array($stmt_agencia, SQLSRV_FETCH_ASSOC))) { + $id_agencia = $row['id_agencia']; + } + + if (!$id_agencia) { + die("⚠️ No se encontró una agencia activa asociada al usuario."); + } + + // Obtener todos los usuarios ligados a la misma agencia (agentes + importadores) + $sql_usuarios = " + SELECT DISTINCT id_usuario FROM usuarios_sistema + WHERE id_usuario IN ( + SELECT id_agente FROM agente_agencia WHERE id_agencia = ? AND activo = 1 + UNION + SELECT id_importador FROM importador_agencia WHERE id_agencia = ? AND activo = 1 + ) + "; + $stmt_usuarios = sqlsrv_query($conn, $sql_usuarios, [$id_agencia, $id_agencia]); + + $usuarios = []; + while ($row = sqlsrv_fetch_array($stmt_usuarios, SQLSRV_FETCH_ASSOC)) { + $usuarios[] = $row['id_usuario']; + } + + // Consultar bitácora solo si hay usuarios ligados + $registros = []; + if (!empty($usuarios)) { + $placeholders = implode(',', array_fill(0, count($usuarios), '?')); + + $sql_bitacora = " + SELECT bl.*, u.nombre + FROM bitacora_login bl + INNER JOIN usuarios_sistema u ON bl.id_usuario = u.id_usuario + WHERE bl.id_usuario IN ($placeholders) + ORDER BY fecha DESC + "; + + $stmt = sqlsrv_query($conn, $sql_bitacora, $usuarios); + + if ($stmt === false) { + die(print_r(sqlsrv_errors(), true)); + } + + while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { + $registros[] = $row; + } + } + include __DIR__ . '/../../views/bitacoras/sistema_agencia.php'; } @@ -46,24 +110,123 @@ function usuarios() } $conn = getConnection(); - $sql = "SELECT * FROM bitacora_usuarios ORDER BY fecha DESC"; + $sql = "SELECT * FROM bitacora_usuarios ORDER BY fecha DESC"; $stmt = sqlsrv_query($conn, $sql); + if ($stmt === false) { + die(print_r(sqlsrv_errors(), true)); + } + $registros = []; while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $registros[] = $row; } - + include __DIR__ . '/../../views/bitacoras/bitacora_usuarios.php'; } -function vinculaciones() +function vinculaciones() { + if (!isset($_SESSION['usuario_id']) || !in_array($_SESSION['tipo_usuario'], ['admin_agencia', 'agente_aduanal'])) { + header('Location: /IMPORTADORES/login'); + exit; + } + + $conn = getConnection(); + $usuario_id = $_SESSION['usuario_id']; + + // 1. Obtener la agencia asociada al usuario actual + $sql_agencia = "SELECT id_agencia FROM agente_agencia WHERE id_agente = ? AND activo = 1"; + $stmt_agencia = sqlsrv_query($conn, $sql_agencia, [$usuario_id]); + + $id_agencia = null; + if ($stmt_agencia && ($row = sqlsrv_fetch_array($stmt_agencia, SQLSRV_FETCH_ASSOC))) { + $id_agencia = $row['id_agencia']; + } + + if (!$id_agencia) { + die("⚠️ No se encontró una agencia activa asociada al usuario."); + } + + // 2. Consulta de vinculaciones SOLO de esa agencia + $sql = " + SELECT ia.*, + u.nombre AS nombre_importador, + aa.nombre_agencia, + ap.nombre AS nombre_aprobador + FROM importador_agencia ia + INNER JOIN usuarios_sistema u ON ia.id_importador = u.id_usuario + INNER JOIN agencias_aduanales aa ON ia.id_agencia = aa.id_agencia + LEFT JOIN usuarios_sistema ap ON ia.aprobado_por = ap.id_usuario + WHERE ia.id_agencia = ? + ORDER BY ia.fecha_vinculacion DESC + "; + + $stmt = sqlsrv_query($conn, $sql, [$id_agencia]); + + if ($stmt === false) { + die(print_r(sqlsrv_errors(), true)); + } + + $registros = []; + while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { + if ($row['fecha_desvinculacion'] !== null) { + $row['accion'] = 'Desvinculación'; + $row['fecha'] = $row['fecha_desvinculacion']; + } else { + $row['accion'] = 'Vinculación'; + $row['fecha'] = $row['fecha_vinculacion']; + } + $registros[] = $row; + } + include __DIR__ . '/../../views/bitacoras/bitacora_vinculaciones.php'; } function vinculacionesUsuario() { + if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador') { + header('Location: /IMPORTADORES/login'); + exit; + } + + $conn = getConnection(); + $id_importador = $_SESSION['usuario_id']; + + // Traer todas las relaciones del importador actual + $sql = " + SELECT ia.*, + u.nombre AS nombre_importador, + aa.nombre_agencia, + ap.nombre AS nombre_aprobador + FROM importador_agencia ia + INNER JOIN usuarios_sistema u ON ia.id_importador = u.id_usuario + INNER JOIN agencias_aduanales aa ON ia.id_agencia = aa.id_agencia + LEFT JOIN usuarios_sistema ap ON ia.aprobado_por = ap.id_usuario + WHERE ia.id_importador = ? + ORDER BY ia.fecha_vinculacion DESC + "; + + $stmt = sqlsrv_query($conn, $sql, [$id_importador]); + + if ($stmt === false) { + die(print_r(sqlsrv_errors(), true)); + } + + $registros = []; + while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { + // Determinar tipo de acción + if (!empty($row['fecha_desvinculacion'])) { + $row['accion'] = 'Desvinculación'; + $row['fecha'] = $row['fecha_desvinculacion']; + } else { + $row['accion'] = 'Vinculación'; + $row['fecha'] = $row['fecha_vinculacion']; + } + + $registros[] = $row; + } + include __DIR__ . '/../../views/bitacoras/vinculaciones_usuario.php'; } @@ -75,13 +238,19 @@ function agencias() } $conn = getConnection(); - $sql = "SELECT ba.*, u.nombre - FROM bitacora_login ba + $sql = "SELECT ba.*, aa.nombre_agencia, u.nombre + FROM bitacora_agencias ba + INNER JOIN agencias_aduanales aa + ON ba.id_agencia = aa.id_agencia INNER JOIN usuarios_sistema u - ON bl.id_usuario = u.id_usuario + ON ba.realizado_por = u.id_usuario ORDER BY fecha DESC"; $stmt = sqlsrv_query($conn, $sql); + if ($stmt === false) { + die(print_r(sqlsrv_errors(), true)); + } + $registros = []; while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $registros[] = $row; @@ -97,21 +266,24 @@ function miAcceso() } $conn = getConnection(); + $id_usuario = $_SESSION['usuario_id']; - $sql = "SELECT id_bitacora, usuario_id, accion, descripcion, fecha FROM bitacora_usuarios ORDER BY fecha DESC"; - $stmt = sqlsrv_query($conn, $sql); + $sql = "SELECT bl.id, bl.id_usuario, bl.email, bl.ip, bl.fecha, bl.exito, bl.detalle, u.nombre + FROM bitacora_login bl + INNER JOIN usuarios_sistema u + ON bl.id_usuario = u.id_usuario + WHERE bl.id_usuario = ? + ORDER BY bl.fecha DESC"; + $stmt = sqlsrv_query($conn, $sql, [$id_usuario]); - $cambios = []; + if ($stmt === false) { + die(print_r(sqlsrv_errors(), true)); + } + + $registros = []; while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { - $cambios[] = $row; + $registros[] = $row; } include __DIR__ . '/../../views/bitacoras/bitacora_usuario.php'; -} - -function bitacoraUsuarios() -{ - - - include __DIR__ . '/../../views/admin/bitacora_usuarios.php'; } \ No newline at end of file diff --git a/views/bitacoras/bitacora_agencias.php b/views/bitacoras/bitacora_agencias.php index 38cd9c5..e9f067c 100644 --- a/views/bitacoras/bitacora_agencias.php +++ b/views/bitacoras/bitacora_agencias.php @@ -40,7 +40,7 @@
- + @@ -53,9 +53,9 @@ - + - + diff --git a/views/bitacoras/bitacora_sistema.php b/views/bitacoras/bitacora_sistema.php index 49fd1d6..8daaa04 100644 --- a/views/bitacoras/bitacora_sistema.php +++ b/views/bitacoras/bitacora_sistema.php @@ -40,7 +40,7 @@
ID Nombre
format('Y-m-d H:i:s') : '') ?>
- + diff --git a/views/bitacoras/bitacora_usuario.php b/views/bitacoras/bitacora_usuario.php index 2cb9505..1f13aa9 100644 --- a/views/bitacoras/bitacora_usuario.php +++ b/views/bitacoras/bitacora_usuario.php @@ -35,8 +35,52 @@
-

👥 Acceso de Usuarios

+

👥 Mi Actividad

+ +
+
+
ID Nombre
+ + + + + + + + + + + + + + + + + + + + + + + + +
IDNombreCorreoIPFechaEstatusDetalles
format('Y-m-d H:i:s') ?> + +
+
+
+ + \ No newline at end of file diff --git a/views/bitacoras/bitacora_usuarios.php b/views/bitacoras/bitacora_usuarios.php index 54b5727..64bee15 100644 --- a/views/bitacoras/bitacora_usuarios.php +++ b/views/bitacoras/bitacora_usuarios.php @@ -33,7 +33,7 @@ - +

🛠️ Cambios de Usuario

diff --git a/views/bitacoras/bitacora_vinculaciones.php b/views/bitacoras/bitacora_vinculaciones.php index da7ff11..26e0332 100644 --- a/views/bitacoras/bitacora_vinculaciones.php +++ b/views/bitacoras/bitacora_vinculaciones.php @@ -33,6 +33,52 @@ + +
+

🔗 Vinculaciones

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
#UsuarioAcciónAprobado porFecha
+ + + + format('Y-m-d H:i') : htmlspecialchars($r['fecha']) ?>
+
+
+
+ + \ No newline at end of file diff --git a/views/bitacoras/dashboard_bitacoras.php b/views/bitacoras/dashboard_bitacoras.php index d725c94..7dfc62c 100644 --- a/views/bitacoras/dashboard_bitacoras.php +++ b/views/bitacoras/dashboard_bitacoras.php @@ -123,10 +123,20 @@
-
Mi actividad
+
Registro de vinculaciones
+

Ver las vinculaciones de mi agencia.

+ + Ver actividad + +
+
+
+
+
Mi actividad

Ver mi actividad en la plataforma.

+ class="btn btn-info btn-sm mt-2 "> Ver mis accesos
diff --git a/views/bitacoras/sistema_agencia.php b/views/bitacoras/sistema_agencia.php index da7ff11..adb26f3 100644 --- a/views/bitacoras/sistema_agencia.php +++ b/views/bitacoras/sistema_agencia.php @@ -33,6 +33,54 @@ + +
+

👥 Acceso de Usuarios

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
IDNombreCorreoIPFechaEstatusDetalles
format('Y-m-d H:i:s') ?> + +
+
+
+
+ + \ No newline at end of file diff --git a/views/bitacoras/vinculaciones_usuario.php b/views/bitacoras/vinculaciones_usuario.php index da7ff11..5d4ac68 100644 --- a/views/bitacoras/vinculaciones_usuario.php +++ b/views/bitacoras/vinculaciones_usuario.php @@ -33,6 +33,52 @@ + +
+

🔗 Vinculaciones

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
#AgenciaAcciónAprobado porFecha
+ + + + format('Y-m-d H:i') : htmlspecialchars($r['fecha']) ?>
+
+
+
+ + \ No newline at end of file diff --git a/views/configuracion/dashboard_configuracion.php b/views/configuracion/dashboard_configuracion.php index 6970c4e..6b9d201 100644 --- a/views/configuracion/dashboard_configuracion.php +++ b/views/configuracion/dashboard_configuracion.php @@ -233,32 +233,33 @@
-
🔧 Información de Super Administrador
+
🔧 Información del Administrador
- +
- -
+
+ +
- -
+ +
- +
- -
+ +
diff --git a/views/partials/sidebar_configuracion.php b/views/partials/sidebar_configuracion.php index 202364c..8dce3a1 100644 --- a/views/partials/sidebar_configuracion.php +++ b/views/partials/sidebar_configuracion.php @@ -43,6 +43,7 @@ $permisos = [ 'seguridad' => true, 'bitacoras' => [ 'acceso_usuarios_agencia' => true, + 'registro_vinculaciones' => true, 'mi_actividad' => true ], ], @@ -83,13 +84,13 @@ $cantidadBitacoras = contarBitacorasDisponibles($permisosBitacoras); // Función para obtener el texto descriptivo según el permiso function obtenerTextoPermiso($permiso, $tipoUsuario) { $textos = [ - 'registro_accesos' => ($tipoUsuario === 'super_admin') ? 'Registro de accesos' : null, - 'registro_usuarios' => ($tipoUsuario === 'super_admin') ? 'Registro de cambios de usuarios' : null, - 'registro_agencias' => ($tipoUsuario === 'super_admin') ? 'Registro de agencias' : null, - 'acceso_usuarios_agencias' => ($tipoUsuario === 'admin_agencia' || $tipoUsuario === 'agente_aduanal') ? 'Registros de accesos' : null, - 'registro_vinculaciones' => ($tipoUsuario === 'admin_agencia' || $tipoUsuario === 'agente_aduanal') ? 'Vinculaciones (Agencia)' : null, - 'mi_actividad' => in_array($tipoUsuario, ['super_admin', 'admin_agencia', 'agente_aduanal', 'importador']) ? 'Mi actividad' : null, - 'vinculaciones_usuario' => ($tipoUsuario === 'importador') ? 'Mis vinculaciones' : null, + 'registro_accesos' => ($tipoUsuario === 'super_admin') ? 'Registro de accesos' : null, + 'registro_usuarios' => ($tipoUsuario === 'super_admin') ? 'Cambios de usuarios' : null, + 'registro_agencias' => ($tipoUsuario === 'super_admin') ? 'Registro de agencias' : null, + 'acceso_usuarios_agencia' => ($tipoUsuario === 'admin_agencia' || $tipoUsuario === 'agente_aduanal') ? 'Registro de accesos' : null, + 'registro_vinculaciones' => ($tipoUsuario === 'admin_agencia' || $tipoUsuario === 'agente_aduanal') ? 'Vinculaciones (Agencia)' : null, + 'mi_actividad' => in_array($tipoUsuario, ['super_admin', 'admin_agencia', 'agente_aduanal', 'importador']) ? 'Mi actividad' : null, + 'vinculaciones_usuario' => ($tipoUsuario === 'importador') ? 'Mis vinculaciones' : null, ]; return $textos[$permiso] ?? ucfirst(str_replace('_', ' ', $permiso)); @@ -113,14 +114,13 @@ function obtenerIconoPermiso($permiso) { // Función para obtener la URL según el permiso function obtenerUrlPermiso($permiso) { $urls = [ - 'registro_accesos' => '/IMPORTADORES/bitacoras/sistema', - 'registro_usuarios' => '/IMPORTADORES/bitacoras/usuarios', - 'registro_agencias' => '/IMPORTADORES/bitacoras/agencias', - 'acceso_usuarios_agencia' => '/IMPORTADORES/bitacoras/sistemaAgencia', - 'registro_vinculaciones' => '/IMPORTADORES/bitacoras/vinculaciones', - 'mis_vinculaciones' => '/IMPORTADORES/bitacoras/misVinculaciones', - 'mi_actividad' => '/IMPORTADORES/bitacoras/miAcceso', - 'vinculaciones_usuario' => '/IMPORTADORES/bitacoras/vinculacionesUsuario' + 'registro_accesos' => '/IMPORTADORES/bitacoras/sistema', // ✅ + 'registro_usuarios' => '/IMPORTADORES/bitacoras/usuarios', // ✅ + 'registro_agencias' => '/IMPORTADORES/bitacoras/agencias', // ✅ + 'acceso_usuarios_agencia' => '/IMPORTADORES/bitacoras/sistemaAgencia', // ✅ + 'registro_vinculaciones' => '/IMPORTADORES/bitacoras/vinculaciones', // ✅ + 'mi_actividad' => '/IMPORTADORES/bitacoras/miAcceso', // ✅ + 'vinculaciones_usuario' => '/IMPORTADORES/bitacoras/vinculacionesUsuario' // ]; return $urls[$permiso] ?? '/IMPORTADORES/bitacoras/index';