diff --git a/workflow/engine/classes/class.case.php b/workflow/engine/classes/class.case.php index 73669f7a4..6746576c1 100755 --- a/workflow/engine/classes/class.case.php +++ b/workflow/engine/classes/class.case.php @@ -1973,6 +1973,7 @@ class Cases public function CloseCurrentDelegation($sAppUid, $iDelIndex) { try { + $oApplication = ApplicationPeer::retrieveByPk($sAppUid); $c = new Criteria(); $c->add(AppDelegationPeer::APP_UID, $sAppUid); $c->add(AppDelegationPeer::DEL_INDEX, $iDelIndex); @@ -1991,6 +1992,18 @@ class Cases } throw (new PropelException('The row cannot be created!', new PropelException($msg))); } + $taskNext = TaskPeer::retrieveByPK($appDel->getTasUid()); + if($taskNext->getTasType() == 'NORMAL'){ + if($oApplication->getAppStatus() == "DRAFT"){ + $sUserUid = $appDel->getUsrUid(); + $users = new Users(); + $users->refreshTotal($sUserUid, "remove", "draft"); + }else{ + $sUserUid = $appDel->getUsrUid(); + $users = new Users(); + $users->refreshTotal($sUserUid, "remove", "inbox"); + } + } } /*----------------------------------********---------------------------------*/ $inbox = new ListInbox(); diff --git a/workflow/engine/classes/class.derivation.php b/workflow/engine/classes/class.derivation.php index 7f7adcba9..a75894031 100755 --- a/workflow/engine/classes/class.derivation.php +++ b/workflow/engine/classes/class.derivation.php @@ -630,6 +630,99 @@ class Derivation } } + /** + * Throw Events for the Case + * + * @param string $elementOriginUid Unique id of Element Origin (unique id of Task) + * @param string $elementDestUid Unique id of Element Destination (unique id of Task) + * @param array $arrayApplicationData Case data + * @param bool $flagEventExecuteBeforeGateway Execute event before gateway + * @param bool $flagEventExecuteAfterGateway Execute event after gateway + * + * @return void + */ + private function throwEventsBetweenElementOriginAndElementDest($elementOriginUid, $elementDestUid, array $arrayApplicationData, $flagEventExecuteBeforeGateway = true, $flagEventExecuteAfterGateway = true) + { + try { + //Verify if the Project is BPMN + $bpmn = new \ProcessMaker\Project\Bpmn(); + + if (!$bpmn->exists($arrayApplicationData["PRO_UID"])) { + return; + } + + //Element origin and dest + $elementTaskRelation = new \ProcessMaker\BusinessModel\ElementTaskRelation(); + + $arrayElement = [ + "elementOrigin" => ["uid" => $elementOriginUid, "type" => "bpmnActivity"], + "elementDest" => ["uid" => $elementDestUid, "type" => "bpmnActivity"] + ]; + + foreach ($arrayElement as $key => $value) { + $arrayElementTaskRelationData = $elementTaskRelation->getElementTaskRelationWhere( + [ + ElementTaskRelationPeer::PRJ_UID => $arrayApplicationData["PRO_UID"], + ElementTaskRelationPeer::ELEMENT_TYPE => "bpmnEvent", + ElementTaskRelationPeer::TAS_UID => $arrayElement[$key]["uid"] + ], + true + ); + + if (!is_null($arrayElementTaskRelationData)) { + $arrayElement[$key]["uid"] = $arrayElementTaskRelationData["ELEMENT_UID"]; + $arrayElement[$key]["type"] = "bpmnEvent"; + } + } + + $elementOriginUid = $arrayElement["elementOrigin"]["uid"]; + $elementOriginType = $arrayElement["elementOrigin"]["type"]; + $elementDestUid = $arrayElement["elementDest"]["uid"]; + $elementDestType = $arrayElement["elementDest"]["type"]; + + //Throw Events + $messageApplication = new \ProcessMaker\BusinessModel\MessageApplication(); + $emailEvent = new \ProcessMaker\BusinessModel\EmailEvent(); + + $arrayEventExecute = ["BEFORE" => $flagEventExecuteBeforeGateway, "AFTER" => $flagEventExecuteAfterGateway]; + $positionEventExecute = "BEFORE"; + + $arrayElement = $bpmn->getElementsBetweenElementOriginAndElementDest( + $elementOriginUid, + $elementOriginType, + $elementDestUid, + $elementDestType + ); + + foreach ($arrayElement as $value) { + switch ($value[1]) { + case "bpmnEvent": + if ($arrayEventExecute[$positionEventExecute]) { + $event = \BpmnEventPeer::retrieveByPK($value[0]); + + if (!is_null($event)) { + if (preg_match("/^(?:END|INTERMEDIATE)$/", $event->getEvnType()) && $event->getEvnMarker() == "MESSAGETHROW") { + //Message-Application throw + $result = $messageApplication->create($arrayApplicationData["APP_UID"], $arrayApplicationData["PRO_UID"], $value[0], $arrayApplicationData); + } + + if (preg_match("/^(?:END|INTERMEDIATE)$/", $event->getEvnType()) && $event->getEvnMarker() == "EMAIL") { + //Email-Event throw + $result = $emailEvent->sendEmail($arrayApplicationData["APP_UID"], $arrayApplicationData["PRO_UID"], $value[0], $arrayApplicationData); + } + } + } + break; + case "bpmnGateway": + $positionEventExecute = "AFTER"; + break; + } + } + } catch (Exception $e) { + throw $e; + } + } + /** * Update counters * @@ -653,9 +746,9 @@ class Derivation $application = ApplicationPeer::retrieveByPK($arrayApplicationData["APP_UID"]); if ($application->getAppStatus() == "DRAFT") { - $user->refreshTotal($arrayApplicationData["CURRENT_USER_UID"], "remove", "draft"); + //$user->refreshTotal($arrayApplicationData["CURRENT_USER_UID"], "remove", "draft"); } else { - $user->refreshTotal($arrayApplicationData["CURRENT_USER_UID"], "remove", "inbox"); + //$user->refreshTotal($arrayApplicationData["CURRENT_USER_UID"], "remove", "inbox"); } } else { if ($arrayNextDelegationData["TAS_UID"] != "-1") { @@ -683,9 +776,9 @@ class Derivation $application = ApplicationPeer::retrieveByPK($arrayApplicationData["APP_UID"]); if ($application->getAppStatus() == "DRAFT") { - $user->refreshTotal($arrayApplicationData["CURRENT_USER_UID"], "remove", "draft"); + //$user->refreshTotal($arrayApplicationData["CURRENT_USER_UID"], "remove", "draft"); } else { - $user->refreshTotal($arrayApplicationData["CURRENT_USER_UID"], "remove", "inbox"); + //$user->refreshTotal($arrayApplicationData["CURRENT_USER_UID"], "remove", "inbox"); } } } @@ -694,9 +787,9 @@ class Derivation $application = ApplicationPeer::retrieveByPK($arrayApplicationData["APP_UID"]); if ($application->getAppStatus() == "DRAFT") { - $user->refreshTotal($arrayApplicationData["CURRENT_USER_UID"], "remove", "draft"); + //$user->refreshTotal($arrayApplicationData["CURRENT_USER_UID"], "remove", "draft"); } else { - $user->refreshTotal($arrayApplicationData["CURRENT_USER_UID"], "remove", "inbox"); + //$user->refreshTotal($arrayApplicationData["CURRENT_USER_UID"], "remove", "inbox"); } } } @@ -728,9 +821,6 @@ class Derivation $this->case = new cases(); - $messageApplication = new \ProcessMaker\BusinessModel\MessageApplication(); - $emailEvent = new \ProcessMaker\BusinessModel\EmailEvent(); - //Get data for this DEL_INDEX current $appFields = $this->case->loadCase( $currentDelegation['APP_UID'], $currentDelegation['DEL_INDEX'] ); @@ -811,19 +901,13 @@ class Derivation $this->case->closeAllThreads( $currentDelegation['APP_UID'] ); //I think we need to change the APP_STATUS to completed, - //BpmnEvent - END-MESSAGE-EVENT, END-EMAIL-EVENT + //BpmnEvent if (isset($nextDel["TAS_UID_DUMMY"])) { $taskDummy = TaskPeer::retrieveByPK($nextDel["TAS_UID_DUMMY"]); - switch ($taskDummy->getTasType()) { - case "END-MESSAGE-EVENT": - //Throw Message-Events - BpmnEvent - END-MESSAGE-EVENT - $messageApplication->throwMessageEventBetweenElementOriginAndElementDest($currentDelegation["TAS_UID"], $nextDel["TAS_UID_DUMMY"], $appFields, $flagFirstIteration, true); - break; - case "END-EMAIL-EVENT": - //Throw Email-Events - BpmnEvent - END-EMAIL-EVENT - $emailEvent->emailEventBetweenElementOriginAndElementDest($currentDelegation["TAS_UID"], $nextDel["TAS_UID_DUMMY"], $appFields, $flagFirstIteration, true); - break; + if (preg_match("/^(?:END-MESSAGE-EVENT|END-EMAIL-EVENT)$/", $taskDummy->getEvnType())) { + //Throw Events + $this->throwEventsBetweenElementOriginAndElementDest($currentDelegation["TAS_UID"], $nextDel["TAS_UID_DUMMY"], $appFields, $flagFirstIteration, true); } } break; @@ -881,11 +965,8 @@ class Derivation } if ($canDerivate) { - //Throw Message-Events - $messageApplication->throwMessageEventBetweenElementOriginAndElementDest($currentDelegation["TAS_UID"], $nextDel["TAS_UID"], $appFields, $flagFirstIteration, true); - - //Throw Email-Events - $emailEvent->emailEventBetweenElementOriginAndElementDest($currentDelegation["TAS_UID"], $nextDel["TAS_UID"], $appFields, $flagFirstIteration, true); + //Throw Events + $this->throwEventsBetweenElementOriginAndElementDest($currentDelegation["TAS_UID"], $nextDel["TAS_UID"], $appFields, $flagFirstIteration, true); //Derivate $aSP = (isset($aSP))? $aSP : null; @@ -990,11 +1071,8 @@ class Derivation switch ($routeType) { case 'SEC-JOIN': - //Throw Message-Events - $messageApplication->throwMessageEventBetweenElementOriginAndElementDest($currentDelegation["TAS_UID"], $nextDel["TAS_UID"], $appFields, $flagFirstIteration, false); - - //Throw Email-Events - $emailEvent->emailEventBetweenElementOriginAndElementDest($currentDelegation["TAS_UID"], $nextDel["TAS_UID"], $appFields, $flagFirstIteration, false); + //Throw Events + $this->throwEventsBetweenElementOriginAndElementDest($currentDelegation["TAS_UID"], $nextDel["TAS_UID"], $appFields, $flagFirstIteration, false); //Close thread $this->case->closeAppThread( $currentDelegation['APP_UID'], $iAppThreadIndex ); diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index 54473e1bb..b699f0c52 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -537,6 +537,12 @@ class pmDynaform } } } + if (isset($json->options) && isset($json->options[0])) { + $data[$json->variable === "" ? $json->id : $json->variable] = $json->options[0]->value; + } + if (isset($json->placeholder) && $json->placeholder !== "") { + $data[$json->variable === "" ? $json->id : $json->variable] = $json->placeholder; + } if (isset($json->defaultValue) && $json->defaultValue !== "") { $data[$json->variable === "" ? $json->id : $json->variable] = $json->defaultValue; } diff --git a/workflow/engine/classes/model/AdditionalTables.php b/workflow/engine/classes/model/AdditionalTables.php index 115c2c76d..b6549e701 100755 --- a/workflow/engine/classes/model/AdditionalTables.php +++ b/workflow/engine/classes/model/AdditionalTables.php @@ -751,7 +751,7 @@ class AdditionalTables extends BaseAdditionalTables } else { // grids foreach ($caseData[$dKey] as $dIndex => $dRow) { - if (!is_array($dRow)) { + if (is_array($dRow)) { foreach ($dRow as $k => $v) { if (trim($v) === '') { $caseData[$dKey][$dIndex][$k] = null; diff --git a/workflow/engine/classes/model/ListCompleted.php b/workflow/engine/classes/model/ListCompleted.php index 84c5b8b55..6ae2d1177 100644 --- a/workflow/engine/classes/model/ListCompleted.php +++ b/workflow/engine/classes/model/ListCompleted.php @@ -116,7 +116,7 @@ class ListCompleted extends BaseListCompleted $dataset->next(); $aRow = $dataset->getRow(); if ($aRow['TAS_TYPE'] != 'SUBPROCESS') { - $users->refreshTotal($data['USR_UID'], 'remove', 'inbox'); + //$users->refreshTotal($data['USR_UID'], 'remove', 'inbox'); } } else { $criteria = new Criteria(); @@ -125,9 +125,9 @@ class ListCompleted extends BaseListCompleted $dataset = SubApplicationPeer::doSelectRS($criteria); $dataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); if ($dataset->next()) { - $users->refreshTotal($data['USR_UID'], 'remove', 'inbox'); + //$users->refreshTotal($data['USR_UID'], 'remove', 'inbox'); } else { - $users->refreshTotal($data['USR_UID'], 'remove', 'draft'); + //$users->refreshTotal($data['USR_UID'], 'remove', 'draft'); } } diff --git a/workflow/engine/classes/model/ListInbox.php b/workflow/engine/classes/model/ListInbox.php index 6fbf71cdd..0b784e9ec 100644 --- a/workflow/engine/classes/model/ListInbox.php +++ b/workflow/engine/classes/model/ListInbox.php @@ -324,12 +324,12 @@ class ListInbox extends BaseListInbox $criteria->add( SubApplicationPeer::APP_UID, $data['APP_UID'], Criteria::EQUAL ); $dataset = SubApplicationPeer::doSelectRS($criteria); if ($dataset->next()) { - $users->refreshTotal($delPreviusUsrUid, 'remove', 'inbox'); + //$users->refreshTotal($delPreviusUsrUid, 'remove', 'inbox'); } else { - $users->refreshTotal($delPreviusUsrUid, 'remove', 'draft'); + //$users->refreshTotal($delPreviusUsrUid, 'remove', 'draft'); } } else { - $users->refreshTotal($delPreviusUsrUid, 'remove', 'inbox'); + //$users->refreshTotal($delPreviusUsrUid, 'remove', 'inbox'); } } if (!$isSelfService) { @@ -341,9 +341,9 @@ class ListInbox extends BaseListInbox $users->refreshTotal($data['USR_UID'], 'add', 'inbox'); } if ($dataPreviusApplication['APP_STATUS'] == 'DRAFT') { - $users->refreshTotal($dataPreviusApplication['CURRENT_USER_UID'], 'remove', 'draft'); + //$users->refreshTotal($dataPreviusApplication['CURRENT_USER_UID'], 'remove', 'draft'); } else { - $users->refreshTotal($dataPreviusApplication['CURRENT_USER_UID'], 'remove', 'inbox'); + //$users->refreshTotal($dataPreviusApplication['CURRENT_USER_UID'], 'remove', 'inbox'); } } self::create($data, $isSelfService); diff --git a/workflow/engine/methods/cases/cases_Step.php b/workflow/engine/methods/cases/cases_Step.php index d13dbbfec..f644cc5cb 100755 --- a/workflow/engine/methods/cases/cases_Step.php +++ b/workflow/engine/methods/cases/cases_Step.php @@ -216,11 +216,8 @@ if ($flagExecuteBeforeTriggers) { if (! isset( $_SESSION['_NO_EXECUTE_TRIGGERS_'] )) { //Execute before triggers - Start - if (!isset($_SESSION['beforeTriggersExecuted']) || $_GET['POSITION'] > 1) { - $oStep = $oStep->loadByProcessTaskPosition( $_SESSION['PROCESS'], $_SESSION['TASK'], $_GET['POSITION'] ); - if($oStep) { - $Fields['APP_DATA'] = $oCase->ExecuteTriggers( $_SESSION['TASK'], $oStep->getStepTypeObj(), $oStep->getStepUidObj(), 'BEFORE', $Fields['APP_DATA'] ); - } + if (!isset($_SESSION['beforeTriggersExecuted']) || $triggers) { + $Fields['APP_DATA'] = $oCase->ExecuteTriggers( $_SESSION['TASK'], $_GET['TYPE'], $_GET['UID'], 'BEFORE', $Fields['APP_DATA'] ); } else { unset($_SESSION['beforeTriggersExecuted']); } diff --git a/workflow/engine/methods/services/ActionsByEmailDataForm.php b/workflow/engine/methods/services/ActionsByEmailDataForm.php index 6fe0e0880..311ed498c 100755 --- a/workflow/engine/methods/services/ActionsByEmailDataForm.php +++ b/workflow/engine/methods/services/ActionsByEmailDataForm.php @@ -47,6 +47,7 @@ if (PMLicensedFeatures $record['APP_UID'] = $_REQUEST['APP_UID']; $record['DEL_INDEX'] = $_REQUEST['DEL_INDEX']; $record['ABER'] = $_REQUEST['ABER']; + $record['APP_DATA'] = $caseFields['APP_DATA']; if (is_null($caseFields['DEL_FINISH_DATE'])) { $a = new pmDynaform($record); $a->printABE($action,$record); diff --git a/workflow/engine/methods/services/ActionsByEmailDataFormPost.php b/workflow/engine/methods/services/ActionsByEmailDataFormPost.php index d4258e51a..03d08d302 100755 --- a/workflow/engine/methods/services/ActionsByEmailDataFormPost.php +++ b/workflow/engine/methods/services/ActionsByEmailDataFormPost.php @@ -93,7 +93,6 @@ if (PMLicensedFeatures $dataResponses['ABE_RES_MESSAGE'] = ''; try { - set_include_path(PATH_PLUGINS . 'actionsByEmail' . PATH_SEPARATOR . get_include_path()); require_once 'classes/model/AbeResponses.php'; $abeAbeResponsesInstance = new AbeResponses(); diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/EmailEvent.php b/workflow/engine/src/ProcessMaker/BusinessModel/EmailEvent.php index 0449f72f3..f97c61c31 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/EmailEvent.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/EmailEvent.php @@ -393,94 +393,6 @@ class EmailEvent } } - /** - * Email-event for the Case - * - * @param string $elementOriginUid Unique id of Element Origin (unique id of Task) - * @param string $elementDestUid Unique id of Element Dest (unique id of Task) - * @param array $arrayApplicationData Case data - * @param bool $flagEventExecuteBeforeGateway Execute event before gateway - * @param bool $flagEventExecuteAfterGateway Execute event after gateway - * - * @return void - */ - public function emailEventBetweenElementOriginAndElementDest($elementOriginUid, $elementDestUid, array $arrayApplicationData, $flagEventExecuteBeforeGateway = true, $flagEventExecuteAfterGateway = true) - { - try { - //Verify if the Project is BPMN - $bpmn = new \ProcessMaker\Project\Bpmn(); - - if (!$bpmn->exists($arrayApplicationData["PRO_UID"])) { - return; - } - - //Element origin and dest - $elementTaskRelation = new \ProcessMaker\BusinessModel\ElementTaskRelation(); - - $arrayElement = array( - "elementOrigin" => array("uid" => $elementOriginUid, "type" => "bpmnActivity"), - "elementDest" => array("uid" => $elementDestUid, "type" => "bpmnActivity") - ); - - foreach ($arrayElement as $key => $value) { - $arrayElementTaskRelationData = $elementTaskRelation->getElementTaskRelationWhere( - array( - \ElementTaskRelationPeer::PRJ_UID => $arrayApplicationData["PRO_UID"], - \ElementTaskRelationPeer::ELEMENT_TYPE => "bpmnEvent", - \ElementTaskRelationPeer::TAS_UID => $arrayElement[$key]["uid"] - ), - true - ); - - if (!is_null($arrayElementTaskRelationData)) { - $arrayElement[$key]["uid"] = $arrayElementTaskRelationData["ELEMENT_UID"]; - $arrayElement[$key]["type"] = "bpmnEvent"; - } - } - - $elementOriginUid = $arrayElement["elementOrigin"]["uid"]; - $elementOriginType = $arrayElement["elementOrigin"]["type"]; - $elementDestUid = $arrayElement["elementDest"]["uid"]; - $elementDestType = $arrayElement["elementDest"]["type"]; - - //Throw Email-Events - $arrayEventType = array("END", "INTERMEDIATE"); - $arrayEventMarker = array("EMAIL"); - - $arrayEventExecute = array("BEFORE" => $flagEventExecuteBeforeGateway, "AFTER" => $flagEventExecuteAfterGateway); - $positionEventExecute = "BEFORE"; - - $arrayElement = $bpmn->getElementsBetweenElementOriginAndElementDest( - $elementOriginUid, - $elementOriginType, - $elementDestUid, - $elementDestType - ); - - foreach ($arrayElement as $value) { - switch ($value[1]) { - case "bpmnEvent": - $event = \BpmnEventPeer::retrieveByPK($value[0]); - - if (!is_null($event) && - in_array($event->getEvnType(), $arrayEventType) && in_array($event->getEvnMarker(), $arrayEventMarker) - ) { - if ($arrayEventExecute[$positionEventExecute]) { - //Email-Event throw - $result = $this->sendEmail($arrayApplicationData["APP_UID"], $arrayApplicationData["PRO_UID"], $value[0], $arrayApplicationData); - } - } - break; - case "bpmnGateway": - $positionEventExecute = "AFTER"; - break; - } - } - } catch (\Exception $e) { - throw $e; - } - } - /** * Email-event do function * diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Light.php b/workflow/engine/src/ProcessMaker/BusinessModel/Light.php index f49c385d4..1d28ecd79 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Light.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Light.php @@ -66,7 +66,7 @@ class Light foreach ($processList[$key] as $keyChild => $processInfoChild) { $webEntryEventStart = $webEntryEvent->getWebEntryEvents($processInfoChild['pro_uid']); if(empty($webEntryEventStart)){ - $tempTreeChild['text'] = htmlentities($keyChild, ENT_QUOTES, 'UTF-8'); //ellipsis ( $keyChild, 50 ); + $tempTreeChild['text'] = $keyChild; //ellipsis ( $keyChild, 50 ); $tempTreeChild['processId'] = $processInfoChild['pro_uid']; $tempTreeChild['taskId'] = $processInfoChild['uid']; $forms = $task->getSteps($processInfoChild['uid']); @@ -405,10 +405,10 @@ class Light $triggers = $oCase->loadTriggers( $tas_uid, 'ASSIGN_TASK', '-1', 'BEFORE'); if (isset($triggers)){ - $cases = new \ProcessMaker\BusinessModel\Cases(); - foreach($triggers as $trigger){ - $cases->putExecuteTriggerCase($app_uid, $trigger['TRI_UID'], $usr_uid); - } + $Fields = $oCase->loadCase( $app_uid ); + $Fields['APP_DATA'] = array_merge( $Fields['APP_DATA'], G::getSystemConstants() ); + $Fields['APP_DATA'] = $oCase->ExecuteTriggers( $tas_uid, 'DYNAFORM', '-1', 'BEFORE', $Fields['APP_DATA'] ); + $oCase->updateCase( $app_uid, $Fields ); } $oDerivation = new \Derivation(); $aData = array(); @@ -457,6 +457,8 @@ class Light $response[] = $taskAss; break; case 'MANUAL': + case "MULTIPLE_INSTANCE": + case "MULTIPLE_INSTANCE_VALUE_BASED": $manual = array(); $manual['taskId'] = $aValues['NEXT_TASK']['TAS_UID']; $manual['taskName'] = $aValues['NEXT_TASK']['TAS_TITLE']; @@ -492,7 +494,7 @@ class Light } if (empty( $response )) { - throw (new Exception( G::LoadTranslation( 'ID_NO_DERIVATION_RULE' ) )); + throw new \Exception(G::LoadTranslation("ID_NO_DERIVATION_RULE")); } } catch (\Exception $e) { throw $e; diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Light/NotificationDevice.php b/workflow/engine/src/ProcessMaker/BusinessModel/Light/NotificationDevice.php index 962cc85f0..a38bde7f9 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Light/NotificationDevice.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Light/NotificationDevice.php @@ -150,30 +150,12 @@ class NotificationDevice public function routeCaseNotification($currentUserId, $processId, $currentTaskId, $appFields, $aTasks, $nextIndex) { try { - $oUser = new \Users(); - $aUser = $oUser->load( $currentUserId ); - $response = array(); - $task = new \Tasks(); - $group = new \Groups(); foreach ($aTasks as $aTask) { $arrayTaskUser = array(); switch ($aTask["TAS_ASSIGN_TYPE"]) { case "SELF_SERVICE": - if (isset($aTask["TAS_UID"]) && !empty($aTask["TAS_UID"])) { - $arrayAux1 = $task->getGroupsOfTask($aTask["TAS_UID"], 1); - foreach ($arrayAux1 as $arrayGroup) { - $arrayAux2 = $group->getUsersOfGroup($arrayGroup["GRP_UID"]); - foreach ($arrayAux2 as $arrayUser) { - $arrayTaskUser[] = $arrayUser["USR_UID"]; - } - } - $arrayAux1 = $task->getUsersOfTask($aTask["TAS_UID"], 1); - - foreach ($arrayAux1 as $arrayUser) { - $arrayTaskUser[] = $arrayUser["USR_UID"]; - } - } + $arrayTaskUser = $this->getTaskUserSelfService($aTask["TAS_UID"], $appFields); break; default: if (isset($aTask["USR_UID"]) && !empty($aTask["USR_UID"])) { @@ -182,8 +164,6 @@ class NotificationDevice break; } -// $oTask = new \Task(); -// $currentTask = $oTask->load($aTask['TAS_UID']); $delIndex = null; foreach ($nextIndex as $nIndex) { if($aTask['TAS_UID'] == $nIndex['TAS_UID']){ @@ -250,4 +230,43 @@ class NotificationDevice return $response; } + public function getTaskUserSelfService($tas_uid, $appFields) + { + $oTask = new \Tasks(); + $oGroup = new \Groups(); + $taskNextDel = \TaskPeer::retrieveByPK($tas_uid); + $arrayTaskUser = array(); + + if ($taskNextDel->getTasAssignType() == "SELF_SERVICE" && trim($taskNextDel->getTasGroupVariable()) != "") { + // Self Service Value Based Assignment + $nextTaskGroupVariable = trim($taskNextDel->getTasGroupVariable(), " @#"); + if (isset($appFields["APP_DATA"][$nextTaskGroupVariable])) { + $dataGroupVariable = $appFields["APP_DATA"][$nextTaskGroupVariable]; + $dataGroupVariable = (is_array($dataGroupVariable))? $dataGroupVariable : trim($dataGroupVariable); + if (!empty($dataGroupVariable) && is_array($dataGroupVariable)){ + $arrayTaskUser[] = $dataGroupVariable; + } elseif(!empty($dataGroupVariable)) { + $arrayUsersOfGroup = $oGroup->getUsersOfGroup($dataGroupVariable); + foreach ($arrayUsersOfGroup as $arrayUser) { + $arrayTaskUser[] = $arrayUser["USR_UID"]; + } + } + } + } else { // Self Service + $arrayGroupsOfTask = $oTask->getGroupsOfTask($tas_uid, 1); + foreach ($arrayGroupsOfTask as $arrayGroup) { + $arrayUsersOfGroup = $oGroup->getUsersOfGroup($arrayGroup["GRP_UID"]); + foreach ($arrayUsersOfGroup as $arrayUser) { + $arrayTaskUser[] = $arrayUser["USR_UID"]; + } + } + $arrayUsersOfTask = $oTask->getUsersOfTask($tas_uid, 1); + foreach ($arrayUsersOfTask as $arrayUser) { + $arrayTaskUser[] = $arrayUser["USR_UID"]; + } + } + + return $arrayTaskUser; + } + } diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/MessageApplication.php b/workflow/engine/src/ProcessMaker/BusinessModel/MessageApplication.php index 66ff1298e..e5d0c8427 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/MessageApplication.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/MessageApplication.php @@ -354,94 +354,6 @@ class MessageApplication } } - /** - * Throw Message-Events for the Case - * - * @param string $elementOriginUid Unique id of Element Origin (unique id of Task) - * @param string $elementDestUid Unique id of Element Dest (unique id of Task) - * @param array $arrayApplicationData Case data - * @param bool $flagEventExecuteBeforeGateway Execute event before gateway - * @param bool $flagEventExecuteAfterGateway Execute event after gateway - * - * @return void - */ - public function throwMessageEventBetweenElementOriginAndElementDest($elementOriginUid, $elementDestUid, array $arrayApplicationData, $flagEventExecuteBeforeGateway = true, $flagEventExecuteAfterGateway = true) - { - try { - //Verify if the Project is BPMN - $bpmn = new \ProcessMaker\Project\Bpmn(); - - if (!$bpmn->exists($arrayApplicationData["PRO_UID"])) { - return; - } - - //Element origin and dest - $elementTaskRelation = new \ProcessMaker\BusinessModel\ElementTaskRelation(); - - $arrayElement = array( - "elementOrigin" => array("uid" => $elementOriginUid, "type" => "bpmnActivity"), - "elementDest" => array("uid" => $elementDestUid, "type" => "bpmnActivity") - ); - - foreach ($arrayElement as $key => $value) { - $arrayElementTaskRelationData = $elementTaskRelation->getElementTaskRelationWhere( - array( - \ElementTaskRelationPeer::PRJ_UID => $arrayApplicationData["PRO_UID"], - \ElementTaskRelationPeer::ELEMENT_TYPE => "bpmnEvent", - \ElementTaskRelationPeer::TAS_UID => $arrayElement[$key]["uid"] - ), - true - ); - - if (!is_null($arrayElementTaskRelationData)) { - $arrayElement[$key]["uid"] = $arrayElementTaskRelationData["ELEMENT_UID"]; - $arrayElement[$key]["type"] = "bpmnEvent"; - } - } - - $elementOriginUid = $arrayElement["elementOrigin"]["uid"]; - $elementOriginType = $arrayElement["elementOrigin"]["type"]; - $elementDestUid = $arrayElement["elementDest"]["uid"]; - $elementDestType = $arrayElement["elementDest"]["type"]; - - //Throw Message-Events - $arrayEventType = array("END", "INTERMEDIATE"); - $arrayEventMarker = array("MESSAGETHROW"); - - $arrayEventExecute = array("BEFORE" => $flagEventExecuteBeforeGateway, "AFTER" => $flagEventExecuteAfterGateway); - $positionEventExecute = "BEFORE"; - - $arrayElement = $bpmn->getElementsBetweenElementOriginAndElementDest( - $elementOriginUid, - $elementOriginType, - $elementDestUid, - $elementDestType - ); - - foreach ($arrayElement as $value) { - switch ($value[1]) { - case "bpmnEvent": - $event = \BpmnEventPeer::retrieveByPK($value[0]); - - if (!is_null($event) && - in_array($event->getEvnType(), $arrayEventType) && in_array($event->getEvnMarker(), $arrayEventMarker) - ) { - if ($arrayEventExecute[$positionEventExecute]) { - //Message-Application throw - $result = $this->create($arrayApplicationData["APP_UID"], $arrayApplicationData["PRO_UID"], $value[0], $arrayApplicationData); - } - } - break; - case "bpmnGateway": - $positionEventExecute = "AFTER"; - break; - } - } - } catch (\Exception $e) { - throw $e; - } - } - /** * Catch Message-Events for the Cases * diff --git a/workflow/engine/src/ProcessMaker/Project/Bpmn.php b/workflow/engine/src/ProcessMaker/Project/Bpmn.php index 15d2b0b1d..6af0a9b5c 100755 --- a/workflow/engine/src/ProcessMaker/Project/Bpmn.php +++ b/workflow/engine/src/ProcessMaker/Project/Bpmn.php @@ -1375,29 +1375,36 @@ class Bpmn extends Handler $elementOriginUid, $elementOriginType, $elementDestUid, - $elementDestType + $elementDestType, + $index ) { try { if (isset($this->arrayElementOriginChecked[$elementOriginUid]) && $this->arrayElementOriginChecked[$elementOriginUid] == $elementOriginType) { //Return - return array(); + return []; } $this->arrayElementOriginChecked[$elementOriginUid] = $elementOriginType; - if ($elementOriginType == $elementDestType && $elementOriginUid == $elementDestUid) { - $arrayEvent = array(); - array_unshift($arrayEvent, array($elementDestUid, $elementDestType)); + if ($index > 0 && $elementOriginType == $elementDestType) { + if ($elementOriginUid == $elementDestUid) { + $arrayEvent = []; + + array_unshift($arrayEvent, [$elementDestUid, $elementDestType]); + + //Return + return $arrayEvent; + } //Return - return $arrayEvent; + return []; } else { //Flows - $arrayFlow = \BpmnFlow::findAllBy(array( - \BpmnFlowPeer::FLO_TYPE => array("MESSAGE", \Criteria::NOT_EQUAL), + $arrayFlow = \BpmnFlow::findAllBy([ + \BpmnFlowPeer::FLO_TYPE => ["MESSAGE", \Criteria::NOT_EQUAL], \BpmnFlowPeer::FLO_ELEMENT_ORIGIN => $elementOriginUid, \BpmnFlowPeer::FLO_ELEMENT_ORIGIN_TYPE => $elementOriginType - )); + ]); foreach ($arrayFlow as $value) { $arrayFlowData = $value->toArray(); @@ -1406,11 +1413,12 @@ class Bpmn extends Handler $arrayFlowData["FLO_ELEMENT_DEST"], $arrayFlowData["FLO_ELEMENT_DEST_TYPE"], $elementDestUid, - $elementDestType + $elementDestType, + $index + 1 ); if (!empty($arrayEvent)) { - array_unshift($arrayEvent, array($elementOriginUid, $elementOriginType)); + array_unshift($arrayEvent, [$elementOriginUid, $elementOriginType]); //Return return $arrayEvent; @@ -1418,7 +1426,7 @@ class Bpmn extends Handler } //Return - return array(); + return []; } } catch (\Exception $e) { self::log("Exception: ", $e->getMessage(), "Trace: ", $e->getTraceAsString()); @@ -1434,10 +1442,10 @@ class Bpmn extends Handler $elementDestType ) { try { - $this->arrayElementOriginChecked = array(); + $this->arrayElementOriginChecked = []; //Return - return call_user_func_array(array($this, "__getElementsBetweenElementOriginAndElementDest"), func_get_args()); + return call_user_func_array([$this, "__getElementsBetweenElementOriginAndElementDest"], array_merge(func_get_args(), [0])); } catch (\Exception $e) { self::log("Exception: ", $e->getMessage(), "Trace: ", $e->getTraceAsString());