Skip to content

Commit 678b4a3

Browse files
authored
Merge pull request #8611 from ProcessMaker/bugfix/FOUR-27966
The status filter in Processes I Manage stopped working
2 parents 5745fac + 1816f04 commit 678b4a3

2 files changed

Lines changed: 68 additions & 17 deletions

File tree

ProcessMaker/Models/ProcessRequestToken.php

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -753,13 +753,35 @@ public function valueAliasStatus($value, $expression, $callback = null, User $us
753753

754754
$value = mb_strtolower($value);
755755

756-
return function ($query) use ($value, $statusMap, $expression, $user) {
756+
// Capture processManagerIds from the builder if it's available
757+
// The $callback parameter is actually the $builder from ExtendedPMQL
758+
$builder = $callback;
759+
$processManagerIds = null;
760+
if ($builder && method_exists($builder, 'getQuery')) {
761+
$processManagerIds = $builder->getQuery()->processManagerIds ?? null;
762+
}
763+
764+
return function ($query) use ($value, $statusMap, $expression, $user, $processManagerIds) {
765+
// Also check in the current query in case it's available there
766+
$currentProcessManagerIds = $query->getQuery()->processManagerIds ?? null;
767+
$finalProcessManagerIds = $processManagerIds ?? $currentProcessManagerIds;
768+
$isProcessManager = !empty($finalProcessManagerIds);
769+
757770
if ($value === 'self service') {
758771
if (!$user) {
759772
$user = auth()->user();
760773
}
761774

762-
if ($user) {
775+
if ($isProcessManager) {
776+
// When processesIManage is active, include self-service tasks from managed processes
777+
$selfServiceTaskIds = ProcessRequestToken::select(['id'])
778+
->whereIn('process_id', $finalProcessManagerIds)
779+
->where('is_self_service', 1)
780+
->whereNull('user_id')
781+
->where('status', 'ACTIVE');
782+
783+
$query->whereIn('process_request_tokens.id', $selfServiceTaskIds);
784+
} elseif ($user) {
763785
$taskIds = $user->availableSelfServiceTaskIds();
764786
$query->whereIn('process_request_tokens.id', $taskIds);
765787
} else {

ProcessMaker/Traits/TaskControllerIndexMethods.php

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -289,27 +289,56 @@ private function applyPmql($query, $request, $user)
289289
} catch (SyntaxError $e) {
290290
abort('Your PMQL contains invalid syntax.', 400);
291291
}
292-
293-
// After PMQL is applied, if processesIManage is active, add self-service tasks
294-
// This is done after PMQL to avoid the is_self_service = 0 filter that PMQL might add
295-
if ($request->input('processesIManage') === 'true' && isset($query->getQuery()->processManagerIds)) {
296-
$ids = $query->getQuery()->processManagerIds;
297-
$selfServiceTaskIds = ProcessRequestToken::select(['id'])
298-
->whereIn('process_id', $ids)
299-
->where('is_self_service', 1)
300-
->whereNull('user_id')
301-
->where('status', 'ACTIVE');
302-
303-
// Add self-service tasks using orWhereIn to override PMQL's is_self_service = 0 filter
304-
$query->orWhereIn('process_request_tokens.id', $selfServiceTaskIds);
305-
}
306292
}
307293
}
308294

309295
private function applyAdvancedFilter($query, $request)
310296
{
311297
if ($advancedFilter = $request->input('advanced_filter', '')) {
312-
Filter::filter($query, $advancedFilter);
298+
// Parse the advanced filter
299+
$filterArray = is_string($advancedFilter) ? json_decode($advancedFilter, true) : $advancedFilter;
300+
301+
// Check if processesIManage is active and we have processManagerIds
302+
$processManagerIds = $query->getQuery()->processManagerIds ?? null;
303+
$isProcessManager = !empty($processManagerIds) && $request->input('processesIManage') === 'true';
304+
305+
// If processesIManage is active, handle "Self Service" status filter specially
306+
if ($isProcessManager && is_array($filterArray)) {
307+
$hasSelfServiceFilter = false;
308+
$filteredArray = [];
309+
310+
foreach ($filterArray as $filter) {
311+
// Check if this is a "Self Service" status filter
312+
if (isset($filter['subject']['type']) &&
313+
$filter['subject']['type'] === 'Status' &&
314+
isset($filter['value']) &&
315+
mb_strtolower($filter['value']) === 'self service') {
316+
$hasSelfServiceFilter = true;
317+
// Don't add this filter to the array - we'll handle it manually
318+
continue;
319+
}
320+
$filteredArray[] = $filter;
321+
}
322+
323+
// Apply the filtered advanced_filter (without Self Service)
324+
if (!empty($filteredArray)) {
325+
Filter::filter($query, $filteredArray);
326+
}
327+
328+
// Manually apply the Self Service filter for process managers
329+
if ($hasSelfServiceFilter) {
330+
$selfServiceTaskIds = ProcessRequestToken::select(['id'])
331+
->whereIn('process_id', $processManagerIds)
332+
->where('is_self_service', 1)
333+
->whereNull('user_id')
334+
->where('status', 'ACTIVE');
335+
336+
$query->whereIn('process_request_tokens.id', $selfServiceTaskIds);
337+
}
338+
} else {
339+
// Normal behavior - apply the filter as-is
340+
Filter::filter($query, $advancedFilter);
341+
}
313342
}
314343
}
315344

0 commit comments

Comments
 (0)