false, 'catalogos' => []]; } $usuario = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); if (!$usuario) { sqlsrv_close($conn); return ['catalogos_activos' => false, 'catalogos' => []]; } $catalogos_general = $usuario['preferencias_catalogos'] ?? 0; $tipoUsuario = $usuario['tipo_usuario'] ?? 'importador'; sqlsrv_free_stmt($stmt); // Si los catálogos están desactivados, solo mostrar obligatorios if (!$catalogos_general) { // Obtener solo catálogos obligatorios $query = "SELECT nombre, descripcion, color, ruta, accion FROM tipos_catalogos WHERE tipo_usuario = ? AND nombre IN ('Configuración', 'Cerrar sesión') ORDER BY id"; $stmt = sqlsrv_prepare($conn, $query, [$tipoUsuario]); if (!$stmt || !sqlsrv_execute($stmt)) { sqlsrv_close($conn); return ['catalogos_activos' => false, 'catalogos' => []]; } $catalogos = []; while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $catalogos[] = [ 'nombre' => $row['nombre'], 'descripcion' => $row['descripcion'], 'color' => $row['color'], 'ruta' => $row['ruta'], 'accion' => $row['accion'], 'visible' => true, 'obligatorio' => true ]; } sqlsrv_free_stmt($stmt); sqlsrv_close($conn); return ['catalogos_activos' => false, 'catalogos' => $catalogos]; } // Obtener todos los catálogos para este tipo de usuario $query = "SELECT nombre, descripcion, color, ruta, accion FROM tipos_catalogos WHERE tipo_usuario = ? ORDER BY id"; $stmt = sqlsrv_prepare($conn, $query, [$tipoUsuario]); if (!$stmt || !sqlsrv_execute($stmt)) { sqlsrv_close($conn); return ['catalogos_activos' => false, 'catalogos' => []]; } // Crear array de catálogos disponibles $catalogos_disponibles = []; while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $catalogos_disponibles[] = [ 'nombre' => $row['nombre'], 'descripcion' => $row['descripcion'], 'color' => $row['color'], 'ruta' => $row['ruta'], 'accion' => $row['accion'], 'campo_bd' => strtolower(str_replace([' ', 'ó', 'ú', 'á', 'é', 'í'], ['_', 'o', 'u', 'a', 'e', 'i'], $row['nombre'])) ]; } sqlsrv_free_stmt($stmt); // Obtener preferencias específicas del usuario $preferencias = []; switch ($tipoUsuario) { case 'importador': $query = "SELECT * FROM preferencias_catalogos_usuario WHERE id_usuario = ?"; $stmt = sqlsrv_prepare($conn, $query, [$idUsuario]); if ($stmt && sqlsrv_execute($stmt)) { $preferenciasRow = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); if ($preferenciasRow) { $preferencias = $preferenciasRow; } sqlsrv_free_stmt($stmt); } break; // Aquí agregarías otros casos cuando implementes otros tipos de usuario } // Determinar qué catálogos mostrar $catalogos_visibles = []; foreach ($catalogos_disponibles as $catalogo) { $campo = $catalogo['campo_bd']; $esObligatorio = in_array($catalogo['nombre'], ['Configuración', 'Cerrar sesión']); if ($esObligatorio) { // Catálogos obligatorios siempre visibles $catalogo['visible'] = true; $catalogo['obligatorio'] = true; } else { // Verificar si está activado en preferencias $catalogo['visible'] = isset($preferencias[$campo]) && $preferencias[$campo] == 1; $catalogo['obligatorio'] = false; } if ($catalogo['visible']) { $catalogos_visibles[] = $catalogo; } } sqlsrv_close($conn); return [ 'catalogos_activos' => true, 'catalogos' => $catalogos_visibles, 'tipo_usuario' => $tipoUsuario ]; } // Función para obtener icono según el nombre del catálogo function obtenerIconoCatalogo($nombre) { $iconos = [ 'Locaciones' => '📍', 'Vinculación' => '🔗', 'Transportistas' => '🚚', 'Transportes' => '🚛', 'Choferes' => '👨‍✈️', 'Proveedores' => '🏭', 'Productos frecuentes' => '⭐', 'Solicitudes importación' => '📄', 'Expediente electrónico' => '📁', 'Configuración' => '⚙️', 'Cerrar sesión' => '🚪' ]; return $iconos[$nombre] ?? '📁'; } // Función para el dashboard del importador function dashboard() { $idUsuario = $_SESSION['usuario_id'] ?? null; if (!$idUsuario) { header("Location: /IMPORTADORES/login"); exit; } // Obtener catálogos visibles $catalogosData = obtenerCatalogosVisibles($idUsuario); include __DIR__ . '/../../views/importadores/dashboard_importador.php'; } function lista() { $conn = getConnection(); // Consulta conjunta para evitar múltiples queries anidadas $sql = "SELECT p.id_pais, p.nombre AS nombre_pais, p.iso2, p.iso3, e.id_estado, e.nombre AS nombre_estado, e.abreviatura, c.id_ciudad, c.nombre AS nombre_ciudad FROM paises p LEFT JOIN estados e ON p.id_pais = e.pais_id LEFT JOIN ciudades c ON e.id_estado = c.estado_id ORDER BY p.id_pais, e.id_estado, c.id_ciudad "; $stmt = sqlsrv_query($conn, $sql); $locaciones = []; while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $locaciones[] = $row; } // Obtener países para los selects del modal $sql_paises_select = "SELECT id_pais, nombre FROM paises ORDER BY nombre"; $stmt_paises_select = sqlsrv_query($conn, $sql_paises_select); $paises = []; while ($row = sqlsrv_fetch_array($stmt_paises_select, SQLSRV_FETCH_ASSOC)) { $paises[] = $row; } include __DIR__ . '/../../views/locaciones/lista.php'; } function vincular() { if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador') { header('Location: /IMPORTADORES/login'); exit; } $conn = getConnection(); $id_importador = $_SESSION['usuario_id']; $id_agencia = (int) $_GET['id']; // Verificar si ya existe una solicitud pendiente $checkSql = "SELECT COUNT(*) AS total FROM solicitudes_vinculacion WHERE id_importador = ? AND id_agencia = ? AND estado = 'PENDIENTE'"; $checkParams = [$id_importador, $id_agencia]; $checkStmt = sqlsrv_query($conn, $checkSql, $checkParams); if ($checkStmt && $row = sqlsrv_fetch_array($checkStmt, SQLSRV_FETCH_ASSOC)) { if ($row['total'] > 0) { header('Location: /IMPORTADORES/vinculaciones/nuevaVinculacion?error=pending_request'); exit; } } // Insertar la nueva solicitud $sql = "INSERT INTO solicitudes_vinculacion (id_importador, id_agencia, mensaje, estado, fecha_solicitud) VALUES (?, ?, 'Solicitud de vinculación', 'PENDIENTE', GETDATE()) "; $params = [$id_importador, $id_agencia]; $stmt = sqlsrv_prepare($conn, $sql, $params); if ($stmt && sqlsrv_execute($stmt)) { header('Location: /IMPORTADORES/vinculaciones/nuevaVinculacion?success=sended_request'); exit; } else { header('Location: /IMPORTADORES/vinculaciones/nuevaVinculacion?error=failed_request'); exit; } } function cancelarVinculacion() { if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador') { header('Location: /IMPORTADORES/login'); exit; } $conn = getConnection(); $id_importador = $_SESSION['usuario_id']; $id_agencia = (int) $_GET['id']; $sql = "UPDATE solicitudes_vinculacion SET estado = 'CANCELADA', fecha_respuesta = GETDATE() WHERE id_importador = ? AND id_agencia = ? AND estado = 'PENDIENTE' "; $params = [$id_importador, $id_agencia]; $stmt = sqlsrv_prepare($conn, $sql, $params); if ($stmt && sqlsrv_execute($stmt)) { header('Location: /IMPORTADORES/vinculaciones/nuevaVinculacion?success=cancelled'); exit; } } function desvincularUsuario() { if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador') { header('Location: /IMPORTADORES/login'); exit; } // Verificar que se recibió el ID de la relación $id_relacion = $_GET['id'] ?? null; if (!$id_relacion || !is_numeric($id_relacion)) { header('Location: /IMPORTADORES/vinculaciones/vinculacionesUsuario?error=invalid_id'); exit; } $conn = getConnection(); try { $stmtActualizarAgencia = null; // Iniciar transacción sqlsrv_begin_transaction($conn); // 1. Verificar que la relación existe y pertenece a la agencia del admin $sqlVerificar = "SELECT ia.*, u.id_usuario, u.nombre as importador_nombre, aa.nombre_agencia 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 WHERE ia.id_relacion = ? AND ia.id_importador = ? "; $stmtVerificar = sqlsrv_query($conn, $sqlVerificar, [$id_relacion, $_SESSION['usuario_id']]); // Verificar si la consulta fue exitosa if ($stmtVerificar === false) { $errors = sqlsrv_errors(); error_log("Error en consulta verificar: " . print_r($errors, true)); throw new Exception('Error en la consulta de verificación'); } $relacion = sqlsrv_fetch_array($stmtVerificar, SQLSRV_FETCH_ASSOC); if (!$relacion) { throw new Exception('Relación no encontrada o no tienes permisos para desvincularla'); } if ($relacion['activo'] == 0) { throw new Exception('Esta relación ya está inactiva'); } // 2. Desactivar la relación (no eliminar, mantener historial) $sqlDesactivar = "UPDATE importador_agencia SET activo = 0, fecha_desvinculacion = GETDATE(), estado = 'DESVINCULADO' WHERE id_relacion = ? AND id_importador = ? "; $stmtDesactivar = sqlsrv_query($conn, $sqlDesactivar, [$id_relacion, $_SESSION['usuario_id']]); if ($stmtDesactivar === false) { $errors = sqlsrv_errors(); error_log("Error en actualización: " . print_r($errors, true)); throw new Exception('Error al desactivar la relación'); } // Verificar que se actualizó al menos una fila $filasAfectadas = sqlsrv_rows_affected($stmtDesactivar); if ($filasAfectadas === 0) { throw new Exception('No se pudo actualizar la relación'); } // 3. Actualizar el campo id_agencia_en_uso del usuario si es necesario if ($_SESSION['id_agencia_en_uso'] == $relacion['id_agencia']) { $sqlActualizarAgencia = "UPDATE usuarios_sistema SET id_agencia_en_uso = NULL WHERE id_usuario = ?"; $stmtActualizarAgencia = sqlsrv_query($conn, $sqlActualizarAgencia, [$_SESSION['usuario_id']]); if ($stmtActualizarAgencia === false) { $errors = sqlsrv_errors(); error_log("Error al actualizar agencia en uso: " . print_r($errors, true)); throw new Exception('Error al actualizar la agencia en uso'); } } // Limpiar statements if (isset($stmtVerificar) && is_resource($stmtVerificar)) { sqlsrv_free_stmt($stmtVerificar); } if (isset($stmtDesactivar) && is_resource($stmtDesactivar)) { sqlsrv_free_stmt($stmtDesactivar); } if (isset($stmtActualizarAgencia) && is_resource($stmtActualizarAgencia)) { sqlsrv_free_stmt($stmtActualizarAgencia); } // Confirmar transacción sqlsrv_commit($conn); sqlsrv_close($conn); header('Location: /IMPORTADORES/vinculaciones/vinculacionesUsuario?success=unlinked'); exit; } catch (Exception $e) { // Revertir transacción en caso de error sqlsrv_rollback($conn); sqlsrv_close($conn); header('Location: /IMPORTADORES/vinculaciones/vinculacionesUsuario?error=unlinked_failed&msg=' . urlencode($e->getMessage())); exit; } } /** Función para cambiar la agencia activa del usuario **/ function cambiarAgenciaActiva() { if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador') { header('Location: /IMPORTADORES/login'); exit; } if (!isset($_GET['id']) || !is_numeric($_GET['id'])) { header("Location: /IMPORTADORES/vinculaciones/vinculacionesusuario?error=invalid_id"); exit; } $id_agencia = intval($_GET['id']); $id_usuario = $_SESSION['usuario_id']; $conn = getConnection(); // Validar que el importador está vinculado a esta agencia $sqlVerificacion = "SELECT 1 FROM importador_agencia WHERE id_importador = ? AND id_agencia = ? AND activo = 1"; $stmtVerificacion = sqlsrv_query($conn, $sqlVerificacion, [$id_usuario, $id_agencia]); if ($stmtVerificacion === false || !sqlsrv_fetch($stmtVerificacion)) { header("Location: /IMPORTADORES/vinculaciones/vinculacionesusuario?error=invalid_agency"); exit; } // Actualizar campo id_agencia_en_uso $sqlUpdate = "UPDATE usuarios_sistema SET id_agencia_en_uso = ? WHERE id_usuario = ?"; $stmtUpdate = sqlsrv_query($conn, $sqlUpdate, [$id_agencia, $id_usuario]); if ($stmtUpdate === false) { header("Location: /IMPORTADORES/vinculaciones/vinculacionesusuario?error=agency_changed_failed"); exit; } // Opcional: actualizar también la sesión si lo usas en tu lógica $_SESSION['id_agencia_en_uso'] = $id_agencia; // Redirigir con éxito header("Location: /IMPORTADORES/vinculaciones/vinculacionesusuario?success=agency_changed"); exit; }