$a['fecha_vinculacion']; }); include __DIR__ . '/../../views/vinculaciones/usuarios_vinculados.php'; } function desvincularAgencia() { // ✅ CORREGIR: Debe ser admin_agencia, no importador if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'admin_agencia') { header('Location: /IMPORTADORES/login'); exit; } // Verificar que se recibió el ID de la relación $id_relacion = $_GET['id'] ?? null; $tipo = $_GET['tipo'] ?? null; if (!$id_relacion || !is_numeric($id_relacion)) { header('Location: /IMPORTADORES/vinculaciones/vinculacionesAgencia?error=invalid_id'); exit; } // Validar que el tipo sea válido if (!in_array($tipo, ['importador', 'agente'])) { header('Location: /IMPORTADORES/vinculaciones/vinculacionesAgencia?error=invalid_type'); exit; } $conn = getConnection(); try { // Iniciar transacción sqlsrv_begin_transaction($conn); if ($tipo === 'importador') { // Verificar relación de importador $sqlVerificar = "SELECT ia.*, aa.id_administrador, u.nombre as usuario_nombre, u.tipo_usuario FROM importador_agencia ia INNER JOIN agencias_aduanales aa ON ia.id_agencia = aa.id_agencia INNER JOIN usuarios_sistema u ON ia.id_importador = u.id_usuario WHERE ia.id_relacion = ? AND aa.id_administrador = ? AND u.tipo_usuario = 'importador' "; $stmtVerificar = sqlsrv_query($conn, $sqlVerificar, [$id_relacion, $_SESSION['usuario_id']]); $relacion = sqlsrv_fetch_array($stmtVerificar, SQLSRV_FETCH_ASSOC); if (!$relacion) { throw new Exception('Relación de importador no encontrada o no tienes permisos para desvincularla'); } if ($relacion['activo'] == 0) { throw new Exception('Esta relación de importador ya está inactiva'); } // Desactivar la relación de importador $sqlDesactivar = "UPDATE importador_agencia SET activo = 0, fecha_desvinculacion = GETDATE(), estado = 'DESVINCULADO' WHERE id_relacion = ?"; } else if ($tipo === 'agente') { // Verificar relación de agente aduanal $sqlVerificar = "SELECT aa.*, ag.id_administrador, u.nombre as usuario_nombre, u.tipo_usuario FROM agente_agencia aa INNER JOIN agencias_aduanales ag ON aa.id_agencia = ag.id_agencia INNER JOIN usuarios_sistema u ON aa.id_agente = u.id_usuario WHERE aa.id_relacion = ? AND ag.id_administrador = ? AND u.tipo_usuario = 'agente_aduanal' "; $stmtVerificar = sqlsrv_query($conn, $sqlVerificar, [$id_relacion, $_SESSION['usuario_id']]); $relacion = sqlsrv_fetch_array($stmtVerificar, SQLSRV_FETCH_ASSOC); if (!$relacion) { throw new Exception('Relación de agente no encontrada o no tienes permisos para desvincularla'); } if ($relacion['activo'] == 0) { throw new Exception('Esta relación de agente ya está inactiva'); } // Desactivar la relación de agente $sqlDesactivar = "UPDATE agente_agencia SET activo = 0 WHERE id_relacion = ?"; } $stmtDesactivar = sqlsrv_query($conn, $sqlDesactivar, [$id_relacion]); if (!$stmtDesactivar) { throw new Exception('Error al desactivar la relación de ' . $tipo); } // NUEVO: Verificar si el usuario desvinculado tenía esta agencia como activa if ($tipo === 'importador') { // Verificar si el importador tenía esta agencia como activa $sqlVerificarAgenciaActiva = "SELECT id_agencia_en_uso FROM usuarios_sistema WHERE id_usuario = ? AND id_agencia_en_uso = ?"; $stmtVerificarActiva = sqlsrv_query($conn, $sqlVerificarAgenciaActiva, [$relacion['id_importador'], $relacion['id_agencia']]); if ($stmtVerificarActiva && sqlsrv_fetch_array($stmtVerificarActiva, SQLSRV_FETCH_ASSOC)) { // Si tenía esta agencia como activa, quitársela $sqlQuitarAgenciaActiva = "UPDATE usuarios_sistema SET id_agencia_en_uso = NULL WHERE id_usuario = ?"; $stmtQuitarActiva = sqlsrv_query($conn, $sqlQuitarAgenciaActiva, [$relacion['id_importador']]); if (!$stmtQuitarActiva) { throw new Exception('Error al actualizar la agencia activa del importador'); } } } // Confirmar transacción sqlsrv_commit($conn); header('Location: /IMPORTADORES/vinculaciones/vinculacionesAgencia?success=unlinked&tipo=' . $tipo); exit; } catch (Exception $e) { // Revertir transacción en caso de error sqlsrv_rollback($conn); header('Location: /IMPORTADORES/vinculaciones/vinculacionesAgencia?error=unlinked_failed&message=' . urlencode($e->getMessage())); exit; } } function solicitudesVinculacion() { if (!($_SESSION['usuario_id'] ?? false) || $_SESSION['tipo_usuario'] !== 'admin_agencia') { header('Location: /IMPORTADORES/login'); exit; } $conn = getConnection(); // Obtener agencia... $sqlAgencia = "SELECT id_agencia FROM agencias_aduanales WHERE id_administrador = ?"; $params = [$_SESSION['usuario_id']]; $stmtAgencia = sqlsrv_query($conn, $sqlAgencia, $params); $rowAgencia = sqlsrv_fetch_array($stmtAgencia, SQLSRV_FETCH_ASSOC); if (!$rowAgencia) { $solicitudes = []; include __DIR__ . '/../../views/agencias/solicitudes_vinculacion.php'; return; } $id_agencia = $rowAgencia['id_agencia']; // Verificar solicitudes básicas $debugSql = "SELECT COUNT(*) as total FROM solicitudes_vinculacion WHERE id_agencia = ?"; $debugStmt = sqlsrv_query($conn, $debugSql, [$id_agencia]); $debugRow = sqlsrv_fetch_array($debugStmt, SQLSRV_FETCH_ASSOC); // Verificar pendientes $debugSql2 = "SELECT COUNT(*) as total FROM solicitudes_vinculacion WHERE estado = 'PENDIENTE' AND id_agencia = ?"; $debugStmt2 = sqlsrv_query($conn, $debugSql2, [$id_agencia]); $debugRow2 = sqlsrv_fetch_array($debugStmt2, SQLSRV_FETCH_ASSOC); // Consulta principal $sql = "SELECT sv.id_solicitud, u.nombre AS importador_nombre, ig.rfc, sv.mensaje, sv.fecha_solicitud, si.opinion_file FROM solicitudes_vinculacion sv INNER JOIN usuarios_sistema u ON sv.id_importador = u.id_usuario LEFT JOIN informacion_general ig ON u.id_usuario = ig.id_usuario LEFT JOIN solicitudes_importadores si ON LTRIM(RTRIM(LOWER(si.company_name))) = LTRIM(RTRIM(LOWER(u.nombre))) WHERE sv.estado = 'PENDIENTE' AND sv.id_agencia = ? ORDER BY sv.fecha_solicitud DESC "; $params = [$id_agencia]; $stmt = sqlsrv_query($conn, $sql, $params); // ✅ INICIALIZAR EL ARRAY DE SOLICITUDES $solicitudes = []; // ✅ VERIFICAR SI LA CONSULTA FUNCIONÓ if ($stmt === false) { // Usar consulta simplificada como backup $sqlSimple = "SELECT sv.id_solicitud, u.nombre AS importador_nombre, sv.mensaje, sv.fecha_solicitud FROM solicitudes_vinculacion sv INNER JOIN usuarios_sistema u ON sv.id_importador = u.id_usuario WHERE sv.estado = 'PENDIENTE' AND sv.id_agencia = ? ORDER BY sv.fecha_solicitud DESC "; $stmt = sqlsrv_query($conn, $sqlSimple, $params); } // ✅ PROCESAR LOS RESULTADOS Y LLENAR EL ARRAY if ($stmt !== false) { while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $solicitudes[] = $row; } } include __DIR__ . '/../../views/vinculaciones/solicitudes_vinculacion.php'; } function aprobarVinculacion() { // Verificar autenticación y permisos if (!($_SESSION['usuario_id'] ?? false) || $_SESSION['tipo_usuario'] !== 'admin_agencia') { header('Location: /IMPORTADORES/login'); exit; } // Verificar que se recibió el ID de la solicitud $id_solicitud = $_GET['id'] ?? null; if (!$id_solicitud || !is_numeric($id_solicitud)) { header('Location: /IMPORTADORES/vinculaciones/solicitudesVinculacion?error=request_id_invalid'); exit; } $conn = getConnection(); try { // Iniciar transacción sqlsrv_begin_transaction($conn); // 1. Obtener datos de la solicitud y verificar que pertenece a la agencia del admin $sqlSolicitud = "SELECT sv.id_solicitud, sv.id_importador, sv.id_agencia, sv.estado, aa.id_administrador FROM solicitudes_vinculacion sv INNER JOIN agencias_aduanales aa ON sv.id_agencia = aa.id_agencia WHERE sv.id_solicitud = ? AND aa.id_administrador = ? "; $stmtSolicitud = sqlsrv_query($conn, $sqlSolicitud, [$id_solicitud, $_SESSION['usuario_id']]); $solicitud = sqlsrv_fetch_array($stmtSolicitud, SQLSRV_FETCH_ASSOC); if (!$solicitud) { throw new Exception('Solicitud no encontrada o no tienes permisos para aprobarla'); } if ($solicitud['estado'] !== 'PENDIENTE') { throw new Exception('Esta solicitud ya ha sido procesada'); } // 2. Verificar si ya existe una relación activa entre importador y agencia $sqlVerificar = " SELECT id_relacion FROM importador_agencia WHERE id_importador = ? AND id_agencia = ? AND activo = 1"; $stmtVerificar = sqlsrv_query($conn, $sqlVerificar, [$solicitud['id_importador'], $solicitud['id_agencia']]); $relacionExistente = sqlsrv_fetch_array($stmtVerificar, SQLSRV_FETCH_ASSOC); if ($relacionExistente) { throw new Exception('Ya existe una vinculación activa entre este importador y la agencia'); } // 3. Actualizar el estado de la solicitud a APROBADO $sqlActualizar = "UPDATE solicitudes_vinculacion SET estado = 'APROBADO', fecha_respuesta = GETDATE(), respondido_por = ?, comentarios_respuesta = 'Vinculación aprobada' WHERE id_solicitud = ? "; $stmtActualizar = sqlsrv_query($conn, $sqlActualizar, [$_SESSION['usuario_id'], $id_solicitud]); if (!$stmtActualizar) { throw new Exception('Error al actualizar la solicitud'); } // 4. Crear la relación en importador_agencia $sqlRelacion = "INSERT INTO importador_agencia (id_importador, id_agencia, activo, fecha_vinculacion, creado_por, aprobado_por, estado) VALUES (?, ?, 1, GETDATE(), ?, ?, 'APROBADO') "; $stmtRelacion = sqlsrv_query($conn, $sqlRelacion, [$solicitud['id_importador'], $solicitud['id_agencia'], $solicitud['id_importador'], $_SESSION['usuario_id']]); if (!$stmtRelacion) { throw new Exception('Error al crear la relación importador-agencia'); } // Confirmar transacción sqlsrv_commit($conn); header('Location: /IMPORTADORES/vinculaciones/solicitudesVinculacion?success=approved'); exit; } catch (Exception $e) { // Revertir transacción en caso de error sqlsrv_rollback($conn); header('Location: /IMPORTADORES/vinculaciones/solicitudesVinculacion?error=denied'); exit; } } function denegarVinculacion() { // Verificar autenticación y permisos if (!($_SESSION['usuario_id'] ?? false) || $_SESSION['tipo_usuario'] !== 'admin_agencia') { header('Location: /IMPORTADORES/login'); exit; } // Verificar que se recibió el ID de la solicitud $id_solicitud = $_GET['id'] ?? null; if (!$id_solicitud || !is_numeric($id_solicitud)) { header('Location: /IMPORTADORES/vinculaciones/solicitudesVinculacion?error=request_id_invalid'); exit; } $conn = getConnection(); try { // Iniciar transacción sqlsrv_begin_transaction($conn); // 1. Obtener datos de la solicitud y verificar que pertenece a la agencia del admin $sqlSolicitud = "SELECT sv.id_solicitud, sv.id_importador, sv.id_agencia, sv.estado, aa.id_administrador FROM solicitudes_vinculacion sv INNER JOIN agencias_aduanales aa ON sv.id_agencia = aa.id_agencia WHERE sv.id_solicitud = ? AND aa.id_administrador = ? "; $stmtSolicitud = sqlsrv_query($conn, $sqlSolicitud, [$id_solicitud, $_SESSION['usuario_id']]); $solicitud = sqlsrv_fetch_array($stmtSolicitud, SQLSRV_FETCH_ASSOC); if (!$solicitud) { throw new Exception('Solicitud no encontrada o no tienes permisos para denegarla'); } if ($solicitud['estado'] !== 'PENDIENTE') { throw new Exception('Esta solicitud ya ha sido procesada'); } // 2. Actualizar el estado de la solicitud a DENEGADO $sqlActualizar = "UPDATE solicitudes_vinculacion SET estado = 'DENEGADO', fecha_respuesta = GETDATE(), respondido_por = ? WHERE id_solicitud = ? "; $stmtActualizar = sqlsrv_query($conn, $sqlActualizar, [$_SESSION['usuario_id'], $id_solicitud]); if (!$stmtActualizar) { throw new Exception('Error al actualizar la solicitud'); } if (!$stmtRelacion) { throw new Exception('Error al registrar el rechazo en el historial'); } // Confirmar transacción sqlsrv_commit($conn); header('Location: /IMPORTADORES/vinculaciones/solicitudesVinculacion?success=denied'); exit; } catch (Exception $e) { // Revertir transacción en caso de error sqlsrv_rollback($conn); header('Location: /IMPORTADORES/vinculaciones/solicitudesVinculacion?error=denied_error'); exit; } }