From aaa4ba24938c47199f48b72eead4c331cfa936bd Mon Sep 17 00:00:00 2001 From: Ronald Q Date: Mon, 1 Aug 2016 16:42:58 -0400 Subject: [PATCH 1/3] =?UTF-8?q?HOR-1501=20Crear=20el=20m=C3=A9todo=20recur?= =?UTF-8?q?sivo=20para=20encontrar=20la=20siguiente=20tarea=20con=20usuari?= =?UTF-8?q?os=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 From 07dd7e58e89d84bec8bce6e1c10ca8948ee9633b Mon Sep 17 00:00:00 2001 From: Ronald Q Date: Thu, 4 Aug 2016 15:30:29 -0400 Subject: [PATCH 2/3] change methods --- 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 aa039c0ed..074131d0a 100755 --- a/workflow/engine/classes/class.derivation.php +++ b/workflow/engine/classes/class.derivation.php @@ -80,7 +80,7 @@ class Derivation * * @return array Return array */ - protected function prepareInformationTask(array $arrayTaskData) + private function prepareInformationTask(array $arrayTaskData) { try { $task = new Task(); From 18ab7cd4d381ae65d0e467627e851320a992737e Mon Sep 17 00:00:00 2001 From: Ronald Q Date: Fri, 5 Aug 2016 17:38:31 -0400 Subject: [PATCH 3/3] fix in derivation --- workflow/engine/classes/class.wsBase.php | 14 ++++++++------ .../src/ProcessMaker/BusinessModel/Light.php | 2 ++ .../engine/src/ProcessMaker/Core/RoutingScreen.php | 3 +-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/workflow/engine/classes/class.wsBase.php b/workflow/engine/classes/class.wsBase.php index 8f2ad869b..d5bc254fd 100755 --- a/workflow/engine/classes/class.wsBase.php +++ b/workflow/engine/classes/class.wsBase.php @@ -2249,6 +2249,7 @@ class wsBase $oCase->setDelInitDate( $caseId, $delIndex ); $appFields = $oCase->loadCase( $caseId, $delIndex ); } + unset($appFields['APP_ROUTING_DATA']); $appFields["APP_DATA"]["APPLICATION"] = $caseId; @@ -2439,8 +2440,9 @@ class wsBase //derivate case $aCurrentDerivation = array ('APP_UID' => $caseId,'DEL_INDEX' => $delIndex,'APP_STATUS' => $sStatus,'TAS_UID' => $appdel['TAS_UID'],'ROU_TYPE' => $row[0]['ROU_TYPE'] ); - - $oDerivation->derivate( $aCurrentDerivation, $nextDelegations ); + $oRoute = new \ProcessMaker\Core\RoutingScreen(); + $nextTasks = $oRoute->mergeDataDerivation($nextDelegations, $oDerivation->prepareInformation($aData)); + $oDerivation->derivate( $aCurrentDerivation, $nextTasks ); $appFields = $oCase->loadCase( $caseId ); //Execute triggers after derivation @@ -2485,10 +2487,10 @@ class wsBase $appFields['APP_DATA'] = $oPMScript->aFields; //$appFields['APP_DATA']['APPLICATION'] = $caseId; //$appFields = $oCase->loadCase($caseId); - unset($aFields['APP_STATUS']); - unset($aFields['APP_PROC_STATUS']); - unset($aFields['APP_PROC_CODE']); - unset($aFields['APP_PIN']); + unset($appFields['APP_STATUS']); + unset($appFields['APP_PROC_STATUS']); + unset($appFields['APP_PROC_CODE']); + unset($appFields['APP_PIN']); $oCase->updateCase( $caseId, $appFields ); } } diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Light.php b/workflow/engine/src/ProcessMaker/BusinessModel/Light.php index e5ec9dad0..65befbdbe 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Light.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Light.php @@ -451,6 +451,7 @@ class Light $taskAss['delPriority'] = isset($aValues['NEXT_TASK']['DEL_PRIORITY'])?$aValues['NEXT_TASK']['DEL_PRIORITY']:""; $taskAss['taskParent'] = $aValues['NEXT_TASK']['TAS_PARENT']; $taskAss['taskMessage'] = $taskType?$taskMessage:""; + $taskAss['sourceUid'] = $aValues['SOURCE_UID']; $users = array(); $users['userId'] = $derive[$sKey]['NEXT_TASK']['USER_ASSIGNED']['USR_UID']; $users['userFullName'] = strip_tags($derive[$sKey]['NEXT_TASK']['USER_ASSIGNED']['USR_FULLNAME']); @@ -468,6 +469,7 @@ class Light $manual['delPriority'] = isset($aValues['NEXT_TASK']['DEL_PRIORITY'])?$aValues['NEXT_TASK']['DEL_PRIORITY']:""; $manual['taskParent'] = $aValues['NEXT_TASK']['TAS_PARENT']; $manual['taskMessage'] = $taskType?$taskMessage:""; + $manual['sourceUid'] = $aValues['SOURCE_UID']; $Aux = array (); foreach ($aValues['NEXT_TASK']['USER_ASSIGNED'] as $aUser) { $Aux[$aUser['USR_UID']] = $aUser['USR_FULLNAME']; diff --git a/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php b/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php index 603be8a7f..a8bd8fd31 100644 --- a/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php +++ b/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php @@ -13,14 +13,13 @@ class RoutingScreen extends \Derivation public function mergeDataDerivation($post, $prepareInformation) { - $iPost = count($post); $aDataMerged = array(); $flagJumpTask = false; foreach ($prepareInformation as $key => $nextTask) { $aDataMerged[$key] = $nextTask['NEXT_TASK']; unset($aDataMerged[$key]['USER_ASSIGNED']); $aDataMerged[$key]['DEL_PRIORITY'] = ''; - for ($i = 1; $i <= $iPost; $i++) { + foreach ($post as $i => $item) { if(isset($post[$i]['SOURCE_UID']) && ($nextTask['NEXT_TASK']['TAS_UID'] === $post[$i]['SOURCE_UID']) && ($post[$i]['SOURCE_UID'] !== $post[$i]['TAS_UID'])){ $flagJumpTask = true; $aDataMerged[$key]['NEXT_ROUTING'][] = $post[$i];