From 1816f0449d1d55e3b00c3156253e03c7573141fc Mon Sep 17 00:00:00 2001 From: "Marco A. Nina Mena" Date: Tue, 18 Nov 2025 21:11:38 -0400 Subject: [PATCH] Enhance self-service task filtering for process managers in ProcessRequestToken and TaskControllerIndexMethods. --- ProcessMaker/Models/ProcessRequestToken.php | 26 +++++++- .../Traits/TaskControllerIndexMethods.php | 59 ++++++++++++++----- 2 files changed, 68 insertions(+), 17 deletions(-) diff --git a/ProcessMaker/Models/ProcessRequestToken.php b/ProcessMaker/Models/ProcessRequestToken.php index 6abf47e02d..87621f1f0a 100644 --- a/ProcessMaker/Models/ProcessRequestToken.php +++ b/ProcessMaker/Models/ProcessRequestToken.php @@ -753,13 +753,35 @@ public function valueAliasStatus($value, $expression, $callback = null, User $us $value = mb_strtolower($value); - return function ($query) use ($value, $statusMap, $expression, $user) { + // Capture processManagerIds from the builder if it's available + // The $callback parameter is actually the $builder from ExtendedPMQL + $builder = $callback; + $processManagerIds = null; + if ($builder && method_exists($builder, 'getQuery')) { + $processManagerIds = $builder->getQuery()->processManagerIds ?? null; + } + + return function ($query) use ($value, $statusMap, $expression, $user, $processManagerIds) { + // Also check in the current query in case it's available there + $currentProcessManagerIds = $query->getQuery()->processManagerIds ?? null; + $finalProcessManagerIds = $processManagerIds ?? $currentProcessManagerIds; + $isProcessManager = !empty($finalProcessManagerIds); + if ($value === 'self service') { if (!$user) { $user = auth()->user(); } - if ($user) { + if ($isProcessManager) { + // When processesIManage is active, include self-service tasks from managed processes + $selfServiceTaskIds = ProcessRequestToken::select(['id']) + ->whereIn('process_id', $finalProcessManagerIds) + ->where('is_self_service', 1) + ->whereNull('user_id') + ->where('status', 'ACTIVE'); + + $query->whereIn('process_request_tokens.id', $selfServiceTaskIds); + } elseif ($user) { $taskIds = $user->availableSelfServiceTaskIds(); $query->whereIn('process_request_tokens.id', $taskIds); } else { diff --git a/ProcessMaker/Traits/TaskControllerIndexMethods.php b/ProcessMaker/Traits/TaskControllerIndexMethods.php index a3e1c6c678..86b91daa0a 100644 --- a/ProcessMaker/Traits/TaskControllerIndexMethods.php +++ b/ProcessMaker/Traits/TaskControllerIndexMethods.php @@ -289,27 +289,56 @@ private function applyPmql($query, $request, $user) } catch (SyntaxError $e) { abort('Your PMQL contains invalid syntax.', 400); } - - // After PMQL is applied, if processesIManage is active, add self-service tasks - // This is done after PMQL to avoid the is_self_service = 0 filter that PMQL might add - if ($request->input('processesIManage') === 'true' && isset($query->getQuery()->processManagerIds)) { - $ids = $query->getQuery()->processManagerIds; - $selfServiceTaskIds = ProcessRequestToken::select(['id']) - ->whereIn('process_id', $ids) - ->where('is_self_service', 1) - ->whereNull('user_id') - ->where('status', 'ACTIVE'); - - // Add self-service tasks using orWhereIn to override PMQL's is_self_service = 0 filter - $query->orWhereIn('process_request_tokens.id', $selfServiceTaskIds); - } } } private function applyAdvancedFilter($query, $request) { if ($advancedFilter = $request->input('advanced_filter', '')) { - Filter::filter($query, $advancedFilter); + // Parse the advanced filter + $filterArray = is_string($advancedFilter) ? json_decode($advancedFilter, true) : $advancedFilter; + + // Check if processesIManage is active and we have processManagerIds + $processManagerIds = $query->getQuery()->processManagerIds ?? null; + $isProcessManager = !empty($processManagerIds) && $request->input('processesIManage') === 'true'; + + // If processesIManage is active, handle "Self Service" status filter specially + if ($isProcessManager && is_array($filterArray)) { + $hasSelfServiceFilter = false; + $filteredArray = []; + + foreach ($filterArray as $filter) { + // Check if this is a "Self Service" status filter + if (isset($filter['subject']['type']) && + $filter['subject']['type'] === 'Status' && + isset($filter['value']) && + mb_strtolower($filter['value']) === 'self service') { + $hasSelfServiceFilter = true; + // Don't add this filter to the array - we'll handle it manually + continue; + } + $filteredArray[] = $filter; + } + + // Apply the filtered advanced_filter (without Self Service) + if (!empty($filteredArray)) { + Filter::filter($query, $filteredArray); + } + + // Manually apply the Self Service filter for process managers + if ($hasSelfServiceFilter) { + $selfServiceTaskIds = ProcessRequestToken::select(['id']) + ->whereIn('process_id', $processManagerIds) + ->where('is_self_service', 1) + ->whereNull('user_id') + ->where('status', 'ACTIVE'); + + $query->whereIn('process_request_tokens.id', $selfServiceTaskIds); + } + } else { + // Normal behavior - apply the filter as-is + Filter::filter($query, $advancedFilter); + } } }