diff --git a/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php b/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php index 0233b89b5..4f4e1ed41 100644 --- a/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php +++ b/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php @@ -2,25 +2,15 @@ namespace ProcessMaker\Core; -use AppDelegationPeer; -use Task; -use Cases; -use Criteria; -use RoutePeer; -use TaskPeer; -use G; -use ElementTaskRelationPeer; -use BpmnEventPeer; -use ResultSet; -use PMScript; -use Exception; class RoutingScreen extends \Derivation { protected $convergent; protected $divergent; public $gateway = array('PARALLEL', 'PARALLEL-BY-EVALUATION'); + public $routeType = array('SEC-JOIN', 'EVALUATE'); public $isFirst; + public $isUniqueSecJoin = false; protected $taskSecJoin; public function __construct() @@ -68,23 +58,20 @@ class RoutingScreen extends \Derivation unset($aDataMerged[$key]['USER_ASSIGNED']); $aDataMerged[$key]['DEL_PRIORITY'] = ''; foreach ($post as $i => $item) { - if(isset($post[$i]['SOURCE_UID']) && ($nextTask['NEXT_TASK']['TAS_UID'] === $post[$i]['SOURCE_UID'])){ + if (isset($post[$i]['SOURCE_UID']) && ($nextTask['NEXT_TASK']['TAS_UID'] === $post[$i]['SOURCE_UID'])) { $flagJumpTask = true; - if($post[$i]['SOURCE_UID'] === $post[$i]['TAS_UID']){ + if ($post[$i]['SOURCE_UID'] === $post[$i]['TAS_UID']) { if (isset($post[$i]['USR_UID'])) { // Multiple instances task don't send this key $aDataMerged[$key]['USR_UID'] = $post[$i]['USR_UID']; } } else { $aDataMerged[$key]['NEXT_ROUTING'][] = $post[$i]; } - if (isset($post[$i]['NEXT_TASK'])) { - $aDataMerged[$key]['NEXT_TASK'] = $post[$i]['NEXT_TASK']; - } } } } //If flagJumpTask is false the template does not Jump Intermediate Events - if(!$flagJumpTask){ + if (!$flagJumpTask) { $aDataMerged = $post; } return $aDataMerged; @@ -92,7 +79,7 @@ class RoutingScreen extends \Derivation public function prepareRoutingScreen($arrayData) { - $information = $this->prepareInformationForRoutingScreen($arrayData); + $information = $this->prepareInformation($arrayData); $response = array(); $this->taskSecJoin = array(); foreach ($information as $index => $element) { @@ -112,7 +99,7 @@ class RoutingScreen extends \Derivation } } } - if (count($response) > 1) { + if (count($response) > 1 && !$this->isUniqueSecJoin) { foreach ($response as $index => $task) { $delete = false; foreach ($this->taskSecJoin as $tj => $type) { @@ -120,7 +107,7 @@ class RoutingScreen extends \Derivation $delete = true; } } - if ($delete && $response[$index]["NEXT_TASK"]["TAS_UID"] === "-1") { + if ($delete) { unset($response[$index]); } } @@ -132,12 +119,15 @@ class RoutingScreen extends \Derivation { $outElement = $element['out']; foreach ($outElement as $indexO => $outE) { - if (!$this->isFirst && in_array($outE, $this->gateway)) { + if ((!$this->isFirst && in_array($outE, $this->gateway))) { $this->divergent[$indexO] = $outE; } if ($outE == 'SEC-JOIN' && strpos($indexO, 'itee') === false) { $this->taskSecJoin[$indexO] = $outE; } + if (in_array($outE, $this->routeType) && strpos($indexO, 'gtg') !== false) { + $this->convergent[$indexO] = $outE; + } } if (empty($element['in'])) { return true; @@ -145,211 +135,14 @@ class RoutingScreen extends \Derivation $this->isFirst = false; $inElement = $element['in']; foreach ($inElement as $indexI => $inE) { - if ($inE == 'SEC-JOIN' && strpos($indexI, 'itee') !== false) { + if (($inE == 'SEC-JOIN' && strpos($indexI, 'itee') !== false) || $inE == 'SEC-JOIN') { $this->convergent[$indexI] = $inE; } $this->checkElement($this->node[$indexI]); + if ($inE == 'SEC-JOIN' && count($inElement) == 1) { + $this->isUniqueSecJoin = true; + } } return count($this->convergent) == 0 || count($this->divergent) == 0 || count($this->convergent) == count($this->divergent); } - - - /** - * Prepares the information to show in the routing screen. - * - * @param array $arrayData Data - * @param string $taskUid Unique id of Task - * - * @return array Return array - */ - public function prepareInformationForRoutingScreen(array $arrayData, $taskUid = "") - { - try { - if (!class_exists("Cases")) { - G::LoadClass("case"); - } - - $this->case = new Cases(); - $task = new Task(); - - $arrayApplicationData = $this->case->loadCase($arrayData["APP_UID"]); - - $arrayNextTask = array(); - $arrayNextTaskDefault = array(); - $i = 0; - - $criteria = new Criteria("workflow"); - - $criteria->addSelectColumn(RoutePeer::TAS_UID); - $criteria->addSelectColumn(RoutePeer::ROU_NEXT_TASK); - $criteria->addSelectColumn(RoutePeer::ROU_TYPE); - $criteria->addSelectColumn(RoutePeer::ROU_DEFAULT); - $criteria->addSelectColumn(RoutePeer::ROU_CONDITION); - - if ($taskUid != "") { - $criteria->add(\RoutePeer::TAS_UID, $taskUid, Criteria::EQUAL); - $criteria->addAscendingOrderByColumn(RoutePeer::ROU_CASE); - - $rsCriteria = RoutePeer::doSelectRS($criteria); - } else { - $criteria->addJoin(AppDelegationPeer::TAS_UID, TaskPeer::TAS_UID, Criteria::LEFT_JOIN); - $criteria->addJoin(AppDelegationPeer::TAS_UID, RoutePeer::TAS_UID, Criteria::LEFT_JOIN); - $criteria->add(AppDelegationPeer::APP_UID, $arrayData["APP_UID"], Criteria::EQUAL); - $criteria->add(AppDelegationPeer::DEL_INDEX, $arrayData["DEL_INDEX"], Criteria::EQUAL); - $criteria->addAscendingOrderByColumn(\RoutePeer::ROU_CASE); - - $rsCriteria = \AppDelegationPeer::doSelectRS($criteria); - } - - $rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC); - - $flagDefault = false; - $aSecJoin = array(); - $count = 0; - - while ($rsCriteria->next()) { - $arrayRouteData = G::array_merges($rsCriteria->getRow(), $arrayData); - - if ((int)($arrayRouteData["ROU_DEFAULT"]) == 1) { - $arrayNextTaskDefault = $arrayRouteData; - $flagDefault = true; - continue; - } - - $flagAddDelegation = true; - - //Evaluate the condition if there are conditions defined - if (trim($arrayRouteData["ROU_CONDITION"]) != "" && $arrayRouteData["ROU_TYPE"] != "SELECT") { - G::LoadClass("pmScript"); - - $pmScript = new PMScript(); - $pmScript->setFields($arrayApplicationData["APP_DATA"]); - $pmScript->setScript($arrayRouteData["ROU_CONDITION"]); - $flagAddDelegation = $pmScript->evaluate(); - } - - if (trim($arrayRouteData['ROU_CONDITION']) == '' && $arrayRouteData['ROU_NEXT_TASK'] != '-1') { - $arrayTaskData = $task->load($arrayRouteData['ROU_NEXT_TASK']); - - if ($arrayRouteData['ROU_TYPE'] != 'SEC-JOIN' && $arrayTaskData['TAS_TYPE'] == 'GATEWAYTOGATEWAY') { - $flagAddDelegation = true; - } - - if($arrayRouteData['ROU_TYPE'] == 'SEC-JOIN'){ - $aSecJoin[$count]['ROU_PREVIOUS_TASK'] = $arrayRouteData['ROU_NEXT_TASK']; - $aSecJoin[$count]['ROU_PREVIOUS_TYPE'] = 'SEC-JOIN'; - $count++; - } - } - - if ($arrayRouteData['ROU_TYPE'] == 'EVALUATE' && !empty($arrayNextTask)) { - $flagAddDelegation = false; - } - - if ($flagAddDelegation && - preg_match("/^(?:EVALUATE|PARALLEL-BY-EVALUATION)$/", $arrayRouteData["ROU_TYPE"]) && - trim($arrayRouteData["ROU_CONDITION"]) == "" - ) { - $flagAddDelegation = false; - } - - if ($flagAddDelegation) { - $arrayNextTask[++$i] = $this->prepareInformationTask($arrayRouteData); - } - } - - if (count($arrayNextTask) == 0 && count($arrayNextTaskDefault) > 0) { - $arrayNextTask[++$i] = $this->prepareInformationTask($arrayNextTaskDefault); - } - - //Check Task GATEWAYTOGATEWAY, END-MESSAGE-EVENT, END-EMAIL-EVENT - $arrayNextTaskBackup = $arrayNextTask; - - $arrayNextTask = array(); - $i = 0; - foreach ($arrayNextTaskBackup as $value) { - $arrayNextTaskData = $value; - $this->node[$value['TAS_UID']]['out'][$value['ROU_NEXT_TASK']] = $value['ROU_TYPE']; - if ($arrayNextTaskData["NEXT_TASK"]["TAS_UID"] != "-1" && - preg_match("/^(?:" . $this->regexpTaskTypeToInclude . ")$/", $arrayNextTaskData["NEXT_TASK"]["TAS_TYPE"]) - ) { - $arrayAux = $this->prepareInformationForRoutingScreen($arrayData, $arrayNextTaskData["NEXT_TASK"]["TAS_UID"]); - $this->node[$value['ROU_NEXT_TASK']]['in'][$value['TAS_UID']] = $value['ROU_TYPE']; - $notShowNextTaskWhenJoinOf = "INTERMEDIATE-THROW-MESSAGE-EVENT|INTERMEDIATE-CATCH-MESSAGE-EVENT|SCRIPT-TASK|INTERMEDIATE-CATCH-TIMER-EVENT|INTERMEDIATE-THROW-EMAIL-EVENT"; - - foreach ($arrayAux as $value2) { - - //@TODO move this logic to the prepareInformation of the Derivation class - $intermediateEventAndJoinPresent = (array_key_exists('TAS_TYPE', $value2) - && array_key_exists('ROU_TYPE', $value2) - && preg_match("/^(?:" . $notShowNextTaskWhenJoinOf . ")$/", $value2["TAS_TYPE"]) - && $value2['ROU_TYPE'] === 'SEC-JOIN'); - if (!$intermediateEventAndJoinPresent) { - $key = ++$i; - $arrayNextTask[$key] = $value2; - $prefix = substr($value['ROU_NEXT_TASK'], 0, 4); - if ($prefix!=='gtg-') { - $arrayNextTask[$key]['SOURCE_UID'] = $value['ROU_NEXT_TASK']; - } - foreach ($aSecJoin as $rsj) { - $arrayNextTask[$i]["NEXT_TASK"]["ROU_PREVIOUS_TASK"] = $rsj["ROU_PREVIOUS_TASK"]; - $arrayNextTask[$i]["NEXT_TASK"]["ROU_PREVIOUS_TYPE"] = "SEC-JOIN"; - } - } - } - } else { - $regexpTaskTypeToInclude = "END-MESSAGE-EVENT|END-EMAIL-EVENT|INTERMEDIATE-THROW-EMAIL-EVENT"; - - if ($arrayNextTaskData["NEXT_TASK"]["TAS_UID"] == "-1" && - preg_match("/^(?:" . $regexpTaskTypeToInclude . ")$/", $arrayNextTaskData["TAS_TYPE"]) - ) { - $arrayNextTaskData["NEXT_TASK"]["TAS_UID"] = $arrayNextTaskData["TAS_UID"] . "/" . $arrayNextTaskData["NEXT_TASK"]["TAS_UID"]; - } - $prefix = substr($value['ROU_NEXT_TASK'], 0, 4); - if($prefix!=='gtg-'){ - $arrayNextTaskData['SOURCE_UID'] = $value['ROU_NEXT_TASK']; - } - $arrayNextTask[++$i] = $arrayNextTaskData; - foreach($aSecJoin as $rsj){ - $arrayNextTask[$i]["NEXT_TASK"]["ROU_PREVIOUS_TASK"] = $rsj["ROU_PREVIOUS_TASK"]; - $arrayNextTask[$i]["NEXT_TASK"]["ROU_PREVIOUS_TYPE"] = "SEC-JOIN"; - } - //Start-Timer with Script-task - $criteriaE = new Criteria("workflow"); - $criteriaE->addSelectColumn(ElementTaskRelationPeer::ELEMENT_UID); - $criteriaE->addJoin(BpmnEventPeer::EVN_UID, ElementTaskRelationPeer::ELEMENT_UID, Criteria::LEFT_JOIN); - $criteriaE->add(ElementTaskRelationPeer::TAS_UID, $arrayNextTaskData["TAS_UID"], Criteria::EQUAL); - $criteriaE->add(BpmnEventPeer::EVN_TYPE, 'START', Criteria::EQUAL); - $criteriaE->add(BpmnEventPeer::EVN_MARKER, 'TIMER', Criteria::EQUAL); - $rsCriteriaE = AppDelegationPeer::doSelectRS($criteriaE); - $rsCriteriaE->setFetchmode(ResultSet::FETCHMODE_ASSOC); - while ($rsCriteriaE->next()) { - if($arrayNextTaskData["NEXT_TASK"]["TAS_TYPE"] == "SCRIPT-TASK"){ - if(isset($arrayNextTaskData["NEXT_TASK"]["USER_ASSIGNED"]["USR_UID"]) && $arrayNextTaskData["NEXT_TASK"]["USER_ASSIGNED"]["USR_UID"] == ""){ - $useruid = "00000000000000000000000000000001"; - $userFields = $this->getUsersFullNameFromArray( $useruid ); - $arrayNextTask[$i]["NEXT_TASK"]["USER_ASSIGNED"] = $userFields; - } - } - } - } - } - - //1. There is no rule - if (empty($arrayNextTask)) { - $bpmn = new \ProcessMaker\Project\Bpmn(); - - throw new Exception(G::LoadTranslation( - 'ID_NO_DERIVATION_' . (($bpmn->exists($arrayApplicationData['PRO_UID']))? 'BPMN_RULE' : 'RULE') - )); - } - - //Return - return $arrayNextTask; - } catch (Exception $e) { - throw $e; - } - } - - -} \ No newline at end of file +}