From 86445b8626aa543d6f40bd0fd327dc5642f2ca09 Mon Sep 17 00:00:00 2001 From: Paula Quispe Date: Thu, 2 Mar 2017 16:30:01 -0400 Subject: [PATCH 01/13] HOR-2777 --- workflow/engine/classes/class.derivation.php | 39 ++++++++++++++++++- .../engine/methods/cases/cases_Derivate.php | 26 +++++++++++-- 2 files changed, 61 insertions(+), 4 deletions(-) diff --git a/workflow/engine/classes/class.derivation.php b/workflow/engine/classes/class.derivation.php index a753716c4..34cf240a7 100644 --- a/workflow/engine/classes/class.derivation.php +++ b/workflow/engine/classes/class.derivation.php @@ -1418,8 +1418,9 @@ class Derivation $application = new Application(); $result = $application->update(['APP_UID' => $currentDelegation['APP_UID'], 'APP_ROUTING_DATA' => serialize($arrayRoutingData)]); - //APP_THREAD + //We updated the information relate to APP_THREAD $iAppThreadIndex = $appFields['DEL_THREAD']; +<<<<<<< HEAD switch ($currentDelegation['ROU_TYPE']) { case 'PARALLEL': @@ -1432,6 +1433,20 @@ class Derivation $this->case->updateAppThread( $currentDelegation['APP_UID'], $iAppThreadIndex, $iNewDelIndex ); break; } //en switch +======= + if (isset($currentDelegation['ROUTE_TYPES']) && sizeof($currentDelegation['ROUTE_TYPES']) > 1) { + //If the next is more than one thread: Parallel or other + foreach ($currentDelegation['ROUTE_TYPES'] as $key => $value) { + if ($value['ROU_NEXT_TASK'] === $nextDel['TAS_UID']) { + $routeType = ($value['ROU_TYPE'] === 'EVALUATE') ? 'PARALLEL-AND-EXCLUSIVE' : $value['ROU_TYPE']; + $this->updateAppThread($routeType, $currentDelegation['APP_UID'], $iAppThreadIndex, $iNewDelIndex); + } + } + } else { + //If the next is a sequential derivation + $this->updateAppThread($currentDelegation['ROU_TYPE'], $currentDelegation['APP_UID'], $iAppThreadIndex, $iNewDelIndex); + } +>>>>>>> HOR-2777 //if there are subprocess to create if (isset( $aSP )) { @@ -1550,6 +1565,28 @@ class Derivation return $iNewDelIndex; } + /** + * This function create, update and closed a new record related to appThread + * + * Related to route type we can change the records in the APP_THREAD table + * @param string $routeType this variable recibe information about the derivation + * @return void + */ + function updateAppThread($routeType, $appUid, $iAppThreadIndex, $iNewDelIndex) { + switch ($routeType) { + case 'PARALLEL': + case 'PARALLEL-BY-EVALUATION': + case 'PARALLEL-AND-EXCLUSIVE': + $this->case->closeAppThread($appUid, $iAppThreadIndex); + $iNewThreadIndex = $this->case->newAppThread($appUid, $iNewDelIndex, $iAppThreadIndex); + $this->case->updateAppDelegation($appUid, $iNewDelIndex, $iNewThreadIndex); + break; + default: + $this->case->updateAppThread($appUid, $iAppThreadIndex, $iNewDelIndex); + break; + } + } + /* verifyIsCaseChild * * @param string $sApplicationUID diff --git a/workflow/engine/methods/cases/cases_Derivate.php b/workflow/engine/methods/cases/cases_Derivate.php index 00d88efe3..04b304ef0 100644 --- a/workflow/engine/methods/cases/cases_Derivate.php +++ b/workflow/engine/methods/cases/cases_Derivate.php @@ -126,14 +126,34 @@ try { $oCase->updateCase($_SESSION["APPLICATION"], $appFields); //Save data - //derivate case + //Prepare information for the derivation $oDerivation = new Derivation(); - $aCurrentDerivation = array ('APP_UID' => $_SESSION['APPLICATION'],'DEL_INDEX' => $_SESSION['INDEX'],'APP_STATUS' => $sStatus,'TAS_UID' => $_SESSION['TASK'],'ROU_TYPE' => $_POST['form']['ROU_TYPE'] + $aCurrentDerivation = array ( + 'APP_UID' => $_SESSION['APPLICATION'], + 'DEL_INDEX' => $_SESSION['INDEX'], + 'APP_STATUS' => $sStatus, + 'TAS_UID' => $_SESSION['TASK'], + 'ROU_TYPE' => $_POST['form']['ROU_TYPE'] ); - $aPInformation = $oDerivation->prepareInformation( array ('USER_UID' => $_SESSION['USER_LOGGED'],'APP_UID' => $_SESSION['APPLICATION'],'DEL_INDEX' => $_SESSION['INDEX']) + $aPInformation = $oDerivation->prepareInformation( + array ( + 'USER_UID' => $_SESSION['USER_LOGGED'], + 'APP_UID' => $_SESSION['APPLICATION'], + 'DEL_INDEX' => $_SESSION['INDEX'] + ) ); $oRoute = new \ProcessMaker\Core\RoutingScreen(); $nextTasks = $oRoute->mergeDataDerivation($_POST['form']['TASKS'], $aPInformation, $_POST['form']['ROU_TYPE']); + + //Get all route types + $aRouteTypes = array(); + foreach ($aPInformation as $key => $value) { + $aRouteTypes[$key]['ROU_NEXT_TASK'] = $value['ROU_NEXT_TASK']; + $aRouteTypes[$key]['ROU_TYPE'] = $value['ROU_TYPE']; + } + $aCurrentDerivation['ROUTE_TYPES'] = $aRouteTypes; + + //Derivate the case $arrayDerivationResult = $oDerivation->derivate($aCurrentDerivation, $nextTasks); if (!empty($arrayDerivationResult)) { From 5a777c23afbe61a1d49b32b87607b76160ceb5c9 Mon Sep 17 00:00:00 2001 From: Dante Date: Fri, 3 Mar 2017 10:20:59 -0400 Subject: [PATCH 02/13] HOR-2785 --- workflow/engine/classes/class.derivation.php | 2 +- workflow/engine/methods/cases/cases_Step.php | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/workflow/engine/classes/class.derivation.php b/workflow/engine/classes/class.derivation.php index 34cf240a7..5acc06749 100644 --- a/workflow/engine/classes/class.derivation.php +++ b/workflow/engine/classes/class.derivation.php @@ -269,7 +269,7 @@ class Derivation $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"]) + preg_match("/^(?:GATEWAYTOGATEWAY)$/", $arrayNextTaskData["NEXT_TASK"]["TAS_TYPE"]) ) { $arrayAux = $this->prepareInformation($arrayData, $arrayNextTaskData["NEXT_TASK"]["TAS_UID"]); $this->node[$value['ROU_NEXT_TASK']]['in'][$value['TAS_UID']] = $value['ROU_TYPE']; diff --git a/workflow/engine/methods/cases/cases_Step.php b/workflow/engine/methods/cases/cases_Step.php index 24f085044..461f014e3 100644 --- a/workflow/engine/methods/cases/cases_Step.php +++ b/workflow/engine/methods/cases/cases_Step.php @@ -1112,6 +1112,20 @@ try { $aFields["TASK"][$sKey]["NEXT_TASK"]["TAS_TITLE"] = G::LoadTranslation("ID_ROUTE_TO_TASK_INTERMEDIATE_CATCH_MESSAGE_EVENT"); } + + //in the case of an end event (message or mail) we need to show the end of process data in the + //routing screen. + if ( array_key_exists("TASK", $aFields) + && array_key_exists("1", $aFields["TASK"]) + && array_key_exists("NEXT_TASK", $aFields["TASK"]["1"]) + && array_key_exists("TAS_TYPE", $aFields["TASK"]["1"]["NEXT_TASK"]) + && preg_match("/^(?:END-MESSAGE-EVENT|END-EMAIL-EVENT)$/", $aFields["TASK"]["1"]["NEXT_TASK"]["TAS_TYPE"]) + ) { + $aFields["TASK"]["1"]["NEXT_TASK"]["TAS_TITLE"] = G::LoadTranslation( 'ID_END_OF_PROCESS' ); + $aFields["TASK"]["1"]["NEXT_TASK"]["USR_UID"] = " "; + $aFields["TASK"]["1"]["NEXT_TASK"]["USR_HIDDEN_FIELD"] = $_SESSION["USR_FULLNAME"]; + } + $G_PUBLISH->AddContent( 'smarty', $tplFile, '', '', $aFields ); /* if (isset( $aFields['TASK'][1]['NEXT_TASK']['USER_ASSIGNED'])){ From 0dbc337b26b08a553d4feb562a43845bcc1f865e Mon Sep 17 00:00:00 2001 From: Dante Date: Fri, 3 Mar 2017 15:11:04 -0400 Subject: [PATCH 03/13] Deletion of MAIL and MESSAGE end events from the list of task types that will jump the dummy task --- workflow/engine/classes/class.derivation.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflow/engine/classes/class.derivation.php b/workflow/engine/classes/class.derivation.php index 5acc06749..b3fe7c37a 100644 --- a/workflow/engine/classes/class.derivation.php +++ b/workflow/engine/classes/class.derivation.php @@ -59,7 +59,7 @@ class Derivation public function __construct() { $this->userLogged = new Users(); - $this->setRegexpTaskTypeToInclude("GATEWAYTOGATEWAY|END-MESSAGE-EVENT|END-EMAIL-EVENT"); + $this->setRegexpTaskTypeToInclude("GATEWAYTOGATEWAY"); } /** @@ -269,7 +269,7 @@ class Derivation $arrayNextTaskData = $value; $this->node[$value['TAS_UID']]['out'][$value['ROU_NEXT_TASK']] = $value['ROU_TYPE']; if ($arrayNextTaskData["NEXT_TASK"]["TAS_UID"] != "-1" && - preg_match("/^(?:GATEWAYTOGATEWAY)$/", $arrayNextTaskData["NEXT_TASK"]["TAS_TYPE"]) + preg_match("/^(?:" . $this->regexpTaskTypeToInclude . ")$/", $arrayNextTaskData["NEXT_TASK"]["TAS_TYPE"]) ) { $arrayAux = $this->prepareInformation($arrayData, $arrayNextTaskData["NEXT_TASK"]["TAS_UID"]); $this->node[$value['ROU_NEXT_TASK']]['in'][$value['TAS_UID']] = $value['ROU_TYPE']; From fa8aafe8c9c166d5b0d8554b72157907f5175b3b Mon Sep 17 00:00:00 2001 From: Paula Quispe Date: Fri, 3 Mar 2017 15:22:25 -0400 Subject: [PATCH 04/13] I added the validation for wsbase . --- workflow/engine/classes/class.derivation.php | 32 +++++++++++++++ workflow/engine/classes/class.wsBase.php | 40 ++++++++----------- .../engine/methods/cases/cases_Derivate.php | 30 ++++++-------- workflow/engine/methods/cases/cases_Step.php | 2 +- 4 files changed, 62 insertions(+), 42 deletions(-) diff --git a/workflow/engine/classes/class.derivation.php b/workflow/engine/classes/class.derivation.php index b3fe7c37a..bb1774625 100644 --- a/workflow/engine/classes/class.derivation.php +++ b/workflow/engine/classes/class.derivation.php @@ -832,6 +832,38 @@ class Derivation /*----------------------------------********---------------------------------*/ } + /** + * This function prepare the information before call the derivate function + * + * We can route a case from differents ways from cases_Derivate and derivateCase used in PMFDerivateCase + * before this we need to process the information + * + * @param array $aDataForPrepareInfo + * @param array $tasks + * @param string $rouType + * @param array $aCurrentDerivation + * @return array $arrayDerivationResult + */ + function beforeDerivate($aDataForPrepareInfo, $tasks, $rouType, $aCurrentDerivation) + { + $aPInformation = $this->prepareInformation($aDataForPrepareInfo); + $oRoute = new \ProcessMaker\Core\RoutingScreen(); + $nextTasks = $oRoute->mergeDataDerivation($tasks, $aPInformation, $rouType); + + //Get all route types + $aRouteTypes = array(); + foreach ($aPInformation as $key => $value) { + $aRouteTypes[$key]['ROU_NEXT_TASK'] = $value['ROU_NEXT_TASK']; + $aRouteTypes[$key]['ROU_TYPE'] = $value['ROU_TYPE']; + } + $aCurrentDerivation['ROUTE_TYPES'] = $aRouteTypes; + + //Derivate the case + $arrayDerivationResult = $this->derivate($aCurrentDerivation, $nextTasks); + + return $arrayDerivationResult; + } + /** Derivate * * @param array $currentDelegation diff --git a/workflow/engine/classes/class.wsBase.php b/workflow/engine/classes/class.wsBase.php index db292454e..7744da3b3 100644 --- a/workflow/engine/classes/class.wsBase.php +++ b/workflow/engine/classes/class.wsBase.php @@ -2268,10 +2268,6 @@ class wsBase $oPMScript = new PMScript(); foreach ($aTriggers as $aTrigger) { - //$appFields = $oCase->loadCase( $caseId ); - //$appFields['APP_DATA']['APPLICATION'] = $caseId; - - //Set variables $params = new stdClass(); $params->appData = $appFields["APP_DATA"]; @@ -2320,10 +2316,6 @@ class wsBase $oPMScript = new PMScript(); foreach ($aTriggers as $aTrigger) { - //$appFields = $oCase->loadCase( $caseId ); - //$appFields['APP_DATA']['APPLICATION'] = $caseId; - - //Set variables $params = new stdClass(); $params->appData = $appFields["APP_DATA"]; @@ -2416,12 +2408,6 @@ class wsBase $appFields['TAS_UID'] = $derive['TAS_UID']; } - //Save data - Start - //$appFields = $oCase->loadCase( $caseId ); - //$oCase->updateCase ( $caseId, $appFields ); - //Save data - End - - $row = array (); $oCriteria = new Criteria( 'workflow' ); $del = DBAdapter::getStringDelimiter(); @@ -2433,25 +2419,33 @@ class wsBase $oDataset->next(); while ($aRow = $oDataset->getRow()) { - $row[] = array ('ROU_TYPE' => $aRow['ROU_TYPE'],'ROU_NEXT_TASK' => $aRow['ROU_NEXT_TASK'] - ); + $row[] = array('ROU_TYPE' => $aRow['ROU_TYPE'], 'ROU_NEXT_TASK' => $aRow['ROU_NEXT_TASK']); $oDataset->next(); } - //derivate case - $aCurrentDerivation = array ('APP_UID' => $caseId,'DEL_INDEX' => $delIndex,'APP_STATUS' => $sStatus,'TAS_UID' => $appdel['TAS_UID'],'ROU_TYPE' => $row[0]['ROU_TYPE'] + $aCurrentDerivation = array ( + 'APP_UID' => $caseId, + 'DEL_INDEX' => $delIndex, + 'APP_STATUS' => $sStatus, + 'TAS_UID' => $appdel['TAS_UID'], + 'ROU_TYPE' => $row[0]['ROU_TYPE'] ); - $oRoute = new \ProcessMaker\Core\RoutingScreen(); - $nextTasks = $oRoute->mergeDataDerivation($nextDelegations, $oDerivation->prepareInformation($aData), $row[0]['ROU_TYPE']); - $oDerivation->derivate( $aCurrentDerivation, $nextTasks ); + + //We define some parameters in the before the derivation + //Then this function will be route the case + $oDerivation->beforeDerivate( + $aData, + $nextDelegations, + $row[0]['ROU_TYPE'], + $aCurrentDerivation + ); + $appFields = $oCase->loadCase( $caseId ); //Execute triggers after derivation $aTriggers = $oCase->loadTriggers( $appdel['TAS_UID'], 'ASSIGN_TASK', - 2, 'AFTER' ); if (count( $aTriggers ) > 0) { - //$appFields['APP_DATA']['APPLICATION'] = $caseId; - //Set variables $params = new stdClass(); diff --git a/workflow/engine/methods/cases/cases_Derivate.php b/workflow/engine/methods/cases/cases_Derivate.php index 04b304ef0..b7fee6e51 100644 --- a/workflow/engine/methods/cases/cases_Derivate.php +++ b/workflow/engine/methods/cases/cases_Derivate.php @@ -135,26 +135,20 @@ try { 'TAS_UID' => $_SESSION['TASK'], 'ROU_TYPE' => $_POST['form']['ROU_TYPE'] ); - $aPInformation = $oDerivation->prepareInformation( - array ( - 'USER_UID' => $_SESSION['USER_LOGGED'], - 'APP_UID' => $_SESSION['APPLICATION'], - 'DEL_INDEX' => $_SESSION['INDEX'] - ) + $aDataForPrepareInfo = array ( + 'USER_UID' => $_SESSION['USER_LOGGED'], + 'APP_UID' => $_SESSION['APPLICATION'], + 'DEL_INDEX' => $_SESSION['INDEX'] ); - $oRoute = new \ProcessMaker\Core\RoutingScreen(); - $nextTasks = $oRoute->mergeDataDerivation($_POST['form']['TASKS'], $aPInformation, $_POST['form']['ROU_TYPE']); - //Get all route types - $aRouteTypes = array(); - foreach ($aPInformation as $key => $value) { - $aRouteTypes[$key]['ROU_NEXT_TASK'] = $value['ROU_NEXT_TASK']; - $aRouteTypes[$key]['ROU_TYPE'] = $value['ROU_TYPE']; - } - $aCurrentDerivation['ROUTE_TYPES'] = $aRouteTypes; - - //Derivate the case - $arrayDerivationResult = $oDerivation->derivate($aCurrentDerivation, $nextTasks); + //We define some parameters in the before the derivation + //Then this function will be route the case + $arrayDerivationResult = $oDerivation->beforeDerivate( + $aDataForPrepareInfo, + $_POST['form']['TASKS'], + $_POST['form']['ROU_TYPE'], + $aCurrentDerivation + ); if (!empty($arrayDerivationResult)) { foreach ($_POST['form']['TASKS'] as $key => $value) { diff --git a/workflow/engine/methods/cases/cases_Step.php b/workflow/engine/methods/cases/cases_Step.php index 461f014e3..08b716440 100644 --- a/workflow/engine/methods/cases/cases_Step.php +++ b/workflow/engine/methods/cases/cases_Step.php @@ -826,7 +826,7 @@ try { throw (new Exception( G::LoadTranslation( 'ID_NO_DERIVATION_RULE' ) )); } - //take the first derivation rule as the task derivation rule type. + //Take the first derivation rule as the task derivation rule type. $aFields['PROCESS']['ROU_TYPE'] = $aFields['TASK'][1]['ROU_TYPE']; $aFields['PROCESS']['ROU_FINISH_FLAG'] = false; From 44fdaa697ce23c3a4b78283b9f009136ec6568c7 Mon Sep 17 00:00:00 2001 From: Dante Date: Fri, 3 Mar 2017 16:42:18 -0400 Subject: [PATCH 05/13] Removing changes for adapting the routing screen. --- workflow/engine/methods/cases/cases_Step.php | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/workflow/engine/methods/cases/cases_Step.php b/workflow/engine/methods/cases/cases_Step.php index 08b716440..2acaed9fb 100644 --- a/workflow/engine/methods/cases/cases_Step.php +++ b/workflow/engine/methods/cases/cases_Step.php @@ -1112,20 +1112,6 @@ try { $aFields["TASK"][$sKey]["NEXT_TASK"]["TAS_TITLE"] = G::LoadTranslation("ID_ROUTE_TO_TASK_INTERMEDIATE_CATCH_MESSAGE_EVENT"); } - - //in the case of an end event (message or mail) we need to show the end of process data in the - //routing screen. - if ( array_key_exists("TASK", $aFields) - && array_key_exists("1", $aFields["TASK"]) - && array_key_exists("NEXT_TASK", $aFields["TASK"]["1"]) - && array_key_exists("TAS_TYPE", $aFields["TASK"]["1"]["NEXT_TASK"]) - && preg_match("/^(?:END-MESSAGE-EVENT|END-EMAIL-EVENT)$/", $aFields["TASK"]["1"]["NEXT_TASK"]["TAS_TYPE"]) - ) { - $aFields["TASK"]["1"]["NEXT_TASK"]["TAS_TITLE"] = G::LoadTranslation( 'ID_END_OF_PROCESS' ); - $aFields["TASK"]["1"]["NEXT_TASK"]["USR_UID"] = " "; - $aFields["TASK"]["1"]["NEXT_TASK"]["USR_HIDDEN_FIELD"] = $_SESSION["USR_FULLNAME"]; - } - $G_PUBLISH->AddContent( 'smarty', $tplFile, '', '', $aFields ); /* if (isset( $aFields['TASK'][1]['NEXT_TASK']['USER_ASSIGNED'])){ From ed4c13bab8d0b18c31c8e48fa6b2b753ea0b67e4 Mon Sep 17 00:00:00 2001 From: Paula Quispe Date: Mon, 6 Mar 2017 18:08:16 -0400 Subject: [PATCH 06/13] I solved the QA observations --- workflow/engine/classes/class.derivation.php | 22 +++++--------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/workflow/engine/classes/class.derivation.php b/workflow/engine/classes/class.derivation.php index bb1774625..9b24078a6 100644 --- a/workflow/engine/classes/class.derivation.php +++ b/workflow/engine/classes/class.derivation.php @@ -1452,34 +1452,22 @@ class Derivation //We updated the information relate to APP_THREAD $iAppThreadIndex = $appFields['DEL_THREAD']; -<<<<<<< HEAD - - switch ($currentDelegation['ROU_TYPE']) { - case 'PARALLEL': - case 'PARALLEL-BY-EVALUATION': - $this->case->closeAppThread( $currentDelegation['APP_UID'], $iAppThreadIndex ); - $iNewThreadIndex = $this->case->newAppThread( $currentDelegation['APP_UID'], $iNewDelIndex, $iAppThreadIndex ); - $this->case->updateAppDelegation( $currentDelegation['APP_UID'], $iNewDelIndex, $iNewThreadIndex, $appFields['APP_NUMBER'] ); - break; - default: - $this->case->updateAppThread( $currentDelegation['APP_UID'], $iAppThreadIndex, $iNewDelIndex ); - break; - } //en switch -======= + $isUpdatedThread = false; if (isset($currentDelegation['ROUTE_TYPES']) && sizeof($currentDelegation['ROUTE_TYPES']) > 1) { //If the next is more than one thread: Parallel or other foreach ($currentDelegation['ROUTE_TYPES'] as $key => $value) { if ($value['ROU_NEXT_TASK'] === $nextDel['TAS_UID']) { + $isUpdatedThread = true; $routeType = ($value['ROU_TYPE'] === 'EVALUATE') ? 'PARALLEL-AND-EXCLUSIVE' : $value['ROU_TYPE']; $this->updateAppThread($routeType, $currentDelegation['APP_UID'], $iAppThreadIndex, $iNewDelIndex); } } - } else { + } + if (!$isUpdatedThread) { //If the next is a sequential derivation $this->updateAppThread($currentDelegation['ROU_TYPE'], $currentDelegation['APP_UID'], $iAppThreadIndex, $iNewDelIndex); } ->>>>>>> HOR-2777 - + //if there are subprocess to create if (isset( $aSP )) { //Check if is Selfservice the task in the subprocess From 17fc4dd9fd326bcc4161465a908aa9964261f815 Mon Sep 17 00:00:00 2001 From: "Marco A. Nina Mena" Date: Wed, 8 Mar 2017 11:39:32 -0400 Subject: [PATCH 07/13] HOR-2811 Parallel Task does not wait for all users to complete before continuing to next event in process - Add validation in derivation case END-EMAIL-EVENT. --- workflow/engine/classes/class.derivation.php | 4 ++-- workflow/engine/methods/cases/cases_Step.php | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/workflow/engine/classes/class.derivation.php b/workflow/engine/classes/class.derivation.php index 9b24078a6..a6d883abd 100644 --- a/workflow/engine/classes/class.derivation.php +++ b/workflow/engine/classes/class.derivation.php @@ -59,7 +59,7 @@ class Derivation public function __construct() { $this->userLogged = new Users(); - $this->setRegexpTaskTypeToInclude("GATEWAYTOGATEWAY"); + $this->setRegexpTaskTypeToInclude("GATEWAYTOGATEWAY|END-MESSAGE-EVENT|END-EMAIL-EVENT"); } /** @@ -269,7 +269,7 @@ class Derivation $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"]) + preg_match("/^(?:" . $this->regexpTaskTypeToInclude . ")$/", $arrayNextTaskData["NEXT_TASK"]["TAS_TYPE"]) && $arrayNextTaskData['ROU_TYPE'] != "SEC-JOIN" ) { $arrayAux = $this->prepareInformation($arrayData, $arrayNextTaskData["NEXT_TASK"]["TAS_UID"]); $this->node[$value['ROU_NEXT_TASK']]['in'][$value['TAS_UID']] = $value['ROU_TYPE']; diff --git a/workflow/engine/methods/cases/cases_Step.php b/workflow/engine/methods/cases/cases_Step.php index 2acaed9fb..1f451018c 100644 --- a/workflow/engine/methods/cases/cases_Step.php +++ b/workflow/engine/methods/cases/cases_Step.php @@ -1106,12 +1106,19 @@ try { $title = htmlentities($aFields['TASK'][$sKey]['NEXT_TASK']['TAS_TITLE'], ENT_QUOTES, 'UTF-8'); $aFields['TASK'][$sKey]['NEXT_TASK']['TAS_TITLE'] = $title; + //todo These two conditions must go to the RoutingScreen class if (!preg_match("/\-1$/", $aFields["TASK"][$sKey]["NEXT_TASK"]["TAS_UID"]) && $aFields["TASK"][$sKey]["NEXT_TASK"]["TAS_TYPE"] == "INTERMEDIATE-CATCH-MESSAGE-EVENT" ) { $aFields["TASK"][$sKey]["NEXT_TASK"]["TAS_TITLE"] = G::LoadTranslation("ID_ROUTE_TO_TASK_INTERMEDIATE_CATCH_MESSAGE_EVENT"); } + if ($aFields["TASK"][$sKey]['NEXT_TASK']["TAS_TYPE"] === "END-EMAIL-EVENT" || $aFields["TASK"][$sKey]['NEXT_TASK']["TAS_TYPE"] === "END-MESSAGE-EVENT") { + $aFields["TASK"][$sKey]["NEXT_TASK"]["TAS_TITLE"] = G::LoadTranslation("ID_END_OF_PROCESS"); + $aFields["TASK"][$sKey]["NEXT_TASK"]["USR_UID"] = $_SESSION['USER_FULLNAME']; + $aFields["TASK"][$sKey]["NEXT_TASK"]["USR_USERNAME"] = $_SESSION['USER_FULLNAME']; + } + $G_PUBLISH->AddContent( 'smarty', $tplFile, '', '', $aFields ); /* if (isset( $aFields['TASK'][1]['NEXT_TASK']['USER_ASSIGNED'])){ From bfeaa4ee49fc99700c94996974e4e81cbef13b75 Mon Sep 17 00:00:00 2001 From: "Marco A. Nina Mena" Date: Wed, 8 Mar 2017 14:03:20 -0400 Subject: [PATCH 08/13] Change name variable --- workflow/engine/methods/cases/cases_Step.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflow/engine/methods/cases/cases_Step.php b/workflow/engine/methods/cases/cases_Step.php index 1f451018c..485380726 100644 --- a/workflow/engine/methods/cases/cases_Step.php +++ b/workflow/engine/methods/cases/cases_Step.php @@ -1115,8 +1115,8 @@ try { if ($aFields["TASK"][$sKey]['NEXT_TASK']["TAS_TYPE"] === "END-EMAIL-EVENT" || $aFields["TASK"][$sKey]['NEXT_TASK']["TAS_TYPE"] === "END-MESSAGE-EVENT") { $aFields["TASK"][$sKey]["NEXT_TASK"]["TAS_TITLE"] = G::LoadTranslation("ID_END_OF_PROCESS"); - $aFields["TASK"][$sKey]["NEXT_TASK"]["USR_UID"] = $_SESSION['USER_FULLNAME']; - $aFields["TASK"][$sKey]["NEXT_TASK"]["USR_USERNAME"] = $_SESSION['USER_FULLNAME']; + $aFields["TASK"][$sKey]["NEXT_TASK"]["USR_UID"] = $_SESSION['USR_FULLNAME']; + $aFields["TASK"][$sKey]["NEXT_TASK"]["USR_USERNAME"] = $_SESSION['USR_FULLNAME']; } $G_PUBLISH->AddContent( 'smarty', $tplFile, '', '', $aFields ); From 6ed88ec66fac44a32c9d0e88182d1d30852883ed Mon Sep 17 00:00:00 2001 From: "Marco A. Nina Mena" Date: Wed, 8 Mar 2017 14:30:28 -0400 Subject: [PATCH 09/13] Add comment --- workflow/engine/methods/cases/cases_Step.php | 1 + 1 file changed, 1 insertion(+) diff --git a/workflow/engine/methods/cases/cases_Step.php b/workflow/engine/methods/cases/cases_Step.php index 485380726..1ae259851 100644 --- a/workflow/engine/methods/cases/cases_Step.php +++ b/workflow/engine/methods/cases/cases_Step.php @@ -1115,6 +1115,7 @@ try { if ($aFields["TASK"][$sKey]['NEXT_TASK']["TAS_TYPE"] === "END-EMAIL-EVENT" || $aFields["TASK"][$sKey]['NEXT_TASK']["TAS_TYPE"] === "END-MESSAGE-EVENT") { $aFields["TASK"][$sKey]["NEXT_TASK"]["TAS_TITLE"] = G::LoadTranslation("ID_END_OF_PROCESS"); + //Value of $aFields["TASK"][$sKey]["NEXT_TASK"]["USR_UID"] is not used in template. $aFields["TASK"][$sKey]["NEXT_TASK"]["USR_UID"] = $_SESSION['USR_FULLNAME']; $aFields["TASK"][$sKey]["NEXT_TASK"]["USR_USERNAME"] = $_SESSION['USR_FULLNAME']; } From 2fb570c2ac0168e4ba717128a34a2d17910c6471 Mon Sep 17 00:00:00 2001 From: "Marco A. Nina Mena" Date: Wed, 8 Mar 2017 16:49:42 -0400 Subject: [PATCH 10/13] Add validation if not exist element TAS_TYPE --- workflow/engine/methods/cases/cases_Step.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/workflow/engine/methods/cases/cases_Step.php b/workflow/engine/methods/cases/cases_Step.php index 1ae259851..e66fed660 100644 --- a/workflow/engine/methods/cases/cases_Step.php +++ b/workflow/engine/methods/cases/cases_Step.php @@ -1113,9 +1113,11 @@ try { $aFields["TASK"][$sKey]["NEXT_TASK"]["TAS_TITLE"] = G::LoadTranslation("ID_ROUTE_TO_TASK_INTERMEDIATE_CATCH_MESSAGE_EVENT"); } - if ($aFields["TASK"][$sKey]['NEXT_TASK']["TAS_TYPE"] === "END-EMAIL-EVENT" || $aFields["TASK"][$sKey]['NEXT_TASK']["TAS_TYPE"] === "END-MESSAGE-EVENT") { + if (!empty($aFields["TASK"][$sKey]['NEXT_TASK']["TAS_TYPE"]) && + ($aFields["TASK"][$sKey]['NEXT_TASK']["TAS_TYPE"] === "END-EMAIL-EVENT" || $aFields["TASK"][$sKey]['NEXT_TASK']["TAS_TYPE"] === "END-MESSAGE-EVENT") + ) { $aFields["TASK"][$sKey]["NEXT_TASK"]["TAS_TITLE"] = G::LoadTranslation("ID_END_OF_PROCESS"); - //Value of $aFields["TASK"][$sKey]["NEXT_TASK"]["USR_UID"] is not used in template. + //Value of $aFields["TASK"][$sKey]["NEXT_TASK"]["USR_UID"] is not used in routing template when is an end event. $aFields["TASK"][$sKey]["NEXT_TASK"]["USR_UID"] = $_SESSION['USR_FULLNAME']; $aFields["TASK"][$sKey]["NEXT_TASK"]["USR_USERNAME"] = $_SESSION['USR_FULLNAME']; } From aac96f15353a7cd97beecf7b4661610a61808508 Mon Sep 17 00:00:00 2001 From: Dante Date: Thu, 9 Mar 2017 15:56:58 -0400 Subject: [PATCH 11/13] HOR-2828 --- workflow/engine/classes/class.case.php | 29 ++++++++++++++++++++ workflow/engine/classes/class.derivation.php | 15 ++++++++++ 2 files changed, 44 insertions(+) diff --git a/workflow/engine/classes/class.case.php b/workflow/engine/classes/class.case.php index b069420d4..be9b5ef3c 100644 --- a/workflow/engine/classes/class.case.php +++ b/workflow/engine/classes/class.case.php @@ -1225,6 +1225,35 @@ class Cases } } + + /* + * Determines if the all threads of a multiinstance task are closed + * + * @$appUid string appUid of the instance to be tested + * @$tasUid string task uid of the multiinstance task + * @$previousDelIndex int previous del index of the instance corresponding to the multiinstance task + */ + + public function multiInstanceIsCompleted($appUid, $tasUid, $previousDelIndex) + { + try { + $c = new Criteria(); + $c->clearSelectColumns(); + $c->addSelectColumn('COUNT(*)'); + $c->add(AppDelegationPeer::APP_UID, $appUid); + $c->add(AppDelegationPeer::TAS_UID, $tasUid); + $c->add(AppDelegationPeer::DEL_PREVIOUS, $previousDelIndex); + $c->add(AppDelegationPeer::DEL_THREAD_STATUS, 'OPEN'); + $rs = AppDelegationPeer::doSelectRs($c); + $rs->next(); + $row = $rs->getRow(); + //if no open threads exists, the multiinstance is completes + return intval($row[0]) === 0; + } catch (exception $e) { + throw ($e); + } + } + /* * GetOpenThreads * diff --git a/workflow/engine/classes/class.derivation.php b/workflow/engine/classes/class.derivation.php index a6d883abd..a320848ae 100644 --- a/workflow/engine/classes/class.derivation.php +++ b/workflow/engine/classes/class.derivation.php @@ -1003,12 +1003,27 @@ class Derivation case TASK_FINISH_TASK: $iAppThreadIndex = $appFields['DEL_THREAD']; $this->case->closeAppThread($currentDelegation['APP_UID'], $iAppThreadIndex); + if (isset($nextDel["TAS_UID_DUMMY"]) && !$flagTaskAssignTypeIsMultipleInstance) { $taskDummy = TaskPeer::retrieveByPK($nextDel["TAS_UID_DUMMY"]); if (preg_match("/^(?:END-MESSAGE-EVENT|END-EMAIL-EVENT)$/", $taskDummy->getTasType())) { $this->executeEvent($nextDel["TAS_UID_DUMMY"], $appFields, $flagFirstIteration, true); } } + + //if the next task is an end event and the multiinstance threads are finished the end event + //is triggered: + if (isset($nextDel["TAS_UID_DUMMY"]) && $flagTaskAssignTypeIsMultipleInstance) { + $taskDummy = TaskPeer::retrieveByPK($nextDel["TAS_UID_DUMMY"]); + $currentDeltegionAllData = AppDelegationPeer::retrieveByPK($currentDelegation['APP_UID'], $currentDelegation['DEL_INDEX']); + if ($this->case->multiInstanceIsCompleted($currentDeltegionAllData->getAppUid(), + $currentDeltegionAllData->getTasUid(), + $currentDeltegionAllData->getDelPrevious() + && preg_match("/^(?:END-MESSAGE-EVENT|END-EMAIL-EVENT)$/", $taskDummy->getTasType()))) { + $this->executeEvent($nextDel["TAS_UID_DUMMY"], $appFields, $flagFirstIteration, true); + } + } + $this->case->closeAppThread($currentDelegation['APP_UID'], $iAppThreadIndex); $aContext['action'] = 'finish-task'; //Logger From 86eb058f156183105e18fd0e5c8e42407ed1acec Mon Sep 17 00:00:00 2001 From: Dante Date: Thu, 9 Mar 2017 17:34:51 -0400 Subject: [PATCH 12/13] CR corrections --- workflow/engine/classes/class.case.php | 13 ++++++++----- workflow/engine/classes/class.derivation.php | 9 ++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/workflow/engine/classes/class.case.php b/workflow/engine/classes/class.case.php index be9b5ef3c..2d7217017 100644 --- a/workflow/engine/classes/class.case.php +++ b/workflow/engine/classes/class.case.php @@ -1236,19 +1236,22 @@ class Cases public function multiInstanceIsCompleted($appUid, $tasUid, $previousDelIndex) { + $result = false; try { $c = new Criteria(); $c->clearSelectColumns(); - $c->addSelectColumn('COUNT(*)'); $c->add(AppDelegationPeer::APP_UID, $appUid); $c->add(AppDelegationPeer::TAS_UID, $tasUid); $c->add(AppDelegationPeer::DEL_PREVIOUS, $previousDelIndex); $c->add(AppDelegationPeer::DEL_THREAD_STATUS, 'OPEN'); $rs = AppDelegationPeer::doSelectRs($c); - $rs->next(); - $row = $rs->getRow(); - //if no open threads exists, the multiinstance is completes - return intval($row[0]) === 0; + + if ($rs->next()) { + $result = false; + } else { + $result = true; + } + } catch (exception $e) { throw ($e); } diff --git a/workflow/engine/classes/class.derivation.php b/workflow/engine/classes/class.derivation.php index a320848ae..a67fc0ed6 100644 --- a/workflow/engine/classes/class.derivation.php +++ b/workflow/engine/classes/class.derivation.php @@ -1015,11 +1015,10 @@ class Derivation //is triggered: if (isset($nextDel["TAS_UID_DUMMY"]) && $flagTaskAssignTypeIsMultipleInstance) { $taskDummy = TaskPeer::retrieveByPK($nextDel["TAS_UID_DUMMY"]); - $currentDeltegionAllData = AppDelegationPeer::retrieveByPK($currentDelegation['APP_UID'], $currentDelegation['DEL_INDEX']); - if ($this->case->multiInstanceIsCompleted($currentDeltegionAllData->getAppUid(), - $currentDeltegionAllData->getTasUid(), - $currentDeltegionAllData->getDelPrevious() - && preg_match("/^(?:END-MESSAGE-EVENT|END-EMAIL-EVENT)$/", $taskDummy->getTasType()))) { + if ($this->case->multiInstanceIsCompleted($appFields['APP_UID'], + $appFields['TAS_UID'], + $appFields['DEL_PREVIOUS']) + && preg_match("/^(?:END-MESSAGE-EVENT|END-EMAIL-EVENT)$/", $taskDummy->getTasType())) { $this->executeEvent($nextDel["TAS_UID_DUMMY"], $appFields, $flagFirstIteration, true); } } From 09d6f3a94d56cca354ef507a7df0436caed29507 Mon Sep 17 00:00:00 2001 From: Dante Date: Thu, 9 Mar 2017 17:44:22 -0400 Subject: [PATCH 13/13] adding deleted finally code in try catch --- workflow/engine/classes/class.case.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/workflow/engine/classes/class.case.php b/workflow/engine/classes/class.case.php index 2d7217017..cce1a7c42 100644 --- a/workflow/engine/classes/class.case.php +++ b/workflow/engine/classes/class.case.php @@ -1254,6 +1254,8 @@ class Cases } catch (exception $e) { throw ($e); + } finally { + return $result; } }