1313use Laravel \Scout \Searchable ;
1414use Log ;
1515use ProcessMaker \Casts \MillisecondsToDateCast ;
16+ use ProcessMaker \Contracts \ConditionalRedirectServiceInterface ;
1617use ProcessMaker \Events \ActivityAssigned ;
1718use ProcessMaker \Events \ActivityReassignment ;
1819use ProcessMaker \Facades \WorkflowUserManager ;
@@ -753,13 +754,35 @@ public function valueAliasStatus($value, $expression, $callback = null, User $us
753754
754755 $ value = mb_strtolower ($ value );
755756
756- return function ($ query ) use ($ value , $ statusMap , $ expression , $ user ) {
757+ // Capture processManagerIds from the builder if it's available
758+ // The $callback parameter is actually the $builder from ExtendedPMQL
759+ $ builder = $ callback ;
760+ $ processManagerIds = null ;
761+ if ($ builder && method_exists ($ builder , 'getQuery ' )) {
762+ $ processManagerIds = $ builder ->getQuery ()->processManagerIds ?? null ;
763+ }
764+
765+ return function ($ query ) use ($ value , $ statusMap , $ expression , $ user , $ processManagerIds ) {
766+ // Also check in the current query in case it's available there
767+ $ currentProcessManagerIds = $ query ->getQuery ()->processManagerIds ?? null ;
768+ $ finalProcessManagerIds = $ processManagerIds ?? $ currentProcessManagerIds ;
769+ $ isProcessManager = !empty ($ finalProcessManagerIds );
770+
757771 if ($ value === 'self service ' ) {
758772 if (!$ user ) {
759773 $ user = auth ()->user ();
760774 }
761775
762- if ($ user ) {
776+ if ($ isProcessManager ) {
777+ // When processesIManage is active, include self-service tasks from managed processes
778+ $ selfServiceTaskIds = ProcessRequestToken::select (['id ' ])
779+ ->whereIn ('process_id ' , $ finalProcessManagerIds )
780+ ->where ('is_self_service ' , 1 )
781+ ->whereNull ('user_id ' )
782+ ->where ('status ' , 'ACTIVE ' );
783+
784+ $ query ->whereIn ('process_request_tokens.id ' , $ selfServiceTaskIds );
785+ } elseif ($ user ) {
763786 $ taskIds = $ user ->availableSelfServiceTaskIds ();
764787 $ query ->whereIn ('process_request_tokens.id ' , $ taskIds );
765788 } else {
@@ -1369,10 +1392,28 @@ public function reassign($toUserId, User $requestingUser)
13691392 *
13701393 * @return array|null Returns the destination URL.
13711394 */
1372- private function getElementDestination ($ elementDestinationType , $ elementDestinationProp ): ?array
1395+ private function getElementDestination ($ elementDestinationType , $ elementDestinationProp, array $ conditionalRedirectProp ): ?array
13731396 {
13741397 $ elementDestination = null ;
13751398
1399+ if (!empty ($ conditionalRedirectProp ['isEnabled ' ]) && !empty ($ conditionalRedirectProp ['conditions ' ])) {
1400+ $ result = $ this ->evaluateConditionalRedirect (app (ConditionalRedirectServiceInterface::class), $ conditionalRedirectProp );
1401+ if ($ result ) {
1402+ $ elementDestinationType = $ result ['taskDestination ' ]['value ' ];
1403+
1404+ $ url = match ($ elementDestinationType ) {
1405+ 'customDashboard ' => $ result ['customDashboard ' ]['url ' ] ?? null ,
1406+ 'externalURL ' => $ result ['externalUrl ' ] ?? null ,
1407+ default => null ,
1408+ };
1409+
1410+ $ elementDestinationProp = [
1411+ 'value ' => [
1412+ 'url ' => $ url ,
1413+ ],
1414+ ];
1415+ }
1416+ }
13761417 switch ($ elementDestinationType ) {
13771418 case 'anotherProcess ' :
13781419 case 'customDashboard ' :
@@ -1416,6 +1457,15 @@ private function getElementDestination($elementDestinationType, $elementDestinat
14161457 ];
14171458 }
14181459
1460+ private function evaluateConditionalRedirect (ConditionalRedirectServiceInterface $ conditionalRedirectService , array $ conditionalRedirectProp ): ?array
1461+ {
1462+ if (!$ conditionalRedirectProp ['isEnabled ' ]) {
1463+ return null ;
1464+ }
1465+
1466+ return $ conditionalRedirectService ->resolveForToken ($ conditionalRedirectProp ['conditions ' ], $ this );
1467+ }
1468+
14191469 /**
14201470 * Determines the destination URL based on the element destination type specified in the definition.
14211471 *
@@ -1426,6 +1476,8 @@ public function getElementDestinationAttribute(): ?array
14261476 $ definition = $ this ->getDefinition ();
14271477 $ elementDestinationProp = $ definition ['elementDestination ' ] ?? null ;
14281478 $ elementDestinationType = null ;
1479+ $ conditionalRedirectProp = $ definition ['conditionalRedirect ' ] ?? '[] ' ;
1480+ $ conditionalRedirectProp = json_decode ($ conditionalRedirectProp , true );
14291481
14301482 try {
14311483 $ elementDestinationProp = json_decode ($ elementDestinationProp , true );
@@ -1436,7 +1488,7 @@ public function getElementDestinationAttribute(): ?array
14361488 return null ;
14371489 }
14381490
1439- return $ this ->getElementDestination ($ elementDestinationType , $ elementDestinationProp );
1491+ return $ this ->getElementDestination ($ elementDestinationType , $ elementDestinationProp, $ conditionalRedirectProp );
14401492 }
14411493
14421494 /**
0 commit comments