diff --git a/workflow/engine/classes/class.derivation.php b/workflow/engine/classes/class.derivation.php index 8a6563106..425567b9e 100644 --- a/workflow/engine/classes/class.derivation.php +++ b/workflow/engine/classes/class.derivation.php @@ -1033,38 +1033,7 @@ class Derivation Bootstrap::registerMonolog('CaseDerivation', 200, 'Case Derivation', $aContext, $this->sysSys, 'processmaker.log'); break; case TASK_FINISH_TASK: - $iAppThreadIndex = $appFields['DEL_THREAD']; - $this->case->closeAppThread($currentDelegation['APP_UID'], $iAppThreadIndex); - if (isset($nextDel["TAS_UID_DUMMY"])) { - $criteria = new Criteria("workflow"); - $criteria->addSelectColumn(RoutePeer::TAS_UID); - $criteria->addJoin(RoutePeer::TAS_UID, AppDelegationPeer::TAS_UID); - $criteria->add(RoutePeer::PRO_UID, $appFields['PRO_UID']); - $criteria->add(RoutePeer::ROU_NEXT_TASK, isset($nextDel['ROU_PREVIOUS_TASK']) ? $nextDel['ROU_PREVIOUS_TASK'] : ''); - $criteria->add(RoutePeer::ROU_TYPE, isset($nextDel['ROU_PREVIOUS_TYPE']) ? $nextDel['ROU_PREVIOUS_TYPE'] : ''); - $criteria->add(AppDelegationPeer::DEL_THREAD_STATUS, 'OPEN'); - $rsCriteria = RoutePeer::doSelectRS($criteria); - $rsCriteria->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $executeEvent = ($rsCriteria->next()) ? false : true; - - $multiInstanceCompleted = true; - if ($flagTaskAssignTypeIsMultipleInstance) { - $multiInstanceCompleted = $this->case->multiInstanceIsCompleted( - $appFields['APP_UID'], - $appFields['TAS_UID'], - $appFields['DEL_PREVIOUS']); - } - - $taskDummy = TaskPeer::retrieveByPK($nextDel["TAS_UID_DUMMY"]); - if (preg_match("/^(?:END-MESSAGE-EVENT|END-EMAIL-EVENT)$/", $taskDummy->getTasType()) - && $multiInstanceCompleted && $executeEvent - ) { - $this->executeEvent($nextDel["TAS_UID_DUMMY"], $appFields, $flagFirstIteration, true); - } - } - $aContext['action'] = 'finish-task'; - //Logger - Bootstrap::registerMonolog('CaseDerivation', 200, 'Case Derivation', $aContext, $this->sysSys, 'processmaker.log'); + $this->finishTask($currentDelegation, $nextDel, $appFields, $flagFirstIteration, $flagTaskAssignTypeIsMultipleInstance, $aContext); break; default: //Get all siblingThreads @@ -1348,7 +1317,7 @@ class Derivation /* Start Block : Count the open threads of $currentDelegation['APP_UID'] */ $openThreads = $this->case->GetOpenThreads( $currentDelegation['APP_UID'] ); - $flag = false; + $flagUpdateCase = false; //check if there is any paused thread @@ -1364,18 +1333,22 @@ class Derivation $appFields["APP_STATUS"] = "COMPLETED"; $appFields["APP_FINISH_DATE"] = "now"; $this->verifyIsCaseChild($currentDelegation["APP_UID"], $currentDelegation["DEL_INDEX"]); - $flag = true; + $flagUpdateCase = true; } - if (isset( $iNewDelIndex )) { + //The variable $iNewDelIndex will be true if we created a new index the variable + if (isset($iNewDelIndex)) { $appFields["DEL_INDEX"] = $iNewDelIndex; - $appFields["TAS_UID"] = $nextDel["TAS_UID"]; - - $flag = true; + $excludeTasUid = array(TASK_FINISH_PROCESS, TASK_FINISH_TASK); + //If the last TAS_UID value is not valid we will check for the TAS_UID value + if (in_array($nextDel["TAS_UID"], $excludeTasUid) && is_array($arrayDerivationResult) && isset(current($arrayDerivationResult)["TAS_UID"])) { + $appFields["TAS_UID"] = current($arrayDerivationResult)["TAS_UID"]; + } + $flagUpdateCase = true; } - if ($flag) { + if ($flagUpdateCase) { //Start Block : UPDATES APPLICATION $this->case->updateCase( $currentDelegation["APP_UID"], $appFields ); //End Block : UPDATES APPLICATION @@ -2009,4 +1982,47 @@ class Derivation \G::log(G::loadTranslation('ID_NOTIFICATION_ERROR') . '|' . $e->getMessage()); } } + /** + * @param array $currentDelegation + * @param array $nextDel + * @param array $appFields + * @param boolean $flagFirstIteration + * @param boolean $flagTaskAssignTypeIsMultipleInstance + * @param array $aContext + * @return void + */ + public function finishTask($currentDelegation, $nextDel, $appFields, $flagFirstIteration = true, $flagTaskAssignTypeIsMultipleInstance = false, $aContext = array()) { + $iAppThreadIndex = $appFields['DEL_THREAD']; + $this->case->closeAppThread($currentDelegation['APP_UID'], $iAppThreadIndex); + if (isset($nextDel["TAS_UID_DUMMY"])) { + $criteria = new Criteria("workflow"); + $criteria->addSelectColumn(RoutePeer::TAS_UID); + $criteria->addJoin(RoutePeer::TAS_UID, AppDelegationPeer::TAS_UID); + $criteria->add(RoutePeer::PRO_UID, $appFields['PRO_UID']); + $criteria->add(RoutePeer::ROU_NEXT_TASK, isset($nextDel['ROU_PREVIOUS_TASK']) ? $nextDel['ROU_PREVIOUS_TASK'] : ''); + $criteria->add(RoutePeer::ROU_TYPE, isset($nextDel['ROU_PREVIOUS_TYPE']) ? $nextDel['ROU_PREVIOUS_TYPE'] : ''); + $criteria->add(AppDelegationPeer::DEL_THREAD_STATUS, 'OPEN'); + $rsCriteria = RoutePeer::doSelectRS($criteria); + $rsCriteria->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $executeEvent = ($rsCriteria->next()) ? false : true; + + $multiInstanceCompleted = true; + if ($flagTaskAssignTypeIsMultipleInstance) { + $multiInstanceCompleted = $this->case->multiInstanceIsCompleted( + $appFields['APP_UID'], + $appFields['TAS_UID'], + $appFields['DEL_PREVIOUS']); + } + + $taskDummy = TaskPeer::retrieveByPK($nextDel["TAS_UID_DUMMY"]); + if (preg_match("/^(?:END-MESSAGE-EVENT|END-EMAIL-EVENT)$/", $taskDummy->getTasType()) + && $multiInstanceCompleted && $executeEvent + ) { + $this->executeEvent($nextDel["TAS_UID_DUMMY"], $appFields, $flagFirstIteration, true); + } + } + $aContext['action'] = 'finish-task'; + //Logger + Bootstrap::registerMonolog('CaseDerivation', 200, 'Case Derivation', $aContext, $this->sysSys, 'processmaker.log'); + } } diff --git a/workflow/engine/classes/model/ListInbox.php b/workflow/engine/classes/model/ListInbox.php index 43501ce33..619bebe1b 100644 --- a/workflow/engine/classes/model/ListInbox.php +++ b/workflow/engine/classes/model/ListInbox.php @@ -549,9 +549,17 @@ class ListInbox extends BaseListInbox $criteria->addJoin(ListInboxPeer::USR_UID, UsersPeer::USR_UID, Criteria::LEFT_JOIN); self::loadFilters($criteria, $filters, $additionalColumns); - $sort = (!empty($filters['sort'])) ? - ListInboxPeer::TABLE_NAME.'.'.$filters['sort'] : - "LIST_INBOX.APP_UPDATE_DATE"; + //We will be defined the sort + $casesList = new \ProcessMaker\BusinessModel\Cases(); + $sort = $casesList->getSortColumn( + __CLASS__ . 'Peer', + BasePeer::TYPE_FIELDNAME, + empty($filters['sort']) ? "APP_UPDATE_DATE" : $filters['sort'], + "APP_UPDATE_DATE", + $this->additionalClassName, + $additionalColumns + ); + $dir = isset($filters['dir']) ? $filters['dir'] : "ASC"; $start = isset($filters['start']) ? $filters['start'] : "0"; $limit = isset($filters['limit']) ? $filters['limit'] : "25"; @@ -624,7 +632,6 @@ class ListInbox extends BaseListInbox * Returns the number of cases of a user * @param string $usrUid * @param array $filters - * @param string $status * @return int */ public function getCountList($usrUid, $filters = array()) diff --git a/workflow/engine/classes/model/ListParticipatedLast.php b/workflow/engine/classes/model/ListParticipatedLast.php index c5ca29955..ce7321e43 100644 --- a/workflow/engine/classes/model/ListParticipatedLast.php +++ b/workflow/engine/classes/model/ListParticipatedLast.php @@ -364,9 +364,17 @@ class ListParticipatedLast extends BaseListParticipatedLast self::loadFilters($criteria, $filters, $additionalColumns); - $sort = (!empty($filters['sort'])) ? - ListParticipatedLastPeer::TABLE_NAME.'.'.$filters['sort'] : - 'DEL_DELEGATE_DATE'; + //We will be defined the sort + $casesList = new \ProcessMaker\BusinessModel\Cases(); + $sort = $casesList->getSortColumn( + __CLASS__ . 'Peer', + BasePeer::TYPE_FIELDNAME, + empty($filters['sort']) ? "DEL_DELEGATE_DATE" : $filters['sort'], + "DEL_DELEGATE_DATE", + $this->additionalClassName, + $additionalColumns + ); + $dir = isset($filters['dir']) ? $filters['dir'] : 'ASC'; $start = isset($filters['start']) ? $filters['start'] : '0'; $limit = isset($filters['limit']) ? $filters['limit'] : '25'; diff --git a/workflow/engine/classes/model/ListPaused.php b/workflow/engine/classes/model/ListPaused.php index 8844a9363..1b885020d 100644 --- a/workflow/engine/classes/model/ListPaused.php +++ b/workflow/engine/classes/model/ListPaused.php @@ -307,7 +307,17 @@ class ListPaused extends BaseListPaused $criteria->add(ListPausedPeer::USR_UID, $usr_uid, Criteria::EQUAL); self::loadFilters($criteria, $filters, $additionalColumns); - $sort = (!empty($filters['sort'])) ? ListPausedPeer::TABLE_NAME.'.'.$filters['sort'] : "APP_PAUSED_DATE"; + //We will be defined the sort + $casesList = new \ProcessMaker\BusinessModel\Cases(); + $sort = $casesList->getSortColumn( + __CLASS__ . 'Peer', + BasePeer::TYPE_FIELDNAME, + empty($filters['sort']) ? "APP_PAUSED_DATE" : $filters['sort'], + "APP_PAUSED_DATE", + $this->additionalClassName, + $additionalColumns + ); + $dir = isset($filters['dir']) ? $filters['dir'] : "ASC"; $start = isset($filters['start']) ? $filters['start'] : "0"; $limit = isset($filters['limit']) ? $filters['limit'] : "25"; diff --git a/workflow/engine/classes/model/ListUnassigned.php b/workflow/engine/classes/model/ListUnassigned.php index f5a7836ab..26cf113eb 100644 --- a/workflow/engine/classes/model/ListUnassigned.php +++ b/workflow/engine/classes/model/ListUnassigned.php @@ -301,9 +301,18 @@ class ListUnassigned extends BaseListUnassigned //Apply some filters self::loadFilters($criteria, $filters, $additionalColumns); - $sort = (!empty($filters['sort'])) ? - ListUnassignedPeer::TABLE_NAME.'.'.$filters['sort'] : - "LIST_UNASSIGNED.DEL_DELEGATE_DATE"; + + //We will be defined the sort + $casesList = new \ProcessMaker\BusinessModel\Cases(); + $sort = $casesList->getSortColumn( + __CLASS__ . 'Peer', + BasePeer::TYPE_FIELDNAME, + empty($filters['sort']) ? "DEL_DELEGATE_DATE" : $filters['sort'], + "DEL_DELEGATE_DATE", + $this->additionalClassName, + $additionalColumns + ); + $dir = isset($filters['dir']) ? $filters['dir'] : "ASC"; $start = isset($filters['start']) ? $filters['start'] : "0"; $limit = isset($filters['limit']) ? $filters['limit'] : "25"; diff --git a/workflow/engine/methods/cases/proxyNewCasesList.php b/workflow/engine/methods/cases/proxyNewCasesList.php index cf274c0ff..f2c4eb881 100644 --- a/workflow/engine/methods/cases/proxyNewCasesList.php +++ b/workflow/engine/methods/cases/proxyNewCasesList.php @@ -24,6 +24,7 @@ try { $filters['start'] = isset($_REQUEST["start"]) ? $filter->sanitizeInputValue($_REQUEST["start"], 'nosql') : "0"; $filters['limit'] = isset($_REQUEST["limit"]) ? $filter->sanitizeInputValue($_REQUEST["limit"], 'nosql') : "25"; $filters['sort'] = (isset($_REQUEST['sort']))? (($_REQUEST['sort'] == 'APP_STATUS_LABEL')? 'APP_STATUS' : $filter->sanitizeInputValue($_REQUEST["sort"], 'nosql')) : ''; + $filters['sort'] = G::toUpper($filters['sort']); $filters['dir'] = isset($_REQUEST["dir"]) ? $filter->sanitizeInputValue($_REQUEST["dir"], 'nosql') : "DESC"; $filters['action'] = isset($_REQUEST["action"]) ? $filter->sanitizeInputValue($_REQUEST["action"], 'nosql') : ""; $filters['user'] = isset($_REQUEST["user"]) ? $filter->sanitizeInputValue($_REQUEST["user"], 'nosql') : ""; @@ -102,16 +103,26 @@ try { } else { $filters['limit'] = (int)$filters['limit']; } - - $filters['sort'] = G::toUpper($filters['sort']); - $columnsList = $listpeer::getFieldNames(BasePeer::TYPE_FIELDNAME); - - if (!(in_array($filters['sort'], $columnsList))) { - if ($filters['sort'] == 'APP_CURRENT_USER' && ($listName == 'participated' || $listName == 'participated_last')) { + + switch ($filters['sort']) { + case 'APP_CURRENT_USER': $filters['sort'] = 'DEL_CURRENT_USR_LASTNAME'; - } else { - $filters['sort'] = ''; - } + break; + case 'DEL_TASK_DUE_DATE': + $filters['sort'] = 'DEL_DUE_DATE'; + break; + case 'APP_UPDATE_DATE': + $filters['sort'] = 'DEL_DELEGATE_DATE'; + break; + case 'APP_DEL_PREVIOUS_USER': + $filters['sort'] = 'DEL_DUE_DATE'; + break; + case 'DEL_CURRENT_TAS_TITLE': + $filters['sort'] = 'APP_TAS_TITLE'; + break; + case 'APP_STATUS_LABEL': + $filters['sort'] = 'APP_STATUS'; + break; } $filters['dir'] = G::toUpper($filters['dir']); diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php index 39cf05952..fe9a285e2 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php @@ -3329,4 +3329,42 @@ class Cases ); } } + + /** + * This function get the table.column by order by the result + * We can include the additional table related to the custom cases list + * + * @param string $listPeer, name of the list class + * @param string $field, name of the fieldName + * @param string $sort, name of column by sort + * @param string $defaultSort, name of column by sort default + * @param string $additionalClassName, name of the className of pmTable + * @param array $additionalColumns, columns related to the custom cases list with the format TABLE_NAME.COLUMN_NAME + * @return string $tableName + */ + public function getSortColumn($listPeer, $field, $sort, $defaultSort, $additionalClassName = '', $additionalColumns = array()) + { + $columnSort = $defaultSort; + $tableName = ''; + + //We will check if the column by sort is a LIST table + $columnsList = $listPeer::getFieldNames($field); + if (in_array($sort, $columnsList)) { + $columnSort = $listPeer::TABLE_NAME . '.' . $sort; + } else { + //We will sort by CUSTOM CASE LIST table + if (count($additionalColumns) > 0) { + require_once(PATH_DATA_SITE . 'classes' . PATH_SEP . $additionalClassName . '.php'); + $aTable = explode('.', current($additionalColumns)); + if (count($aTable) > 0) { + $tableName = $aTable[0]; + } + } + if (in_array($tableName . '.' . $sort, $additionalColumns)) { + $columnSort = $tableName . '.' . $sort; + } + } + + return $columnSort; + } }