diff --git a/workflow/engine/classes/class.wsBase.php b/workflow/engine/classes/class.wsBase.php
index 3f5d8f9b6..9a295a035 100644
--- a/workflow/engine/classes/class.wsBase.php
+++ b/workflow/engine/classes/class.wsBase.php
@@ -2156,9 +2156,73 @@ class wsBase
return $result;
}
}
+ /**
+ * Execute the trigger defined in the steps
+ * This function is used when the case is derived from abe, Soap, PMFDerivateCase
+ *
+ * @param array $appData contain all the information about the case
+ * @param string $tasUid
+ * @param string $stepType
+ * @param string $stepUidObj
+ * @param string $triggerType
+ * @param string $labelAssigment
+ * @return string $varTriggers
+ */
+ function executeTriggerFromDerivate($appData, $tasUid, $stepType, $stepUidObj, $triggerType, $labelAssigment = '')
+ {
+ $varTriggers = "\n";
+ $oCase = new Cases();
+
+ //Execute triggers before assignment
+ $aTriggers = $oCase->loadTriggers($tasUid, $stepType, $stepUidObj, $triggerType);
+
+ if (count( $aTriggers ) > 0) {
+ $varTriggers = $varTriggers . "
".$labelAssigment."
";
+
+ $oPMScript = new PMScript();
+
+ foreach ($aTriggers as $aTrigger) {
+ //Set variables
+ $params = new stdClass();
+ $params->appData = $appData;
+
+ if ($this->stored_system_variables) {
+ $params->option = "STORED SESSION";
+ $params->SID = $this->wsSessionId;
+ }
+
+ $appFields["APP_DATA"] = array_merge($appData, 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)) . "
";
+
+ $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);
+ }
+ }
+ }
+ return $varTriggers;
+ }
/**
- * derivate Case moves the case to the next task in the process according to the routing rules
+ * Derivate Case moves the case to the next task in the process according to the routing rules
*
* @param string $userId
* @param string $caseId
@@ -2178,11 +2242,9 @@ class wsBase
$_SESSION["INDEX"] = $delIndex;
$_SESSION["USER_LOGGED"] = $userId;
+ //Define variables
$sStatus = 'TO_DO';
-
$varResponse = '';
- $varTriggers = "\n";
-
$previousAppData = array();
if ($delIndex == '') {
@@ -2218,18 +2280,10 @@ class wsBase
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 )) {
+ //Validate if the case is paused or cancelled
+ $oAppDelay = new AppDelay();
+ $aRow = $oAppDelay->getCasesCancelOrPaused($caseId);
+ 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'] );
@@ -2264,101 +2318,13 @@ class wsBase
$previousAppData = $oPMScript->aFields;
}
+ //Execute triggers before assignment
if ($bExecuteTriggersBeforeAssignment) {
- //Execute triggers before assignment
- $aTriggers = $oCase->loadTriggers( $appdel['TAS_UID'], 'ASSIGN_TASK', - 1, 'BEFORE' );
-
- if (count( $aTriggers ) > 0) {
- $varTriggers = $varTriggers . "
-= Before Assignment =-
";
-
- $oPMScript = new PMScript();
-
- foreach ($aTriggers as $aTrigger) {
- //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)) . "
";
-
- //$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 );
- }
- }
- }
+ $varTriggers = $this->executeTriggerFromDerivate($appFields["APP_DATA"], $appdel['TAS_UID'], 'ASSIGN_TASK', -1, 'BEFORE', "-= Before Assignment =-");
}
- //Execute triggers before derivation BEFORE_ROUTING
- $aTriggers = $oCase->loadTriggers( $appdel['TAS_UID'], 'ASSIGN_TASK', - 2, 'BEFORE' );
-
- if (count( $aTriggers ) > 0) {
- $varTriggers .= "-= Before Derivation =-
";
-
- $oPMScript = new PMScript();
-
- foreach ($aTriggers as $aTrigger) {
- //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 ) ) . "
";
- //$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 );
- }
- }
- }
+ //Execute triggers before routing
+ $varTriggers = $this->executeTriggerFromDerivate($appFields["APP_DATA"], $appdel['TAS_UID'], 'ASSIGN_TASK', -2, 'BEFORE', "-= Before Derivation =-");
$oDerivation = new Derivation();
if (!empty($tasks)) {
@@ -2402,8 +2368,8 @@ class wsBase
$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'];
- $nodeNext['ROU_CONDITION'] = $val['ROU_CONDITION'];
-
+ $nodeNext['ROU_PREVIOUS_TYPE'] = (isset($val['NEXT_TASK']['ROU_PREVIOUS_TYPE'])) ? $val['NEXT_TASK']['ROU_PREVIOUS_TYPE'] : '';
+ $nodeNext['ROU_PREVIOUS_TASK'] = (isset($val['NEXT_TASK']['ROU_PREVIOUS_TASK'])) ? $val['NEXT_TASK']['ROU_PREVIOUS_TASK'] : '';
$nextDelegations[] = $nodeNext;
$varResponse = $varResponse . (($varResponse != '') ? ',' : '') . $val['NEXT_TASK']['TAS_TITLE'] . $usrasgdUserName;
}
@@ -2414,27 +2380,26 @@ class wsBase
$appFields['TAS_UID'] = $derive['TAS_UID'];
}
- $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();
- }
+ //Get from the route information the nextTask
+ $nextTaskUid = $appdel['TAS_UID'];
+ $nextRouteType = '';
+ do {
+ $oRoute = new \Route();
+ $nextRouteTask = $oRoute->getNextRouteByTask($nextTaskUid);
+ $prefix = '';
+ if (isset($nextRouteTask['ROU_NEXT_TASK'])) {
+ $nextTaskUid = $nextRouteTask['ROU_NEXT_TASK'];
+ $nextRouteType = $nextRouteTask['ROU_TYPE'];
+ $prefix = substr($nextTaskUid, 0, 4);
+ }
+ } while ($prefix == 'gtg-');
$aCurrentDerivation = array (
'APP_UID' => $caseId,
'DEL_INDEX' => $delIndex,
'APP_STATUS' => $sStatus,
'TAS_UID' => $appdel['TAS_UID'],
- 'ROU_TYPE' => $row[0]['ROU_TYPE']
+ 'ROU_TYPE' => $nextRouteType
);
//We define some parameters in the before the derivation
@@ -2442,66 +2407,19 @@ class wsBase
$oDerivation->beforeDerivate(
$aData,
$nextDelegations,
- $row[0]['ROU_TYPE'],
+ $nextRouteType,
$aCurrentDerivation
);
$appFields = $oCase->loadCase( $caseId );
- //Execute triggers after derivation
- $aTriggers = $oCase->loadTriggers( $appdel['TAS_UID'], 'ASSIGN_TASK', - 2, 'AFTER' );
-
- if (count( $aTriggers ) > 0) {
-
- //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 .= "-= After Derivation =-
";
-
- 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 ) ) . "
";
- //$appFields = $oCase->loadCase($caseId);
- $appFields['APP_DATA'] = $oPMScript->aFields;
- //$appFields['APP_DATA']['APPLICATION'] = $caseId;
- //$appFields = $oCase->loadCase($caseId);
- unset($appFields['APP_STATUS']);
- unset($appFields['APP_PROC_STATUS']);
- unset($appFields['APP_PROC_CODE']);
- unset($appFields['APP_PIN']);
- $oCase->updateCase( $caseId, $appFields );
- }
- }
- }
+ //Execute triggers after routing
+ $varTriggers = $this->executeTriggerFromDerivate($appFields["APP_DATA"], $appdel['TAS_UID'], 'ASSIGN_TASK', -2, 'AFTER', "-= After Derivation =-");
$sFromName = "";
if ($userId != "") {
$user = new Users();
-
$arrayUserData = $user->load($userId);
if (trim($arrayUserData["USR_EMAIL"]) == "") {
@@ -2513,15 +2431,9 @@ class wsBase
$oCase->sendNotifications( $appdel['TAS_UID'], $nextDelegations, $appFields['APP_DATA'], $caseId, $delIndex, $sFromName );
- //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
+ //here debug mode in web entry
if (isset( $oProcessFieds['PRO_DEBUG'] ) && $oProcessFieds['PRO_DEBUG']) {
@@ -2534,7 +2446,7 @@ class wsBase
$res = $result->getPayloadArray();
- //now fill the array of AppDelegationPeer
+ //Now fill the array of AppDelegationPeer
$oCriteria = new Criteria( 'workflow' );
$oCriteria->addSelectColumn( AppDelegationPeer::DEL_INDEX );
$oCriteria->addSelectColumn( AppDelegationPeer::USR_UID );
@@ -2552,7 +2464,6 @@ class wsBase
while ($oDataset->next()) {
$aAppDel = $oDataset->getRow();
-
$oUser = new Users();
try {
@@ -2572,7 +2483,7 @@ class wsBase
$taskName = '';
}
- // execute events
+ //Execute events
$eventPro = $_SESSION["PROCESS"];
$eventApp = $caseId;
$eventInd = $aAppDel['DEL_INDEX'];
@@ -2580,8 +2491,7 @@ class wsBase
$oEvent = new Event();
$oEvent->createAppEvents( $eventPro, $eventApp, $eventInd, $eventTas );
- // end events
-
+ //End events
$currentUser = new stdClass();
$currentUser->userId = $aAppDel['USR_UID'];
diff --git a/workflow/engine/classes/model/AppDelay.php b/workflow/engine/classes/model/AppDelay.php
index 56a4e5179..156886c57 100644
--- a/workflow/engine/classes/model/AppDelay.php
+++ b/workflow/engine/classes/model/AppDelay.php
@@ -112,5 +112,26 @@ class AppDelay extends BaseAppDelay
return false;
}
}
+
+ /**
+ * Verify if the case is Paused or cancelled
+ *
+ * @param $appUid string
+ * @return $oDataset array
+ */
+ public function getCasesCancelOrPaused($appUid)
+ {
+ $oCriteria = new Criteria( 'workflow' );
+ $oCriteria->addSelectColumn( AppDelayPeer::APP_UID );
+ $oCriteria->addSelectColumn( AppDelayPeer::APP_DEL_INDEX );
+ $oCriteria->add( AppDelayPeer::APP_TYPE, '' );
+ $oCriteria->add( AppDelayPeer::APP_UID, $appUid );
+ $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();
+ return $oDataset->getRow();
+ }
}
diff --git a/workflow/engine/classes/model/Route.php b/workflow/engine/classes/model/Route.php
index ff6775c6f..f50a24062 100644
--- a/workflow/engine/classes/model/Route.php
+++ b/workflow/engine/classes/model/Route.php
@@ -384,4 +384,23 @@ class Route extends BaseRoute
$this->updateRouteOrder($accountsArray);
}
}
+
+ /**
+ * Get the route for the specific task
+ *
+ * @param $tasUid string
+ * @return $nextRoute array
+ */
+ public function getNextRouteByTask($tasUid)
+ {
+ $oCriteria = new Criteria( 'workflow' );
+ $oCriteria->addSelectColumn( RoutePeer::ROU_TYPE );
+ $oCriteria->addSelectColumn( RoutePeer::ROU_NEXT_TASK );
+ $oCriteria->add( RoutePeer::TAS_UID, $tasUid );
+ $oDataset = TaskPeer::doSelectRS( $oCriteria );
+ $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC );
+ $oDataset->next();
+ $row = $oDataset->getRow();
+ return (is_array($row)) ? $row : array();
+ }
}