From bf7adb0dcd04a65a69dc32623a3c005fd27f8b3c Mon Sep 17 00:00:00 2001 From: Dante Date: Wed, 22 Mar 2017 19:36:06 -0400 Subject: [PATCH 1/5] HOR-2899 --- workflow/engine/classes/class.derivation.php | 193 ++++++++++++++++++ .../src/ProcessMaker/Core/RoutingScreen.php | 2 +- 2 files changed, 194 insertions(+), 1 deletion(-) diff --git a/workflow/engine/classes/class.derivation.php b/workflow/engine/classes/class.derivation.php index 6433852fa..2424cac75 100644 --- a/workflow/engine/classes/class.derivation.php +++ b/workflow/engine/classes/class.derivation.php @@ -152,6 +152,199 @@ class Derivation } } + + /** + * 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"; + if (array_key_exists('INTERMEDIATE-THROW-EMAIL-EVENT', $arrayAux) && array_key_exists('ROU_TYPE', $arrayAux) && + preg_match("/^(?:" . $notShowNextTaskWhenJoinOf . ")$/", $arrayAux["TAS_TYPE"]) && + $arrayAux['ROU_TYPE'] === 'SEC-JOIN') { + foreach ($arrayAux as $value2) { + $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; + } + } + /** * prepareInformation * diff --git a/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php b/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php index 0bf763fd6..6878845a6 100644 --- a/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php +++ b/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php @@ -80,7 +80,7 @@ class RoutingScreen extends \Derivation public function prepareRoutingScreen($arrayData) { - $information = $this->prepareInformation($arrayData); + $information = $this->prepareInformationForRoutingScreen($arrayData); $response = array(); $this->taskSecJoin = array(); foreach ($information as $index => $element) { From 0b348de3acf1d121964a820b15af340e84e87b0c Mon Sep 17 00:00:00 2001 From: Dante Date: Thu, 23 Mar 2017 09:26:12 -0400 Subject: [PATCH 2/5] Moving prepareInformationForRoutingScreen to the RoutingScreen class --- workflow/engine/classes/class.derivation.php | 199 +---------------- .../src/ProcessMaker/Core/RoutingScreen.php | 204 ++++++++++++++++++ 2 files changed, 207 insertions(+), 196 deletions(-) diff --git a/workflow/engine/classes/class.derivation.php b/workflow/engine/classes/class.derivation.php index 2424cac75..bf667843b 100644 --- a/workflow/engine/classes/class.derivation.php +++ b/workflow/engine/classes/class.derivation.php @@ -52,7 +52,7 @@ class Derivation protected $flagControlMulInstance; protected $sys; protected $context; - private $regexpTaskTypeToInclude; + protected $regexpTaskTypeToInclude; public $node; public $userLogged = null; @@ -85,7 +85,7 @@ class Derivation * * @return array Return array */ - private function prepareInformationTask(array $arrayTaskData) + protected function prepareInformationTask(array $arrayTaskData) { try { $task = new Task(); @@ -152,200 +152,7 @@ class Derivation } } - - /** - * 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"; - if (array_key_exists('INTERMEDIATE-THROW-EMAIL-EVENT', $arrayAux) && array_key_exists('ROU_TYPE', $arrayAux) && - preg_match("/^(?:" . $notShowNextTaskWhenJoinOf . ")$/", $arrayAux["TAS_TYPE"]) && - $arrayAux['ROU_TYPE'] === 'SEC-JOIN') { - foreach ($arrayAux as $value2) { - $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; - } - } - - /** + /** * prepareInformation * * @param array $arrayData Data diff --git a/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php b/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php index 6878845a6..949e3c15b 100644 --- a/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php +++ b/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php @@ -2,6 +2,16 @@ namespace ProcessMaker\Core; +use AppDelegationPeer; +use Task; +use Cases; +use Criteria; +use RoutePeer; +use TaskPeer; +use G; +use ElementTaskRelationPeer; +use BpmnEventPeer; +use ResultSet; class RoutingScreen extends \Derivation { @@ -141,4 +151,198 @@ class RoutingScreen extends \Derivation 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"; + if (array_key_exists('INTERMEDIATE-THROW-EMAIL-EVENT', $arrayAux) && array_key_exists('ROU_TYPE', $arrayAux) && + preg_match("/^(?:" . $notShowNextTaskWhenJoinOf . ")$/", $arrayAux["TAS_TYPE"]) && + $arrayAux['ROU_TYPE'] === 'SEC-JOIN') { + foreach ($arrayAux as $value2) { + $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 From c396f6bc75e35e15290cac1adf48ceb4434aa753 Mon Sep 17 00:00:00 2001 From: Dante Date: Thu, 23 Mar 2017 09:28:09 -0400 Subject: [PATCH 3/5] Remove of unintended space --- workflow/engine/classes/class.derivation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/classes/class.derivation.php b/workflow/engine/classes/class.derivation.php index bf667843b..afd873637 100644 --- a/workflow/engine/classes/class.derivation.php +++ b/workflow/engine/classes/class.derivation.php @@ -152,7 +152,7 @@ class Derivation } } - /** + /** * prepareInformation * * @param array $arrayData Data From 2a50094e88eb0dabebdeca9b65652021e8d1a82f Mon Sep 17 00:00:00 2001 From: Dante Date: Thu, 23 Mar 2017 10:37:40 -0400 Subject: [PATCH 4/5] Correction for many target delegations --- .../src/ProcessMaker/Core/RoutingScreen.php | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php b/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php index 949e3c15b..8bf58d1d3 100644 --- a/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php +++ b/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php @@ -12,6 +12,7 @@ use G; use ElementTaskRelationPeer; use BpmnEventPeer; use ResultSet; +use PMScript; class RoutingScreen extends \Derivation { @@ -274,17 +275,22 @@ class RoutingScreen extends \Derivation $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"; - if (array_key_exists('INTERMEDIATE-THROW-EMAIL-EVENT', $arrayAux) && array_key_exists('ROU_TYPE', $arrayAux) && - preg_match("/^(?:" . $notShowNextTaskWhenJoinOf . ")$/", $arrayAux["TAS_TYPE"]) && - $arrayAux['ROU_TYPE'] === 'SEC-JOIN') { - foreach ($arrayAux as $value2) { + + 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-'){ + if ($prefix!=='gtg-') { $arrayNextTask[$key]['SOURCE_UID'] = $value['ROU_NEXT_TASK']; } - foreach($aSecJoin as $rsj){ + foreach ($aSecJoin as $rsj) { $arrayNextTask[$i]["NEXT_TASK"]["ROU_PREVIOUS_TASK"] = $rsj["ROU_PREVIOUS_TASK"]; $arrayNextTask[$i]["NEXT_TASK"]["ROU_PREVIOUS_TYPE"] = "SEC-JOIN"; } From 974c9b88c6cb175dd636364c5fab0d75f0ba9ad5 Mon Sep 17 00:00:00 2001 From: Dante Date: Thu, 23 Mar 2017 16:09:00 -0400 Subject: [PATCH 5/5] Correction to unreferenced class in the use section --- workflow/engine/src/ProcessMaker/Core/RoutingScreen.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php b/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php index 8bf58d1d3..0233b89b5 100644 --- a/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php +++ b/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php @@ -13,6 +13,7 @@ use ElementTaskRelationPeer; use BpmnEventPeer; use ResultSet; use PMScript; +use Exception; class RoutingScreen extends \Derivation { @@ -277,7 +278,7 @@ class RoutingScreen extends \Derivation $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)