/** * derivate Case moves the case to the next task in the process according to the routing rules * * @param string $userId * @param string $caseId * @param string $delIndex * @param array $tasks * @param bool $bExecuteTriggersBeforeAssignment * @return $result will return an object */ public function derivateCase ($userId, $caseId, $delIndex, $bExecuteTriggersBeforeAssignment = false, $tasks = array()) { $g = new G(); try { $g->sessionVarSave(); $_SESSION["APPLICATION"] = $caseId; $_SESSION["INDEX"] = $delIndex; $_SESSION["USER_LOGGED"] = $userId; $sStatus = 'TO_DO'; $varResponse = ''; $varTriggers = "\n"; if ($delIndex == '') { $oCriteria = new Criteria( 'workflow' ); $oCriteria->addSelectColumn( AppDelegationPeer::DEL_INDEX ); $oCriteria->add( AppDelegationPeer::APP_UID, $caseId ); $oCriteria->add( AppDelegationPeer::DEL_FINISH_DATE, null, Criteria::ISNULL ); if (AppDelegationPeer::doCount( $oCriteria ) > 1) { $result = new wsResponse( 20, G::loadTranslation( 'ID_SPECIFY_DELEGATION_INDEX' ) ); return $result; } $oDataset = AppDelegationPeer::doSelectRS( $oCriteria ); $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); $oDataset->next(); $aRow = $oDataset->getRow(); $delIndex = $aRow['DEL_INDEX']; } $oAppDel = new AppDelegation(); $appdel = $oAppDel->Load( $caseId, $delIndex ); if ($userId != $appdel['USR_UID']) { $result = new wsResponse( 17, G::loadTranslation( 'ID_CASE_ASSIGNED_ANOTHER_USER' ) ); return $result; } if ($appdel['DEL_FINISH_DATE'] != null) { $result = new wsResponse( 18, G::loadTranslation( 'ID_CASE_DELEGATION_ALREADY_CLOSED' ) ); return $result; } $oCriteria = new Criteria( 'workflow' ); $oCriteria->addSelectColumn( AppDelayPeer::APP_UID ); $oCriteria->addSelectColumn( AppDelayPeer::APP_DEL_INDEX ); $oCriteria->add( AppDelayPeer::APP_TYPE, '' ); $oCriteria->add( $oCriteria->getNewCriterion( AppDelayPeer::APP_TYPE, 'PAUSE' )->addOr( $oCriteria->getNewCriterion( AppDelayPeer::APP_TYPE, 'CANCEL' ) ) ); $oCriteria->addAscendingOrderByColumn( AppDelayPeer::APP_ENABLE_ACTION_DATE ); $oDataset = AppDelayPeer::doSelectRS( $oCriteria ); $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); $oDataset->next(); $aRow = $oDataset->getRow(); if (is_array( $aRow )) { if (isset( $aRow['APP_DISABLE_ACTION_USER'] ) && $aRow['APP_DISABLE_ACTION_USER'] != 0 && isset( $aRow['APP_DISABLE_ACTION_DATE'] ) && $aRow['APP_DISABLE_ACTION_DATE'] != '') { $result = new wsResponse( 19, G::loadTranslation( 'ID_CASE_IN_STATUS' ) . " " . $aRow['APP_TYPE'] ); return $result; } } $aData = array(); $aData['APP_UID'] = $caseId; $aData['DEL_INDEX'] = $delIndex; $aData['USER_UID'] = $userId; //Load data $oCase = new Cases(); $appFields = $oCase->loadCase( $caseId, $delIndex ); if (is_null( $appFields["DEL_INIT_DATE"] )) { $oCase->setDelInitDate( $caseId, $delIndex ); $appFields = $oCase->loadCase( $caseId, $delIndex ); } $appFields["APP_DATA"]["APPLICATION"] = $caseId; if (! isset( $_SESSION["PROCESS"] )) { $_SESSION["PROCESS"] = $appFields["PRO_UID"]; } if ($bExecuteTriggersBeforeAssignment) { //Execute triggers before assignment $aTriggers = $oCase->loadTriggers( $appdel['TAS_UID'], 'ASSIGN_TASK', - 1, 'BEFORE' ); if (count( $aTriggers ) > 0) { $varTriggers = $varTriggers . "<br /><b>-= Before Assignment =-</b><br />"; $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"]; if ($this->stored_system_variables) { $params->option = "STORED SESSION"; $params->SID = $this->wsSessionId; } $appFields["APP_DATA"] = array_merge( $appFields["APP_DATA"], G::getSystemConstants( $params ) ); //PMScript $oPMScript->setFields( $appFields['APP_DATA'] ); $bExecute = true; if ($aTrigger['ST_CONDITION'] !== '') { $oPMScript->setScript( $aTrigger['ST_CONDITION'] ); $bExecute = $oPMScript->evaluate(); } if ($bExecute) { $oPMScript->setScript( $aTrigger['TRI_WEBBOT'] ); $oPMScript->execute(); $trigger = TriggersPeer::retrieveByPk($aTrigger["TRI_UID"]); $varTriggers = $varTriggers . " - " . nl2br(htmlentities($trigger->getTriTitle(), ENT_QUOTES)) . "<br />"; //$appFields = $oCase->loadCase( $caseId ); $appFields['APP_DATA'] = $oPMScript->aFields; unset($appFields['APP_STATUS']); unset($appFields['APP_PROC_STATUS']); unset($appFields['APP_PROC_CODE']); unset($appFields['APP_PIN']); $oCase->updateCase( $caseId, $appFields ); } } } } //Execute triggers before derivation BEFORE_ROUTING $aTriggers = $oCase->loadTriggers( $appdel['TAS_UID'], 'ASSIGN_TASK', - 2, 'BEFORE' ); if (count( $aTriggers ) > 0) { $varTriggers .= "<b>-= Before Derivation =-</b><br/>"; $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"]; if ($this->stored_system_variables) { $params->option = "STORED SESSION"; $params->SID = $this->wsSessionId; } $appFields["APP_DATA"] = array_merge( $appFields["APP_DATA"], G::getSystemConstants( $params ) ); //PMScript $oPMScript->setFields( $appFields['APP_DATA'] ); $bExecute = true; if ($aTrigger['ST_CONDITION'] !== '') { $oPMScript->setScript( $aTrigger['ST_CONDITION'] ); $bExecute = $oPMScript->evaluate(); } if ($bExecute) { $oPMScript->setScript( $aTrigger['TRI_WEBBOT'] ); $oPMScript->execute(); $oTrigger = TriggersPeer::retrieveByPk( $aTrigger['TRI_UID'] ); $varTriggers .= " - " . nl2br( htmlentities( $oTrigger->getTriTitle(), ENT_QUOTES ) ) . "<br/>"; //$appFields = $oCase->loadCase( $caseId ); $appFields['APP_DATA'] = $oPMScript->aFields; unset($appFields['APP_STATUS']); unset($appFields['APP_PROC_STATUS']); unset($appFields['APP_PROC_CODE']); unset($appFields['APP_PIN']); //$appFields['APP_DATA']['APPLICATION'] = $caseId; $oCase->updateCase( $caseId, $appFields ); } } } $oDerivation = new Derivation(); if (!empty($tasks)) { $nextDelegations = $tasks; } else { $derive = $oDerivation->prepareInformation($aData); if (isset($derive[1])) { if ($derive[1]['ROU_TYPE'] == 'SELECT') { $result = new wsResponse(21, G::loadTranslation('ID_CAN_NOT_ROUTE_CASE_USING_WEBSERVICES')); return $result; } } else { $result = new wsResponse(22, G::loadTranslation('ID_TASK_DOES_NOT_HAVE_ROUTING_RULE')); return $result; } foreach ($derive as $key => $val) { if ($val['NEXT_TASK']['TAS_ASSIGN_TYPE'] == 'MANUAL') { $result = new wsResponse(15, G::loadTranslation('ID_TASK_DEFINED_MANUAL_ASSIGNMENT')); return $result; } //Routed to the next task, if end process then not exist user $nodeNext = array(); $usrasgdUid = null; $usrasgdUserName = null; if (isset($val['NEXT_TASK']['USER_ASSIGNED'])) { $usrasgdUid = $val['NEXT_TASK']['USER_ASSIGNED']['USR_UID']; $usrasgdUserName = '******' . $val['NEXT_TASK']['USER_ASSIGNED']['USR_USERNAME'] . ')'; } $nodeNext['TAS_UID'] = $val['NEXT_TASK']['TAS_UID']; $nodeNext['USR_UID'] = $usrasgdUid; $nodeNext['TAS_ASSIGN_TYPE'] = $val['NEXT_TASK']['TAS_ASSIGN_TYPE']; $nodeNext['TAS_DEF_PROC_CODE'] = $val['NEXT_TASK']['TAS_DEF_PROC_CODE']; $nodeNext['DEL_PRIORITY'] = $appdel['DEL_PRIORITY']; $nodeNext['TAS_PARENT'] = $val['NEXT_TASK']['TAS_PARENT']; $nextDelegations[] = $nodeNext; $varResponse = $varResponse . (($varResponse != '') ? ',' : '') . $val['NEXT_TASK']['TAS_TITLE'] . $usrasgdUserName; } } $appFields['DEL_INDEX'] = $delIndex; if (isset( $derive['TAS_UID'] )) { $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(); $oCriteria->addSelectColumn( RoutePeer::ROU_TYPE ); $oCriteria->addSelectColumn( RoutePeer::ROU_NEXT_TASK ); $oCriteria->add( RoutePeer::TAS_UID, $appdel['TAS_UID'] ); $oDataset = TaskPeer::doSelectRS( $oCriteria ); $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); $oDataset->next(); while ($aRow = $oDataset->getRow()) { $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'] ); $oDerivation->derivate( $aCurrentDerivation, $nextDelegations ); $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(); $params->appData = $appFields["APP_DATA"]; if ($this->stored_system_variables) { $params->option = "STORED SESSION"; $params->SID = $this->wsSessionId; } $appFields["APP_DATA"] = array_merge( $appFields["APP_DATA"], G::getSystemConstants( $params ) ); //PMScript $oPMScript = new PMScript(); $oPMScript->setFields( $appFields['APP_DATA'] ); $varTriggers .= "<b>-= After Derivation =-</b><br/>"; foreach ($aTriggers as $aTrigger) { $bExecute = true; if ($aTrigger['ST_CONDITION'] !== '') { $oPMScript->setScript( $aTrigger['ST_CONDITION'] ); $bExecute = $oPMScript->evaluate(); } if ($bExecute) { $oPMScript->setScript( $aTrigger['TRI_WEBBOT'] ); $oPMScript->execute(); $oTrigger = TriggersPeer::retrieveByPk( $aTrigger['TRI_UID'] ); $varTriggers .= " - " . nl2br( htmlentities( $oTrigger->getTriTitle(), ENT_QUOTES ) ) . "<br/>"; //$appFields = $oCase->loadCase($caseId); $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']); $oCase->updateCase( $caseId, $appFields ); } } } $sFromName = ""; if ($userId != "") { $user = new Users(); $arrayUserData = $user->load($userId); if (trim($arrayUserData["USR_EMAIL"]) == "") { $arrayUserData["USR_EMAIL"] = "info@" . $_SERVER["HTTP_HOST"]; } $sFromName = "\"" . $arrayUserData["USR_FIRSTNAME"] . " " . $arrayUserData["USR_LASTNAME"] . "\" <" . $arrayUserData["USR_EMAIL"] . ">"; } $oCase->sendNotifications( $appdel['TAS_UID'], $nextDelegations, $appFields['APP_DATA'], $caseId, $delIndex, $sFromName ); // Send notifications Mobile - Start try { $oLight = new \ProcessMaker\BusinessModel\Light(); $nextIndex = $oLight->getInformationDerivatedCase($appFields['APP_UID'], $delIndex); $notificationMobile = new \ProcessMaker\BusinessModel\Light\NotificationDevice(); $notificationMobile->routeCaseNotification($userId, $_SESSION["PROCESS"], $appdel['TAS_UID'], $appFields, $nextDelegations, $nextIndex); } catch (Exception $e) { \G::log(G::loadTranslation( 'ID_NOTIFICATION_ERROR' ) . '|' . $e->getMessage() , PATH_DATA, "mobile.log"); } // Send notifications Mobile - End //Save data - Start //$appFields = $oCase->loadCase($caseId); //$oCase->updateCase($caseId, $appFields); //Save data - End $oProcess = new Process(); $oProcessFieds = $oProcess->Load( $appFields['PRO_UID'] ); //here dubug mode in web entry if (isset( $oProcessFieds['PRO_DEBUG'] ) && $oProcessFieds['PRO_DEBUG']) { $result = new wsResponse( 0, $varResponse . " <br><br><table width='100%' cellpadding='0' cellspacing='0'><tr><td class='FormTitle'> " . G::LoadTranslation( 'ID_DEBUG_MESSAGE' ) . "</td></tr></table>" . $varTriggers ); } else { $result = new wsResponse( 0, $varResponse . " --- " . $oProcessFieds['PRO_DEBUG'] ); } $res = $result->getPayloadArray(); //now fill the array of AppDelegationPeer $oCriteria = new Criteria( 'workflow' ); $oCriteria->addSelectColumn( AppDelegationPeer::DEL_INDEX ); $oCriteria->addSelectColumn( AppDelegationPeer::USR_UID ); $oCriteria->addSelectColumn( AppDelegationPeer::TAS_UID ); $oCriteria->addSelectColumn( AppDelegationPeer::DEL_THREAD ); $oCriteria->addSelectColumn( AppDelegationPeer::DEL_THREAD_STATUS ); $oCriteria->addSelectColumn( AppDelegationPeer::DEL_FINISH_DATE ); $oCriteria->add( AppDelegationPeer::APP_UID, $caseId ); $oCriteria->add( AppDelegationPeer::DEL_PREVIOUS, $delIndex ); $oCriteria->addAscendingOrderByColumn( AppDelegationPeer::DEL_INDEX ); $oDataset = AppDelegationPeer::doSelectRS( $oCriteria ); $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); $aCurrentUsers = array (); while ($oDataset->next()) { $aAppDel = $oDataset->getRow(); $oUser = new Users(); try { $oUser->load( $aAppDel['USR_UID'] ); $uFields = $oUser->toArray( BasePeer::TYPE_FIELDNAME ); $currentUserName = $oUser->getUsrFirstname() . ' ' . $oUser->getUsrLastname(); } catch (Exception $e) { $currentUserName = ''; } $oTask = new Task(); try { $uFields = $oTask->load( $aAppDel['TAS_UID'] ); $taskName = $uFields['TAS_TITLE']; } catch (Exception $e) { $taskName = ''; } // execute events $eventPro = $_SESSION["PROCESS"]; $eventApp = $caseId; $eventInd = $aAppDel['DEL_INDEX']; $eventTas = $aAppDel['TAS_UID']; $oEvent = new Event(); $oEvent->createAppEvents( $eventPro, $eventApp, $eventInd, $eventTas ); // end events $currentUser = new stdClass(); $currentUser->userId = $aAppDel['USR_UID']; $currentUser->userName = $currentUserName; $currentUser->taskId = $aAppDel['TAS_UID']; $currentUser->taskName = $taskName; $currentUser->delIndex = $aAppDel['DEL_INDEX']; $currentUser->delThread = $aAppDel['DEL_THREAD']; $currentUser->delThreadStatus = $aAppDel['DEL_THREAD_STATUS']; $aCurrentUsers[] = $currentUser; } $res['routing'] = $aCurrentUsers; $g->sessionVarRestore(); return $res; } catch (Exception $e) { $result = new wsResponse( 100, $e->getMessage() ); $g->sessionVarRestore(); return $result; } }
/** * prepareInformation * * @param array $arrayData Data * @param string $taskUid Unique id of Task * * return array Return array */ public function prepareInformation(array $arrayData, $taskUid = "") { try { if (!class_exists("Cases")) { G::LoadClass("case"); } $this->case = new Cases(); $task = new Task(); $arrayNextTask = array(); $arrayNextTaskDefault = array(); $i = 0; //SELECT * //FROM APP_DELEGATION AS A //LEFT JOIN TASK AS T ON(T.TAS_UID = A.TAS_UID) //LEFT JOIN ROUTE AS R ON(R.TAS_UID = A.TAS_UID) //WHERE //APP_UID = '$arrayData["APP_UID"]' //AND DEL_INDEX = '$arrayData["DEL_INDEX"]' $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); $flagDefault = false; while ($rsCriteria->next()) { $arrayRouteData = G::array_merges($rsCriteria->getRow(), $arrayData); if ((int)($arrayRouteData["ROU_DEFAULT"]) == 1) { $arrayNextTaskDefault = $arrayRouteData; $flagDefault = true; continue; } $flagContinue = true; //Evaluate the condition if there are conditions defined if (isset($arrayRouteData["ROU_CONDITION"]) && trim($arrayRouteData["ROU_CONDITION"]) != "" && ($arrayRouteData["ROU_TYPE"] != "SELECT" || $arrayRouteData["ROU_TYPE"] == "PARALLEL-BY-EVALUATION")) { G::LoadClass("pmScript"); $arrayApplicationData = $this->case->loadCase($arrayData["APP_UID"]); $pmScript = new PMScript(); $pmScript->setFields($arrayApplicationData["APP_DATA"]); $pmScript->setScript($arrayRouteData["ROU_CONDITION"]); $flagContinue = $pmScript->evaluate(); } if (isset($arrayRouteData["ROU_CONDITION"]) && trim($arrayRouteData["ROU_CONDITION"]) == "" && $arrayRouteData["ROU_NEXT_TASK"] != "-1") { $arrayTaskData = $task->load($arrayRouteData["ROU_NEXT_TASK"]); if ($arrayTaskData["TAS_TYPE"] == "GATEWAYTOGATEWAY") { $flagContinue = false; } } if ($arrayRouteData["ROU_TYPE"] == "EVALUATE" && count($arrayNextTask) > 0) { $flagContinue = false; } if ($flagContinue) { $arrayNextTask[++$i] = $this->prepareInformationTask($arrayRouteData); } } if (count($arrayNextTask) == 0 && count($arrayNextTaskDefault) > 0) { $arrayNextTask[++$i] = $this->prepareInformationTask($arrayNextTaskDefault); } //Check Task GATEWAYTOGATEWAY or END-MESSAGE-EVENT or END-EMAIL-EVENT $arrayNextTaskBackup = $arrayNextTask; $arrayNextTask = array(); $i = 0; foreach ($arrayNextTaskBackup as $value) { $arrayNextTaskData = $value; if ($arrayNextTaskData["NEXT_TASK"]["TAS_UID"] != "-1" && in_array($arrayNextTaskData["NEXT_TASK"]["TAS_TYPE"], array("GATEWAYTOGATEWAY", "END-MESSAGE-EVENT", "END-EMAIL-EVENT")) ) { $arrayAux = $this->prepareInformation($arrayData, $arrayNextTaskData["NEXT_TASK"]["TAS_UID"]); foreach ($arrayAux as $value2) { $arrayNextTask[++$i] = $value2; } } else { if (in_array($arrayNextTaskData["TAS_TYPE"], array("END-MESSAGE-EVENT", "END-EMAIL-EVENT")) && $arrayNextTaskData["NEXT_TASK"]["TAS_UID"] == "-1" ) { $arrayNextTaskData["NEXT_TASK"]["TAS_UID"] = $arrayNextTaskData["TAS_UID"] . "/" . $arrayNextTaskData["NEXT_TASK"]["TAS_UID"]; } $arrayNextTask[++$i] = $arrayNextTaskData; } } //1. There is no rule if (count($arrayNextTask) == 0) { $oProcess = new Process(); $oProcessFieds = $oProcess->Load( $_SESSION['PROCESS'] ); if(isset($oProcessFieds['PRO_BPMN']) && $oProcessFieds['PRO_BPMN'] == 1){ throw new Exception(G::LoadTranslation("ID_NO_DERIVATION_BPMN_RULE")); }else{ throw new Exception(G::LoadTranslation("ID_NO_DERIVATION_RULE")); } } //Return return $arrayNextTask; } catch (Exception $e) { throw $e; } }
public function executeTriggers($sTasUid, $sStepType, $sStepUidObj, $sTriggerType, $aFields = array()) { /*----------------------------------********---------------------------------*/ $aTriggers = $this->loadTriggers($sTasUid, $sStepType, $sStepUidObj, $sTriggerType); if (count($aTriggers) > 0) { global $oPMScript; $oPMScript = new PMScript(); $oPMScript->setFields($aFields); $arraySystemConfiguration = System::getSystemConfiguration(PATH_CONFIG . "env.ini"); /*----------------------------------********---------------------------------*/ foreach ($aTriggers as $aTrigger) { /*----------------------------------********---------------------------------*/ //Execute $bExecute = true; if ($aTrigger['ST_CONDITION'] !== '') { $oPMScript->setScript($aTrigger['ST_CONDITION']); $bExecute = $oPMScript->evaluate(); } if ($bExecute) { $oPMScript->setScript($aTrigger['TRI_WEBBOT']); $oPMScript->execute(); } } /*----------------------------------********---------------------------------*/ return $oPMScript->aFields; } else { return $aFields; } }
/** * prepareInformation * * @param array $aData * @return $taskInfo */ function prepareInformation($aData) { $oTask = new Task(); //SELECT * //FROM APP_DELEGATION AS A //LEFT JOIN TASK AS T ON(T.TAS_UID = A.TAS_UID) //LEFT JOIN ROUTE AS R ON(R.TAS_UID = A.TAS_UID) //WHERE //APP_UID = '$aData['APP_UID']' //AND DEL_INDEX = '$aData['DEL_INDEX']' $c = new Criteria('workflow'); $c->clearSelectColumns(); $c->addSelectColumn(AppDelegationPeer::TAS_UID); $c->addSelectColumn(RoutePeer::ROU_CONDITION); $c->addSelectColumn(RoutePeer::ROU_NEXT_TASK); $c->addSelectColumn(RoutePeer::ROU_TYPE); $c->addJoin(AppDelegationPeer::TAS_UID, TaskPeer::TAS_UID, Criteria::LEFT_JOIN); $c->addJoin(AppDelegationPeer::TAS_UID, RoutePeer::TAS_UID, Criteria::LEFT_JOIN); $c->add(AppDelegationPeer::APP_UID, $aData['APP_UID']); $c->add(AppDelegationPeer::DEL_INDEX, $aData['DEL_INDEX']); $c->addAscendingOrderByColumn(RoutePeer::ROU_CASE); $rs = AppDelegationPeer::doSelectRs($c); $rs->setFetchmode(ResultSet::FETCHMODE_ASSOC); $rs->next(); $aDerivation = $rs->getRow(); $i = 0; $taskInfo = array(); $oUser = new Users(); $this->case = new Cases(); // 1. there is no rule if (is_null($aDerivation['ROU_NEXT_TASK'])) { throw new Exception(G::LoadTranslation('ID_NO_DERIVATION_RULE')); } while (is_array($aDerivation)) { $oTask = new Task(); $aDerivation = G::array_merges($aDerivation, $aData); $bContinue = true; //evaluate the condition if there are conditions defined. if (isset($aDerivation['ROU_CONDITION']) && trim($aDerivation['ROU_CONDITION']) != '' && ($aDerivation['ROU_TYPE'] != 'SELECT' || $aDerivation['ROU_TYPE'] == 'PARALLEL-BY-EVALUATION')) { $AppFields = $this->case->loadCase($aData['APP_UID']); G::LoadClass('pmScript'); $oPMScript = new PMScript(); $oPMScript->setFields($AppFields['APP_DATA']); $oPMScript->setScript($aDerivation['ROU_CONDITION']); $bContinue = $oPMScript->evaluate(); } if ($aDerivation['ROU_TYPE'] == 'EVALUATE') { if (count($taskInfo) >= 1) { $bContinue = false; } } if ($bContinue) { $i++; $TaskFields = $oTask->load($aDerivation['TAS_UID']); $aDerivation = G::array_merges($aDerivation, $TaskFields); //2. if next case is an special case if ((int) $aDerivation['ROU_NEXT_TASK'] < 0) { $aDerivation['NEXT_TASK']['TAS_UID'] = (int) $aDerivation['ROU_NEXT_TASK']; $aDerivation['NEXT_TASK']['TAS_ASSIGN_TYPE'] = 'nobody'; $aDerivation['NEXT_TASK']['TAS_PRIORITY_VARIABLE'] = ''; $aDerivation['NEXT_TASK']['TAS_DEF_PROC_CODE'] = ''; $aDerivation['NEXT_TASK']['TAS_PARENT'] = ''; $aDerivation['NEXT_TASK']['TAS_TRANSFER_FLY'] = ''; switch ($aDerivation['ROU_NEXT_TASK']) { case -1: $aDerivation['NEXT_TASK']['TAS_TITLE'] = G::LoadTranslation('ID_END_OF_PROCESS'); break; case -2: $aDerivation['NEXT_TASK']['TAS_TITLE'] = G::LoadTranslation('ID_TAREA_COLGANTE'); break; } $aDerivation['NEXT_TASK']['USR_UID'] = ''; } else { //3. load the task information of normal NEXT_TASK $aDerivation['NEXT_TASK'] = $oTask->load($aDerivation['ROU_NEXT_TASK']); //print $aDerivation['ROU_NEXT_TASK']." **** ".$aDerivation['NEXT_TASK']['TAS_TYPE']."<hr>"; if ($aDerivation['NEXT_TASK']['TAS_TYPE'] === 'SUBPROCESS') { $oCriteria = new Criteria('workflow'); $oCriteria->add(SubProcessPeer::PRO_PARENT, $aDerivation['PRO_UID']); $oCriteria->add(SubProcessPeer::TAS_PARENT, $aDerivation['NEXT_TASK']['TAS_UID']); $oDataset = SubProcessPeer::doSelectRS($oCriteria); $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); $oDataset->next(); $aRow = $oDataset->getRow(); $sTaskParent = $aDerivation['NEXT_TASK']['TAS_UID']; $aDerivation['ROU_NEXT_TASK'] = $aRow['TAS_UID']; //print "<hr>Life is just a lonely highway"; $aDerivation['NEXT_TASK'] = $oTask->load($aDerivation['ROU_NEXT_TASK']); //print "<hr>Life is just a lonely highway";print"<hr>"; $oProcess = new Process(); $aRow = $oProcess->load($aRow['PRO_UID']); $aDerivation['NEXT_TASK']['TAS_TITLE'] .= ' (' . $aRow['PRO_TITLE'] . ')'; $aDerivation['NEXT_TASK']['TAS_PARENT'] = $sTaskParent; unset($oTask, $oProcess, $aRow, $sTaskParent); } else { $aDerivation['NEXT_TASK']['TAS_PARENT'] = ''; } $aDerivation['NEXT_TASK']['USER_ASSIGNED'] = $this->getNextAssignedUser($aDerivation); } $taskInfo[$i] = $aDerivation; } $rs->next(); $aDerivation = $rs->getRow(); } return $taskInfo; }
public function executeTriggers($sTasUid, $sStepType, $sStepUidObj, $sTriggerType, $aFields = array()) { $aTriggers = $this->loadTriggers($sTasUid, $sStepType, $sStepUidObj, $sTriggerType); if (count($aTriggers) > 0) { global $oPMScript; $oPMScript = new PMScript(); $oPMScript->setFields($aFields); foreach ($aTriggers as $aTrigger) { $bExecute = true; if ($aTrigger['ST_CONDITION'] !== '') { $oPMScript->setScript($aTrigger['ST_CONDITION']); $bExecute = $oPMScript->evaluate(); } if ($bExecute) { $oPMScript->setScript($aTrigger['TRI_WEBBOT']); $oPMScript->execute(); } } return $oPMScript->aFields; } else { return $aFields; } }
/** * * @method * * Redirects a case to any step in the current task. In order for the step to * be executed, the specified step much exist and if it contains a condition, * it must evaluate to true. * * @name PMFRedirectToStep * @label PMF Redirect To Step * @link http://wiki.processmaker.com/index.php/ProcessMaker_Functions#PMFRedirectToStep.28.29 * * @param string(32) | $sApplicationUID | Case ID | The unique ID for a case, * @param int | $iDelegation | Delegation index | The delegation index of a case. * @param string(32) | $sStepType | Type of Step | The type of step, which can be "DYNAFORM", "INPUT_DOCUMENT" or "OUTPUT_DOCUMENT". * @param string(32) | $sStepUid | Step ID | The unique ID for the step. * @return none | $none | None | None * */ function PMFRedirectToStep($sApplicationUID, $iDelegation, $sStepType, $sStepUid) { $g = new G(); $g->sessionVarSave(); $iDelegation = intval($iDelegation); $_SESSION["APPLICATION"] = $sApplicationUID; $_SESSION["INDEX"] = $iDelegation; require_once 'classes/model/AppDelegation.php'; $oCriteria = new Criteria('workflow'); $oCriteria->addSelectColumn(AppDelegationPeer::TAS_UID); $oCriteria->add(AppDelegationPeer::APP_UID, $sApplicationUID); $oCriteria->add(AppDelegationPeer::DEL_INDEX, $iDelegation); $oDataset = AppDelegationPeer::doSelectRS($oCriteria); $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); $oDataset->next(); global $oPMScript; $aRow = $oDataset->getRow(); if ($aRow) { require_once 'classes/model/Step.php'; $oStep = new Step(); $oTheStep = $oStep->loadByType($aRow['TAS_UID'], $sStepType, $sStepUid); $bContinue = true; G::LoadClass('case'); $oCase = new Cases(); $aFields = $oCase->loadCase($sApplicationUID); if ($oTheStep->getStepCondition() != '') { G::LoadClass('pmScript'); $pmScript = new PMScript(); $pmScript->setFields($aFields['APP_DATA']); $pmScript->setScript($oTheStep->getStepCondition()); $bContinue = $pmScript->evaluate(); } if ($bContinue) { switch ($oTheStep->getStepTypeObj()) { case 'DYNAFORM': $sAction = 'EDIT'; break; case 'OUTPUT_DOCUMENT': $sAction = 'GENERATE'; break; case 'INPUT_DOCUMENT': $sAction = 'ATTACH'; break; case 'EXTERNAL': $sAction = 'EDIT'; break; case 'MESSAGE': $sAction = ''; break; } // save data if (!is_null($oPMScript)) { $aFields['APP_DATA'] = $oPMScript->aFields; $oCase->updateCase($sApplicationUID, $aFields); } $g->sessionVarRestore(); G::header('Location: ' . 'cases_Step?TYPE=' . $sStepType . '&UID=' . $sStepUid . '&POSITION=' . $oTheStep->getStepPosition() . '&ACTION=' . $sAction); die; } } $g->sessionVarRestore(); }
public function getSteps ($appUid, $index, $tasUid, $proUid) { //require_once 'classes/model/Step.php'; //require_once 'classes/model/Content.php'; //require_once 'classes/model/AppDocument.php'; //require_once 'classes/model/InputDocumentPeer.php'; //require_once 'classes/model/OutputDocument.php'; //require_once 'classes/model/Dynaform.php'; //G::LoadClass( 'pmScript' ); G::LoadClass( 'case' ); $steps = Array (); $case = new Cases(); $step = new Step(); $appDocument = new AppDocument(); $caseSteps = $step->getAllCaseSteps( $proUid, $tasUid, $appUid ); //getting externals steps $oPluginRegistry = &PMPluginRegistry::getSingleton(); $eSteps = $oPluginRegistry->getSteps(); $externalSteps = array (); foreach ($eSteps as $externalStep) { $externalSteps[$externalStep->sStepId] = $externalStep; } //getting the case record if ($appUid) { $caseData = $case->loadCase( $appUid ); $pmScript = new PMScript(); $pmScript->setFields( $caseData['APP_DATA'] ); } $externalStepCount = 0; foreach ($caseSteps as $caseStep) { // if it has a condition if (trim( $caseStep->getStepCondition() ) != '') { $pmScript->setScript( $caseStep->getStepCondition() ); if (! $pmScript->evaluate()) { //evaluated false, jump & continue with the others steps continue; } } $stepUid = $caseStep->getStepUidObj(); $stepType = $caseStep->getStepTypeObj(); $stepPosition = $caseStep->getStepPosition(); $stepItem = array (); $stepItem['id'] = $stepUid; $stepItem['type'] = $stepType; switch ($stepType) { case 'DYNAFORM': $oDocument = DynaformPeer::retrieveByPK( $stepUid ); $stepItem['title'] = $oDocument->getDynTitle(); $stepItem['url'] = "cases/cases_Step?UID=$stepUid&TYPE=$stepType&POSITION=$stepPosition&ACTION=EDIT"; $stepItem['version'] = $oDocument->getDynVersion(); break; case 'OUTPUT_DOCUMENT': $oDocument = OutputDocumentPeer::retrieveByPK( $caseStep->getStepUidObj() ); $outputDoc = $appDocument->getObject( $appUid, $index, $caseStep->getStepUidObj(), 'OUTPUT' ); $stepItem['title'] = $oDocument->getOutDocTitle(); if ($outputDoc['APP_DOC_UID']) { $stepItem['url'] = "cases/cases_Step?UID=$stepUid&TYPE=$stepType&POSITION=$stepPosition&ACTION=VIEW&DOC={$outputDoc['APP_DOC_UID']}"; } else { $stepItem['url'] = "cases/cases_Step?UID=$stepUid&TYPE=$stepType&POSITION=$stepPosition&ACTION=GENERATE"; } break; case 'INPUT_DOCUMENT': $oDocument = InputDocumentPeer::retrieveByPK( $stepUid ); $stepItem['title'] = $oDocument->getInpDocTitle(); $stepItem['url'] = "cases/cases_Step?UID=$stepUid&TYPE=$stepType&POSITION=$stepPosition&ACTION=ATTACH"; break; case 'EXTERNAL': $stepTitle = 'unknown ' . $caseStep->getStepUidObj(); $oPluginRegistry = PMPluginRegistry::getSingleton(); $externalStep = $externalSteps[$caseStep->getStepUidObj()]; $stepItem['id'] = $externalStep->sStepId; $stepItem['title'] = $externalStep->sStepTitle; $stepItem['url'] = "cases/cases_Step?UID={$externalStep->sStepId}&TYPE=EXTERNAL&POSITION=$stepPosition&ACTION=EDIT"; break; } $steps[] = $stepItem; } //last, assign task $stepItem = array (); $stepItem['id'] = '-1'; $stepItem['type'] = ''; $stepItem['title'] = G::LoadTranslation( 'ID_ASSIGN_TASK' ); $stepItem['url'] = "cases/cases_Step?TYPE=ASSIGN_TASK&UID=-1&POSITION=10000&ACTION=ASSIGN"; $steps[] = $stepItem; return $steps; }
$externalSteps = $oPluginRegistry->getSteps(); $oTree = new Tree(); $oTree->nodeType = "blank"; $oTree->name = 'Steps'; $oTree->showSign = false; $tasUid = $_SESSION['TASK']; $rs = StepPeer::doSelect($c); $oCase = new Cases(); $Fields = $oCase->loadCase($_SESSION['APPLICATION']); $oPMScript = new PMScript(); $oPMScript->setFields($Fields['APP_DATA']); foreach ($rs as $key => $aRow) { $bAccessStep = false; if (trim($aRow->getStepCondition()) != '') { $oPMScript->setScript($aRow->getStepCondition()); $bAccessStep = $oPMScript->evaluate(); } else { $bAccessStep = true; } if ($bAccessStep) { switch ($aRow->getStepTypeObj()) { case 'DYNAFORM': $oDocument = DynaformPeer::retrieveByPK($aRow->getStepUidObj()); $stepTitle = $oDocument->getDynTitle(); break; case 'OUTPUT_DOCUMENT': $oDocument = OutputDocumentPeer::retrieveByPK($aRow->getStepUidObj()); $stepTitle = $oDocument->getOutDocTitle(); break; case 'INPUT_DOCUMENT': $oDocument = InputDocumentPeer::retrieveByPK($aRow->getStepUidObj());
/** * prepareInformation * * @param array $arrayData Data * @param string $taskUid Unique id of Task * * @return array Return array */ public function prepareInformation(array $arrayData, $taskUid = "") { try { if (!class_exists("Cases")) { G::LoadClass("case"); } $this->case = new Cases(); $task = new Task(); $arrayApplicationData = $this->case->loadCase($arrayData["APP_UID"]); $arrayNextTask = array(); $arrayNextTaskDefault = array(); $i = 0; //SELECT * //FROM APP_DELEGATION AS A //LEFT JOIN TASK AS T ON(T.TAS_UID = A.TAS_UID) //LEFT JOIN ROUTE AS R ON(R.TAS_UID = A.TAS_UID) //WHERE //APP_UID = '$arrayData["APP_UID"]' //AND DEL_INDEX = '$arrayData["DEL_INDEX"]' $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); $flagDefault = false; $aSecJoin = array(); $count = 0; while ($rsCriteria->next()) { $arrayRouteData = G::array_merges($rsCriteria->getRow(), $arrayData); if ((int) $arrayRouteData["ROU_DEFAULT"] == 1) { $arrayNextTaskDefault = $arrayRouteData; $flagDefault = true; continue; } $flagAddDelegation = true; //Evaluate the condition if there are conditions defined if (trim($arrayRouteData["ROU_CONDITION"]) != "" && $arrayRouteData["ROU_TYPE"] != "SELECT") { G::LoadClass("pmScript"); $pmScript = new PMScript(); $pmScript->setFields($arrayApplicationData["APP_DATA"]); $pmScript->setScript($arrayRouteData["ROU_CONDITION"]); $flagAddDelegation = $pmScript->evaluate(); } 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 (count($arrayNextTask) == 0 && 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"; 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"; 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)) { $oProcess = new Process(); $oProcessFieds = $oProcess->Load($_SESSION['PROCESS']); if (isset($oProcessFieds['PRO_BPMN']) && $oProcessFieds['PRO_BPMN'] == 1) { throw new Exception(G::LoadTranslation("ID_NO_DERIVATION_BPMN_RULE")); } else { throw new Exception(G::LoadTranslation("ID_NO_DERIVATION_RULE")); } } //Return return $arrayNextTask; } catch (Exception $e) { throw $e; } }