From aaa4ba24938c47199f48b72eead4c331cfa936bd Mon Sep 17 00:00:00 2001 From: Ronald Q Date: Mon, 1 Aug 2016 16:42:58 -0400 Subject: [PATCH] =?UTF-8?q?HOR-1501=20Crear=20el=20m=C3=A9todo=20recursivo?= =?UTF-8?q?=20para=20encontrar=20la=20siguiente=20tarea=20con=20usuarios?= =?UTF-8?q?=20asignados=20despu=C3=A9s=20de=20un=20intermediase=20event?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- workflow/engine/classes/class.derivation.php | 2 +- workflow/engine/classes/class.pmScript.php | 2 +- workflow/engine/methods/cases/cases_Step.php | 9 +- .../src/ProcessMaker/Core/RoutingScreen.php | 191 ++++++++++++++++++ 4 files changed, 200 insertions(+), 4 deletions(-) create mode 100644 workflow/engine/src/ProcessMaker/Core/RoutingScreen.php diff --git a/workflow/engine/classes/class.derivation.php b/workflow/engine/classes/class.derivation.php index 85c69d260..757447a08 100755 --- a/workflow/engine/classes/class.derivation.php +++ b/workflow/engine/classes/class.derivation.php @@ -58,7 +58,7 @@ class Derivation * * @return array Return array */ - private function prepareInformationTask(array $arrayTaskData) + protected function prepareInformationTask(array $arrayTaskData) { try { $task = new Task(); diff --git a/workflow/engine/classes/class.pmScript.php b/workflow/engine/classes/class.pmScript.php index 3ec8cef4d..51d661445 100644 --- a/workflow/engine/classes/class.pmScript.php +++ b/workflow/engine/classes/class.pmScript.php @@ -368,7 +368,7 @@ class PMScript /** * Evaluate the current script * - * @return void + * @return null */ public function evaluate () { diff --git a/workflow/engine/methods/cases/cases_Step.php b/workflow/engine/methods/cases/cases_Step.php index ee8c75589..deda937c0 100755 --- a/workflow/engine/methods/cases/cases_Step.php +++ b/workflow/engine/methods/cases/cases_Step.php @@ -798,8 +798,13 @@ try { $aFields['TAS_TYPE_DAY'] = G::LoadTranslation( 'ID_COUNT_DAYS' ); $aFields['TAS_CALENDAR'] = G::LoadTranslation( 'ID_CALENDAR' ); - $aFields['TASK'] = $oDerivation->prepareInformation( array ('USER_UID' => $_SESSION['USER_LOGGED'],'APP_UID' => $_SESSION['APPLICATION'],'DEL_INDEX' => $_SESSION['INDEX'] - ) ); + $oRoute = new \ProcessMaker\Core\RoutingScreen(); + $arrayData = array( + 'USER_UID' => $_SESSION['USER_LOGGED'], + 'APP_UID' => $_SESSION['APPLICATION'], + 'DEL_INDEX' => $_SESSION['INDEX'] + ); + $aFields['TASK'] = $oRoute->prepareInformation($arrayData); if (empty( $aFields['TASK'] )) { throw (new Exception( G::LoadTranslation( 'ID_NO_DERIVATION_RULE' ) )); diff --git a/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php b/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php new file mode 100644 index 000000000..606bd8448 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php @@ -0,0 +1,191 @@ +case = new \Cases(); + $task = new \Task(); + $arrayApplicationData = $this->case->loadCase($arrayData["APP_UID"]); + + $arrayNextTask = array(); + $arrayNextTaskDefault = array(); + $i = 0; + + $flagDefault = false; + $aSecJoin = array(); + $count = 0; + $routeData = $this->getRouteData($arrayData, $taskUid); + foreach ($routeData as $arrayRouteData) { + if ((int)($arrayRouteData["ROU_DEFAULT"]) == 1) { + $arrayNextTaskDefault = $arrayRouteData; + $flagDefault = true; + continue; + } + + $flagAddDelegation = $this->executeScript($arrayRouteData, $arrayApplicationData["APP_DATA"]); + + 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 (!$arrayNextTask && 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; + + $regexpTaskTypeToInclude = "GATEWAYTOGATEWAY|END-MESSAGE-EVENT|END-EMAIL-EVENT|SCRIPT-TASK|INTERMEDIATE-CATCH-TIMER-EVENT|INTERMEDIATE-THROW-EMAIL-EVENT"; + + if ($arrayNextTaskData["NEXT_TASK"]["TAS_UID"] != "-1" && + preg_match("/^(?:" . $regexpTaskTypeToInclude . ")$/", $arrayNextTaskData["NEXT_TASK"]["TAS_TYPE"]) + ) { + $arrayAux = $this->prepareInformation($arrayData, $arrayNextTaskData["NEXT_TASK"]["TAS_UID"]); + + foreach ($arrayAux as $value2) { + $arrayNextTask[++$i] = $value2; + 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"]; + } + + $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; + } + } + + public function getRouteData($arrayData, $taskUid) + { + $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); + $array = array(); + while ($rsCriteria->next()) { + $array[] = \G::array_merges($rsCriteria->getRow(), $arrayData); + } + return $array; + } + + public function executeScript($arrayRouteData, $appData) + { + //Evaluate the condition if there are conditions defined + $flagAddDelegation = true; + if (trim($arrayRouteData["ROU_CONDITION"]) != "" && $arrayRouteData["ROU_TYPE"] != "SELECT") { + \G::LoadClass("pmScript"); + + $pmScript = new \PMScript(); + $pmScript->setFields($appData); + $pmScript->setScript($arrayRouteData["ROU_CONDITION"]); + $flagAddDelegation = $pmScript->evaluate(); + } + return $flagAddDelegation; + } + +} \ No newline at end of file