From fdcd40e351028d61e65bea7004609672958b917e Mon Sep 17 00:00:00 2001 From: Julio Cesar Laura Date: Sun, 22 Nov 2015 13:43:30 -0400 Subject: [PATCH] PM-4137 --- workflow/engine/classes/class.derivation.php | 56 +++++++++++++++++-- workflow/engine/classes/model/BpmnFlow.php | 16 ++++++ workflow/engine/methods/cases/cases_Step.php | 3 + .../cases/cases_ScreenDerivation.html | 4 +- 4 files changed, 71 insertions(+), 8 deletions(-) diff --git a/workflow/engine/classes/class.derivation.php b/workflow/engine/classes/class.derivation.php index fa57411e4..6ad37ca7a 100755 --- a/workflow/engine/classes/class.derivation.php +++ b/workflow/engine/classes/class.derivation.php @@ -605,9 +605,6 @@ class Derivation break; case "MULTIPLE_INSTANCE": $userFields = $this->getUsersFullNameFromArray($this->getAllUsersFromAnyTask($nextAssignedTask["TAS_UID"])); - if(empty($userFields)){ - throw (new Exception( G::LoadTranslation( 'ID_NO_USERS' ) )); - } break; case "MULTIPLE_INSTANCE_VALUE_BASED": $arrayApplicationData = $this->case->loadCase($tasInfo["APP_UID"]); @@ -676,7 +673,7 @@ class Derivation * * @return void */ - private function throwEventsBetweenElementOriginAndElementDest($elementOriginUid, $elementDestUid, array $arrayApplicationData, $flagEventExecuteBeforeGateway = true, $flagEventExecuteAfterGateway = true) + private function throwEventsBetweenElementOriginAndElementDest($elementOriginUid, $elementDestUid, array $arrayApplicationData, $flagEventExecuteBeforeGateway = true, $flagEventExecuteAfterGateway = true, $rouCondition="") { try { //Verify if the Project is BPMN @@ -693,7 +690,7 @@ class Derivation "elementOrigin" => ["uid" => $elementOriginUid, "type" => "bpmnActivity"], "elementDest" => ["uid" => $elementDestUid, "type" => "bpmnActivity"] ]; - + foreach ($arrayElement as $key => $value) { $arrayElementTaskRelationData = $elementTaskRelation->getElementTaskRelationWhere( [ @@ -729,6 +726,10 @@ class Derivation $elementDestType ); + if($elementDestUid == "-1"){ + $arrayElement = $this->throwElementToEnd($elementOriginUid, $rouCondition); + } + foreach ($arrayElement as $value) { switch ($value[1]) { case "bpmnEvent": @@ -758,6 +759,48 @@ class Derivation } } + /** + * Throw all events to End Process + * + * @param string $currentTask Task uid + * + * @return void + */ + private function throwElementToEnd($currentTask, $routeCondition){ + try{ + $bpmnFlow = new BpmnFlow(); + $rsCriFlow = $bpmnFlow->getElementOriginToElementDest($currentTask); + $arrayElement = array(); + $count = 0; + $continue = false; + if($rsCriFlow->next()){ + $continue = true; + $row = $rsCriFlow->getRow(); + } + while ($continue) { + $array[0] = $row["FLO_ELEMENT_DEST"]; + $array[1] = $row["FLO_ELEMENT_DEST_TYPE"]; + $arrayElement[$count++] = $array; + $continue = false; + if($rsCriFlow->next()){ + $continue = true; + $row = $rsCriFlow->getRow(); + }else{ + $rsCriFlow = $bpmnFlow->getElementOriginToElementDest($row["FLO_ELEMENT_DEST"],$routeCondition); + $routeCondition = ''; + $continue = false; + if($rsCriFlow->next()){ + $continue = true; + $row = $rsCriFlow->getRow(); + } + } + } + return $arrayElement; + } catch (Exception $e) { + throw $e; + } + } + /** * Throw Events for the Case * @@ -800,6 +843,7 @@ class Derivation } } } + return $currentDestiny; } /** @@ -1018,7 +1062,7 @@ class Derivation //I think we need to change the APP_STATUS to completed, //BpmnEvent - $this->throwAllRouteInFlow($currentDelegation["TAS_UID"],$appFields); + $this->throwEventsBetweenElementOriginAndElementDest($currentDelegation["TAS_UID"], $nextDel["TAS_UID"], $appFields, $flagFirstIteration, true, $nextDel['ROU_CONDITION']); break; case TASK_FINISH_TASK: $iAppThreadIndex = $appFields['DEL_THREAD']; diff --git a/workflow/engine/classes/model/BpmnFlow.php b/workflow/engine/classes/model/BpmnFlow.php index d5bf44443..e7212372f 100755 --- a/workflow/engine/classes/model/BpmnFlow.php +++ b/workflow/engine/classes/model/BpmnFlow.php @@ -116,6 +116,22 @@ class BpmnFlow extends BaseBpmnFlow return $flow; } + + public static function getElementOriginToElementDest($floOrigin, $floCondition = ''){ + $criFlow = new Criteria("workflow"); + $criFlow->addSelectColumn(BpmnFlowPeer::FLO_ELEMENT_ORIGIN); + $criFlow->addSelectColumn(BpmnFlowPeer::FLO_ELEMENT_ORIGIN_TYPE); + $criFlow->addSelectColumn(BpmnFlowPeer::FLO_ELEMENT_DEST); + $criFlow->addSelectColumn(BpmnFlowPeer::FLO_ELEMENT_DEST_TYPE); + $criFlow->addSelectColumn(BpmnFlowPeer::FLO_CONDITION); + $criFlow->add(BpmnFlowPeer::FLO_ELEMENT_ORIGIN, $floOrigin, Criteria::EQUAL); + if($floCondition != ''){ + $criFlow->add(BpmnFlowPeer::FLO_CONDITION, $floCondition, Criteria::EQUAL); + } + $rsCriFlow = RoutePeer::doSelectRS($criFlow); + $rsCriFlow->setFetchmode(ResultSet::FETCHMODE_ASSOC); + return $rsCriFlow; + } /*public static function select($select, $where = array()) { diff --git a/workflow/engine/methods/cases/cases_Step.php b/workflow/engine/methods/cases/cases_Step.php index 26252d49d..2961a5817 100755 --- a/workflow/engine/methods/cases/cases_Step.php +++ b/workflow/engine/methods/cases/cases_Step.php @@ -984,6 +984,9 @@ try { $aFields['TASK'][$sKey]['NEXT_TASK']['ROU_PREVIOUS_TASK'] = ''; $aFields['TASK'][$sKey]['NEXT_TASK']['ROU_PREVIOUS_TYPE'] = ''; } + if(isset($aValues['ROU_CONDITION'])){ + $aFields['TASK'][$sKey]['NEXT_TASK']['ROU_CONDITION'] = ''; + } } } diff --git a/workflow/engine/templates/cases/cases_ScreenDerivation.html b/workflow/engine/templates/cases/cases_ScreenDerivation.html index 47732198d..638c82f42 100755 --- a/workflow/engine/templates/cases/cases_ScreenDerivation.html +++ b/workflow/engine/templates/cases/cases_ScreenDerivation.html @@ -7,7 +7,7 @@
-
+
@@ -148,7 +148,7 @@
- {$data.NEXT_TASK.TAS_ASSIGN_TYPE}{$data.NEXT_TASK.TAS_DEF_PROC_CODE}{$data.NEXT_TASK.DEL_PRIORITY}{$data.NEXT_TASK.TAS_PARENT}{$data.NEXT_TASK.ROU_PREVIOUS_TASK}{$data.NEXT_TASK.ROU_PREVIOUS_TYPE} + {$data.NEXT_TASK.TAS_ASSIGN_TYPE}{$data.NEXT_TASK.TAS_DEF_PROC_CODE}{$data.NEXT_TASK.DEL_PRIORITY}{$data.NEXT_TASK.TAS_PARENT}{$data.NEXT_TASK.ROU_PREVIOUS_TASK}{$data.NEXT_TASK.ROU_PREVIOUS_TYPE}{$data.NEXT_TASK.ROU_CONDITION}