diff --git a/workflow/engine/classes/Cases.php b/workflow/engine/classes/Cases.php index 8dae33f5a..3161db9e4 100644 --- a/workflow/engine/classes/Cases.php +++ b/workflow/engine/classes/Cases.php @@ -5783,6 +5783,7 @@ class Cases $resultCaseNotes = 0; $resultSummary = 0; $resultMessages = []; + $resultReassignCases = []; foreach ($permissions as $row) { $userUid = $row['USR_UID']; @@ -5927,7 +5928,7 @@ class Cases break; /*----------------------------------********---------------------------------*/ case 'MSGS_HISTORY': - $listMessage= $objectPermission->objectPermissionMessage( + $listMessage = $objectPermission->objectPermissionMessage( $appUid, $proUid, $userUid, @@ -5939,11 +5940,17 @@ class Cases ); $resultMessages = array_merge($resultMessages, $listMessage); break; + /*----------------------------------********---------------------------------*/ + case 'REASSIGN_MY_CASES': + $listReassign = $objectPermission->objectPermissionByReassignCases($appUid, $proUid, $tasUid); + $resultReassignCases = array_merge($resultReassignCases, $listReassign); + break; + /*----------------------------------********---------------------------------*/ } } } - return array( + return [ "DYNAFORMS" => $resultDynaforms, "INPUT_DOCUMENTS" => $resultInputs, "ATTACHMENTS" => $resultAttachments, @@ -5951,9 +5958,10 @@ class Cases "CASES_NOTES" => $resultCaseNotes, "MSGS_HISTORY" => $resultMessages /*----------------------------------********---------------------------------*/ + , "REASSIGN_MY_CASES" => $resultReassignCases , "SUMMARY_FORM" => $resultSummary /*----------------------------------********---------------------------------*/ - ); + ]; } /** diff --git a/workflow/engine/classes/model/ObjectPermission.php b/workflow/engine/classes/model/ObjectPermission.php index 669b910e0..29b7ca1bb 100644 --- a/workflow/engine/classes/model/ObjectPermission.php +++ b/workflow/engine/classes/model/ObjectPermission.php @@ -15,6 +15,9 @@ use ProcessMaker\BusinessModel\Cases\InputDocument; class ObjectPermission extends BaseObjectPermission { + const OP_PARTICIPATE_NO = 0; + const OP_PARTICIPATE_YES = 1; + const OP_PARTICIPATE_NONE = 2; /** * Get the fields related to the user uid * @@ -161,32 +164,21 @@ class ObjectPermission extends BaseObjectPermission * @param string $proUid the uid of the process * @param string $tasUid the uid of the task * @param string $action for the object permissions VIEW, BLOCK, RESEND + * this parameter is no used for the permission REASSIGN_MY_CASES * @param array $caseData for review the case status DRAFT, TODO, COMPLETED, PAUSED * * @return array */ public function verifyObjectPermissionPerUser ($usrUid, $proUid, $tasUid = '', $action = '', $caseData = array()) { - $userPermissions = array(); - $oCriteria = new Criteria('workflow'); - $oCriteria->add( - $oCriteria->getNewCriterion(ObjectPermissionPeer::USR_UID, $usrUid)->addOr( - $oCriteria->getNewCriterion(ObjectPermissionPeer::USR_UID, '')->addOr( - $oCriteria->getNewCriterion(ObjectPermissionPeer::USR_UID, '0') - ) - ) - ); - $oCriteria->add(ObjectPermissionPeer::PRO_UID, $proUid); - $oCriteria->add(ObjectPermissionPeer::OP_ACTION, $action); - $oCriteria->add( - $oCriteria->getNewCriterion(ObjectPermissionPeer::TAS_UID, $tasUid)->addOr( - $oCriteria->getNewCriterion(ObjectPermissionPeer::TAS_UID, '')->addOr( - $oCriteria->getNewCriterion(ObjectPermissionPeer::TAS_UID, '0') - ) - ) - ); + $userPermissions = []; + $criteria = new Criteria('workflow'); + $criteria->add(ObjectPermissionPeer::USR_UID, ['','0',$usrUid], Criteria::IN); + $criteria->add(ObjectPermissionPeer::PRO_UID, $proUid); + $criteria->add(ObjectPermissionPeer::OP_ACTION, ['','0',$action], Criteria::IN); + $criteria->add(ObjectPermissionPeer::TAS_UID, ['','0',$tasUid], Criteria::IN); - $rs = ObjectPermissionPeer::doSelectRS($oCriteria); + $rs = ObjectPermissionPeer::doSelectRS($criteria); $rs->setFetchmode(ResultSet::FETCHMODE_ASSOC); while ($rs->next()) { @@ -219,19 +211,13 @@ class ObjectPermission extends BaseObjectPermission $groupPermissions = array(); foreach ($records as $group) { - $oCriteria = new Criteria('workflow'); - $oCriteria->add(ObjectPermissionPeer::USR_UID, $group); - $oCriteria->add(ObjectPermissionPeer::PRO_UID, $proUid); - $oCriteria->add(ObjectPermissionPeer::OP_ACTION, $action); - $oCriteria->add( - $oCriteria->getNewCriterion(ObjectPermissionPeer::TAS_UID, $tasUid)->addOr( - $oCriteria->getNewCriterion(ObjectPermissionPeer::TAS_UID, '')->addOr( - $oCriteria->getNewCriterion(ObjectPermissionPeer::TAS_UID, '0') - ) - ) - ); + $criteria = new Criteria('workflow'); + $criteria->add(ObjectPermissionPeer::USR_UID, $group); + $criteria->add(ObjectPermissionPeer::PRO_UID, $proUid); + $criteria->add(ObjectPermissionPeer::OP_ACTION, ['','0',$action], Criteria::IN); + $criteria->add(ObjectPermissionPeer::TAS_UID, ['','0',$tasUid], Criteria::IN); - $rs = ObjectPermissionPeer::doSelectRS($oCriteria); + $rs = ObjectPermissionPeer::doSelectRS($criteria); $rs->setFetchmode(ResultSet::FETCHMODE_ASSOC); while ($rs->next()) { $row = $rs->getRow(); @@ -425,6 +411,44 @@ class ObjectPermission extends BaseObjectPermission return $result; } + /** + * Verify the access to the permission REASSIGN_MY_CASES over the case + * Check if the case is TO_DO and if the $tasUid is not empty we will to consider the thread in this task + * + * @param string $appUid the uid of the case + * @param string $proUid the uid of the process + * @param string $tasUid the uid of the target Task + * + * @return array + */ + public function objectPermissionByReassignCases($appUid, $proUid, $tasUid = '') + { + $result = []; + /*----------------------------------********---------------------------------*/ + $criteria = new Criteria('workflow'); + $criteria->addSelectColumn(ApplicationPeer::APP_UID); + $criteria->add(ApplicationPeer::APP_UID, $appUid, Criteria::EQUAL); + $criteria->add(ApplicationPeer::PRO_UID, $proUid, Criteria::EQUAL); + $criteria->add(ApplicationPeer::APP_STATUS, 'TO_DO', Criteria::EQUAL); + + //Review if the target task is OPEN + if (!empty($tasUid)) { + $criteria->addJoin(AppDelegationPeer::APP_NUMBER, ApplicationPeer::APP_NUMBER, Criteria::LEFT_JOIN); + $criteria->add(AppDelegationPeer::TAS_UID, $tasUid, Criteria::EQUAL); + $criteria->add(AppDelegationPeer::DEL_THREAD_STATUS, 'OPEN', Criteria::EQUAL); + } + + $dataset = ApplicationPeer::doSelectRS($criteria); + $dataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $dataset->next(); + if ($row = $dataset->getRow()) { + $result[] = $row['APP_UID']; + } + + /*----------------------------------********---------------------------------*/ + return $result; + } + /** * Verify if the user has a objectPermission for some process * diff --git a/workflow/engine/classes/model/map/ObjectPermissionMapBuilder.php b/workflow/engine/classes/model/map/ObjectPermissionMapBuilder.php index db912195d..d29439952 100644 --- a/workflow/engine/classes/model/map/ObjectPermissionMapBuilder.php +++ b/workflow/engine/classes/model/map/ObjectPermissionMapBuilder.php @@ -79,7 +79,7 @@ class ObjectPermissionMapBuilder $tMap->addColumn('OP_PARTICIPATE', 'OpParticipate', 'int', CreoleTypes::INTEGER, true, null); - $tMap->addColumn('OP_OBJ_TYPE', 'OpObjType', 'string', CreoleTypes::VARCHAR, true, 15); + $tMap->addColumn('OP_OBJ_TYPE', 'OpObjType', 'string', CreoleTypes::VARCHAR, true, 20); $tMap->addColumn('OP_OBJ_UID', 'OpObjUid', 'string', CreoleTypes::VARCHAR, true, 32); @@ -115,7 +115,7 @@ class ObjectPermissionMapBuilder $tMap->addValidator('OP_PARTICIPATE', 'required', 'propel.validator.RequiredValidator', '', 'Participation is required.'); - $tMap->addValidator('OP_OBJ_TYPE', 'maxLength', 'propel.validator.MaxLengthValidator', '15', 'Object type can be no larger than 15 in size'); + $tMap->addValidator('OP_OBJ_TYPE', 'maxLength', 'propel.validator.MaxLengthValidator', '20', 'Object type can be no larger than 20 in size'); $tMap->addValidator('OP_OBJ_TYPE', 'required', 'propel.validator.RequiredValidator', '', 'Object type is required.'); diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index eb8b6899f..371419304 100644 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -1998,7 +1998,7 @@ - + @@ -2031,7 +2031,7 @@ - + diff --git a/workflow/engine/content/translations/english/processmaker.en.po b/workflow/engine/content/translations/english/processmaker.en.po index 4fc00efb0..b427c6692 100644 --- a/workflow/engine/content/translations/english/processmaker.en.po +++ b/workflow/engine/content/translations/english/processmaker.en.po @@ -19109,6 +19109,12 @@ msgstr "After routing notify the next assigned user(s)" msgid "Notify users of case" msgstr "Notify users of case" +# TRANSLATION +# LABEL/ID_NOT_ABLE_REASSIGN +#: LABEL/ID_NOT_ABLE_REASSIGN +msgid "You are not able to reassign cases of this process." +msgstr "You are not able to reassign cases of this process." + # TRANSLATION # LABEL/ID_NOT_AVAILABLE_DATABASE #: LABEL/ID_NOT_AVAILABLE_DATABASE @@ -21743,6 +21749,12 @@ msgstr "Case #{APP_NUMBER} was reassigned to user {USER}." msgid "Reassign All Cases by Task" msgstr "Reassign All Cases by Task" +# TRANSLATION +# LABEL/ID_REASSIGN_CASE +#: LABEL/ID_REASSIGN_CASE +msgid "Reassign Case" +msgstr "Reassign Case" + # TRANSLATION # LABEL/ID_REASSIGN_CASES #: LABEL/ID_REASSIGN_CASES @@ -21755,6 +21767,12 @@ msgstr "Reassign Cases" msgid "Do you want to reassign the case?" msgstr "Do you want to reassign the case?" +# TRANSLATION +# LABEL/ID_REASSIGN_MY_CASES +#: LABEL/ID_REASSIGN_MY_CASES +msgid "Reassign my cases" +msgstr "Reassign my cases" + # TRANSLATION # LABEL/ID_REASSIGN_TO #: LABEL/ID_REASSIGN_TO diff --git a/workflow/engine/data/mysql/insert.sql b/workflow/engine/data/mysql/insert.sql index 66143c197..2e11be172 100644 --- a/workflow/engine/data/mysql/insert.sql +++ b/workflow/engine/data/mysql/insert.sql @@ -60049,6 +60049,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ( 'LABEL','ID_NOTIFY','en','Notify','2016-10-20') , ( 'LABEL','ID_NOTIFY_USERS_AFTER_ASSIGN','en','After routing notify the next assigned user(s)','2014-01-15') , ( 'LABEL','ID_NOTIFY_USERS_CASE','en','Notify users of case','2014-01-15') , +( 'LABEL','ID_NOT_ABLE_REASSIGN','en','You are not able to reassign cases of this process.','2018-05-15') , ( 'LABEL','ID_NOT_AVAILABLE_DATABASE','en','Not available.','2015-04-21') , ( 'LABEL','ID_NOT_CREATE_TABLE','en','Could not create the table with the name','2014-01-15') , ( 'LABEL','ID_NOT_DEFINED','en','Not defined','2014-01-15') , @@ -60499,8 +60500,10 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ( 'LABEL','ID_REASSIGNMENT_PAUSED_ERROR','en','The case is paused and can''t be reasigned.','2016-08-12') , ( 'LABEL','ID_REASSIGNMENT_SUCCESS','en','Case #{APP_NUMBER} was reassigned to user {USER}.','2014-01-15') , ( 'LABEL','ID_REASSIGN_ALL_CASES_BY_TASK','en','Reassign All Cases by Task','2014-01-15') , +( 'LABEL','ID_REASSIGN_CASE','en','Reassign Case','2018-05-15') , ( 'LABEL','ID_REASSIGN_CASES','en','Reassign Cases','2014-01-15') , ( 'LABEL','ID_REASSIGN_CONFIRM','en','Do you want to reassign the case?','2017-10-18') , +( 'LABEL','ID_REASSIGN_MY_CASES','en','Reassign my cases','2018-05-17') , ( 'LABEL','ID_REASSIGN_TO','en','Reassign','2014-01-15') , ( 'LABEL','ID_REASSIGN_USERS','en','User Reassignment','2014-01-15') , ( 'LABEL','ID_REBUILDING_TRANSLATIONS','en','Rebuilding translations','2014-01-15') , diff --git a/workflow/engine/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql index 3804849f8..126bbd4b7 100644 --- a/workflow/engine/data/mysql/schema.sql +++ b/workflow/engine/data/mysql/schema.sql @@ -952,7 +952,7 @@ CREATE TABLE `OBJECT_PERMISSION` `OP_USER_RELATION` INTEGER default 0 NOT NULL, `OP_TASK_SOURCE` VARCHAR(32) default '0', `OP_PARTICIPATE` INTEGER default 0 NOT NULL, - `OP_OBJ_TYPE` VARCHAR(15) default '0' NOT NULL, + `OP_OBJ_TYPE` VARCHAR(20) default '0' NOT NULL, `OP_OBJ_UID` VARCHAR(32) default '0' NOT NULL, `OP_ACTION` VARCHAR(10) default '0' NOT NULL, `OP_CASE_STATUS` VARCHAR(10) default '0', diff --git a/workflow/engine/methods/cases/ajaxListener.php b/workflow/engine/methods/cases/ajaxListener.php index f508a759f..3930f76a6 100644 --- a/workflow/engine/methods/cases/ajaxListener.php +++ b/workflow/engine/methods/cases/ajaxListener.php @@ -1,5 +1,6 @@ userCanAccess('PM_REASSIGNCASE') == 1) { + $proUid = $_SESSION['PROCESS']; + $appUid = $_SESSION['APPLICATION']; + $tasUid = $_SESSION['TASK']; + + $response = new stdclass(); + $cases = new BmCases(); + $userAuthorization = $cases->userAuthorization( + $RBAC->aUserInfo['USER_INFO']['USR_UID'], + $proUid, + $appUid, + ['PM_REASSIGNCASE', 'PM_REASSIGNCASE_SUPERVISOR'], + ['REASSIGN_MY_CASES' => ''], + true, + $tasUid + ); + + if ( + $userAuthorization['rolesPermissions']['PM_REASSIGNCASE'] || + ($userAuthorization['rolesPermissions']['PM_REASSIGNCASE_SUPERVISOR'] && $userAuthorization['supervisor']) || + in_array($appUid, $userAuthorization['objectPermissions']['REASSIGN_MY_CASES']) + ) { $response->reassigncase = true; $response->message = ''; - } elseif ($RBAC->userCanAccess('PM_REASSIGNCASE_SUPERVISOR') == 1) { + } else { $response->reassigncase = false; $response->message = G::LoadTranslation('ID_NOT_ABLE_REASSIGN'); - $processUser = new ProcessUser(); - $listProcess = $processUser->getProUidSupervisor($_SESSION['USER_LOGGED']); - if (in_array($_SESSION['PROCESS'], $listProcess)) { - $response->reassigncase = true; - } } print G::json_encode($response); die(); } } + class Ajax { public function getCaseMenu($params) @@ -144,61 +159,83 @@ class Ajax return $options; } + /** + * Get the options menu from action + * + * @return array + */ public function getActionOptions() { - $APP_UID = $_SESSION['APPLICATION']; + $appUid = $_SESSION['APPLICATION']; + $index = $_SESSION['INDEX']; + $proUid = $_SESSION['PROCESS']; + $tasUid = $_SESSION['TASK']; $c = new Criteria('workflow'); $c->clearSelectColumns(); $c->addSelectColumn(AppThreadPeer::APP_THREAD_PARENT); - $c->add(AppThreadPeer::APP_UID, $APP_UID); + $c->add(AppThreadPeer::APP_UID, $appUid); $c->add(AppThreadPeer::APP_THREAD_STATUS, 'OPEN'); $cant = AppThreadPeer::doCount($c); $oCase = new Cases(); - $aFields = $oCase->loadCase($_SESSION['APPLICATION'], $_SESSION['INDEX']); + $aFields = $oCase->loadCase($appUid, $index); global $RBAC; - $options = array(); + $options = []; switch ($aFields['APP_STATUS']) { case 'DRAFT': - if (!AppDelay::isPaused($_SESSION['APPLICATION'], $_SESSION['INDEX'])) { - $options[] = array('text' => G::LoadTranslation('ID_PAUSED_CASE'), 'fn' => 'setUnpauseCaseDate'); + if (!AppDelay::isPaused($appUid, $index)) { + $options[] = ['text' => G::LoadTranslation('ID_PAUSED_CASE'), 'fn' => 'setUnpauseCaseDate']; } else { - $options[] = array('text' => G::LoadTranslation('ID_UNPAUSE'), 'fn' => 'unpauseCase'); + $options[] = ['text' => G::LoadTranslation('ID_UNPAUSE'), 'fn' => 'unpauseCase']; } - $options[] = array('text' => G::LoadTranslation('ID_DELETE'), 'fn' => 'deleteCase'); + $options[] = ['text' => G::LoadTranslation('ID_DELETE'), 'fn' => 'deleteCase']; if ($RBAC->userCanAccess('PM_REASSIGNCASE') == 1 || $RBAC->userCanAccess('PM_REASSIGNCASE_SUPERVISOR') == 1) { - if (!AppDelay::isPaused($_SESSION['APPLICATION'], $_SESSION['INDEX'])) { - $options[] = array('text' => G::LoadTranslation('ID_REASSIGN'), 'fn' => 'getUsersToReassign'); + if (!AppDelay::isPaused($appUid, $index)) { + $options[] = ['text' => G::LoadTranslation('ID_REASSIGN'), 'fn' => 'getUsersToReassign']; } } break; case 'TO_DO': - if (!AppDelay::isPaused($_SESSION['APPLICATION'], $_SESSION['INDEX'])) { - $options[] = array('text' => G::LoadTranslation('ID_PAUSED_CASE'), 'fn' => 'setUnpauseCaseDate'); + if (!AppDelay::isPaused($appUid, $index)) { + $options[] = ['text' => G::LoadTranslation('ID_PAUSED_CASE'), 'fn' => 'setUnpauseCaseDate']; if ($cant == 1) { if ($RBAC->userCanAccess('PM_CANCELCASE') == 1) { - $options[] = array('text' => G::LoadTranslation('ID_CANCEL'), 'fn' => 'cancelCase'); + $options[] = ['text' => G::LoadTranslation('ID_CANCEL'), 'fn' => 'cancelCase']; } else { - $options[] = array('text' => G::LoadTranslation('ID_CANCEL'), 'fn' => 'cancelCase', 'hide' => 'hiden'); + $options[] = ['text' => G::LoadTranslation('ID_CANCEL'), 'fn' => 'cancelCase', 'hide' => 'hiden']; } } } else { - $options[] = array('text' => G::LoadTranslation('ID_UNPAUSE'), 'fn' => 'unpauseCase'); + $options[] = ['text' => G::LoadTranslation('ID_UNPAUSE'), 'fn' => 'unpauseCase']; } - if ($RBAC->userCanAccess('PM_REASSIGNCASE') == 1 || $RBAC->userCanAccess('PM_REASSIGNCASE_SUPERVISOR') == 1) { - if (!AppDelay::isPaused($_SESSION['APPLICATION'], $_SESSION['INDEX'])) { - $options[] = array('text' => G::LoadTranslation('ID_REASSIGN'), 'fn' => 'getUsersToReassign'); + $cases = new BmCases(); + $userAuthorization = $cases->userAuthorization( + $RBAC->aUserInfo['USER_INFO']['USR_UID'], + $proUid, + $appUid, + [], + ['REASSIGN_MY_CASES' => ''], + false, + $tasUid + ); + if ( + $RBAC->userCanAccess('PM_REASSIGNCASE') == 1 + || $RBAC->userCanAccess('PM_REASSIGNCASE_SUPERVISOR') == 1 + || in_array($appUid, $userAuthorization['objectPermissions']['REASSIGN_MY_CASES']) + ) { + if (!AppDelay::isPaused($appUid, $index)) { + $options[] = ['text' => G::LoadTranslation('ID_REASSIGN'), 'fn' => 'getUsersToReassign']; } } break; case 'CANCELLED': - $options[] = array('text' => G::LoadTranslation('ID_REACTIVATE'), 'fn' => 'reactivateCase'); + $options[] = ['text' => G::LoadTranslation('ID_REACTIVATE'), 'fn' => 'reactivateCase']; break; } @@ -217,9 +254,10 @@ class Ajax } if ($aTask['TAS_TYPE'] == 'ADHOC') { - $options[] = array('text' => G::LoadTranslation('ID_ADHOC_ASSIGNMENT'), 'fn' => 'adhocAssignmentUsers'); + $options[] = ['text' => G::LoadTranslation('ID_ADHOC_ASSIGNMENT'), 'fn' => 'adhocAssignmentUsers']; } } + return $options; } @@ -550,7 +588,7 @@ class Ajax $response = []; try { - $case = new \ProcessMaker\BusinessModel\Cases(); + $case = new BmCases(); $result = $case->getUsersToReassign($_SESSION['USER_LOGGED'], $taskUid, ['filter' => $search], $sortField, $sortDir, $start, $limit); diff --git a/workflow/engine/methods/cases/casesListExtJs.php b/workflow/engine/methods/cases/casesListExtJs.php index e59ff6f58..559698ee7 100644 --- a/workflow/engine/methods/cases/casesListExtJs.php +++ b/workflow/engine/methods/cases/casesListExtJs.php @@ -184,12 +184,13 @@ if ($licensedFeatures->verifyfeature('r19Vm5DK1UrT09MenlLYjZxejlhNUZ1b1NhV0JHWjB } /*----------------------------------********---------------------------------*/ -//menu permissions +/** Define actions menu in the cases list */ $cnt = ''; -$reassignCase = ($RBAC->userCanAccess('PM_REASSIGNCASE') == 1) ? 'true' : 'false'; -$reassignCaseSup = ($RBAC->userCanAccess('PM_REASSIGNCASE_SUPERVISOR') == 1) ? 'true':'false'; +$reassignCase = ($RBAC->userCanAccess('PM_REASSIGNCASE') == 1) ? 'true' : 'false'; +$reassignCaseSup = ($RBAC->userCanAccess('PM_REASSIGNCASE_SUPERVISOR') == 1) ? 'true' : 'false'; $oHeadPublisher->assign('varReassignCase', $reassignCase); $oHeadPublisher->assign('varReassignCaseSupervisor', $reassignCaseSup); + $c = new Configurations(); $oHeadPublisher->addExtJsScript('app/main', true); $oHeadPublisher->addExtJsScript('cases/casesList', false); //adding a javascript file .js diff --git a/workflow/engine/methods/cases/casesList_Ajax.php b/workflow/engine/methods/cases/casesList_Ajax.php index 2d0f27905..29a6aef1e 100644 --- a/workflow/engine/methods/cases/casesList_Ajax.php +++ b/workflow/engine/methods/cases/casesList_Ajax.php @@ -1,4 +1,5 @@ message = G::LoadTranslation('ID_LOGIN_AGAIN'); @@ -146,8 +147,10 @@ if ($actionAjax == "verifySession") { print G::json_encode($response); die(); } else { - $response = new stdclass(); + /** Action: Reassign from casesList */ GLOBAL $RBAC; + $response = new stdclass(); + //Check if the user is a supervisor to this Process if ($RBAC->userCanAccess('PM_REASSIGNCASE') == 1) { $response->reassigncase = true; @@ -160,7 +163,6 @@ if ($actionAjax == "verifySession") { $listProcess = $processUser->getProUidSupervisor($_SESSION['USER_LOGGED']); $response->processeslist = G::json_encode($listProcess); } - print G::json_encode($response); die(); } diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php index d92426e1d..6ca874fe6 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php @@ -3349,6 +3349,7 @@ class Cases * @param array $rolesPermissions, the roles that we need to review * @param array $objectPermissions, the permissions that we need to review * @param boolean $objectSupervisor, if we need to get all the objects supervisor + * @param string $tasUid * @return array */ public function userAuthorization( @@ -3357,7 +3358,8 @@ class Cases $appUid, $rolesPermissions = [], $objectPermissions = [], - $objectSupervisor = false + $objectSupervisor = false, + $tasUid = '' ) { $arrayAccess = []; @@ -3389,7 +3391,7 @@ class Cases if (count($objectPermissions) > 0) { $case = new ClassesCases(); foreach ($objectPermissions as $key => $value) { - $resPermission = $case->getAllObjectsFrom($proUid, $appUid, '', $usrUid, $value); + $resPermission = $case->getAllObjectsFrom($proUid, $appUid, $tasUid, $usrUid, $value); if (isset($resPermission[$key])) { $arrayAccess['objectPermissions'][$key] = $resPermission[$key]; } diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/ProcessPermissions.php b/workflow/engine/src/ProcessMaker/BusinessModel/ProcessPermissions.php index 862907bd8..7a4d21c0d 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/ProcessPermissions.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/ProcessPermissions.php @@ -1,11 +1,12 @@ @@ -13,6 +14,7 @@ use \Exception as StandardException; */ class ProcessPermissions { + const DOES_NOT_APPLY = 'N/A'; /** * Get list for Process Permissions * @@ -20,8 +22,6 @@ class ProcessPermissions * @var string $op_uid. Uid for Process Permission * * @access public - * @author Brayan Pereyra (Cochalo) - * @copyright Colosa - Bolivia * * @return array */ @@ -42,6 +42,14 @@ class ProcessPermissions $oDataset->setFetchmode(\ResultSet::FETCHMODE_ASSOC); $oDataset->next(); while ($aRow = $oDataset->getRow()) { + //Participated + if ($aRow['OP_PARTICIPATE'] == 0) { + $participated = G::LoadTranslation('ID_NO'); + } else { + $participated = G::LoadTranslation('ID_YES'); + } + //Obtain action (permission) + $action = G::LoadTranslation('ID_' . $aRow['OP_ACTION']); //Obtain task target if (($aRow['TAS_UID'] != '') && ($aRow['TAS_UID'] != '0')) { try { @@ -87,97 +95,87 @@ class ProcessPermissions //Obtain object and type switch ($aRow['OP_OBJ_TYPE']) { case 'ALL': - $sObjectType = G::LoadTranslation('ID_ALL'); - $sObject = G::LoadTranslation('ID_ALL'); + $objectType = G::LoadTranslation('ID_ALL'); + $object = G::LoadTranslation('ID_ALL'); break; case 'ANY': //For backward compatibility (some process with ANY instead of ALL - $sObjectType = G::LoadTranslation('ID_ALL'); - $sObject = G::LoadTranslation('ID_ALL'); + $objectType = G::LoadTranslation('ID_ALL'); + $object = G::LoadTranslation('ID_ALL'); break; - /* case 'ANY_DYNAFORM': - $sObjectType = G::LoadTranslation('ID_ANY_DYNAFORM'); - $sObject = G::LoadTranslation('ID_ALL'); - break; - case 'ANY_INPUT': - $sObjectType = G::LoadTranslation('ID_ANY_INPUT'); - $sObject = G::LoadTranslation('ID_ALL'); - break; - case 'ANY_OUTPUT': - $sObjectType = G::LoadTranslation('ID_ANY_OUTPUT'); - $sObject = G::LoadTranslation('ID_ALL'); - break; */ case 'DYNAFORM': - $sObjectType = G::LoadTranslation('ID_DYNAFORM'); + $objectType = G::LoadTranslation('ID_DYNAFORM'); if (($aRow['OP_OBJ_UID'] != '') && ($aRow['OP_OBJ_UID'] != '0')) { $oDynaform = new \Dynaform(); try { $aFields = $oDynaform->load($aRow['OP_OBJ_UID']); - $sObject = $aFields['DYN_TITLE']; + $object = $aFields['DYN_TITLE']; } catch (\Exception $errorNotExists) { - error_log($errorNotExists->getMessage() . ' - ' . G::LoadTranslation('ID_PROCESS_PERMISSIONS') . + error_log($errorNotExists->getMessage() . ' - ' . G::LoadTranslation('ID_PROCESS_PERMISSIONS') . ' - ' . $aRow['OP_OBJ_TYPE'] . ' - ' . $aRow['OP_OBJ_UID']); $oDataset->next(); continue 2; } } else { - $sObject = G::LoadTranslation('ID_ALL'); + $object = G::LoadTranslation('ID_ALL'); } break; case 'INPUT': - $sObjectType = G::LoadTranslation('ID_INPUT_DOCUMENT'); + $objectType = G::LoadTranslation('ID_INPUT_DOCUMENT'); if (($aRow['OP_OBJ_UID'] != '') && ($aRow['OP_OBJ_UID'] != '0')) { $oInputDocument = new \InputDocument(); try { $aFields = $oInputDocument->load($aRow['OP_OBJ_UID']); - $sObject = $aFields['INP_DOC_TITLE']; + $object = $aFields['INP_DOC_TITLE']; } catch (\Exception $errorNotExists) { - error_log($errorNotExists->getMessage() . ' - ' . G::LoadTranslation('ID_PROCESS_PERMISSIONS') . + error_log($errorNotExists->getMessage() . ' - ' . G::LoadTranslation('ID_PROCESS_PERMISSIONS') . ' - ' . $aRow['OP_OBJ_TYPE'] . ' - ' . $aRow['OP_OBJ_UID']); $oDataset->next(); continue 2; } } else { - $sObject = G::LoadTranslation('ID_ALL'); + $object = G::LoadTranslation('ID_ALL'); } break; case 'OUTPUT': - $sObjectType = G::LoadTranslation('ID_OUTPUT_DOCUMENT'); + $objectType = G::LoadTranslation('ID_OUTPUT_DOCUMENT'); if (($aRow['OP_OBJ_UID'] != '') && ($aRow['OP_OBJ_UID'] != '0')) { $oOutputDocument = new \OutputDocument(); try { $aFields = $oOutputDocument->load($aRow['OP_OBJ_UID']); - $sObject = $aFields['OUT_DOC_TITLE']; + $object = $aFields['OUT_DOC_TITLE']; } catch (\Exception $errorNotExists) { - error_log($errorNotExists->getMessage() . ' - ' . G::LoadTranslation('ID_PROCESS_PERMISSIONS') . + error_log($errorNotExists->getMessage() . ' - ' . G::LoadTranslation('ID_PROCESS_PERMISSIONS') . ' - ' . $aRow['OP_OBJ_TYPE'] . ' - ' . $aRow['OP_OBJ_UID']); $oDataset->next(); continue 2; } } else { - $sObject = G::LoadTranslation('ID_ALL'); + $object = G::LoadTranslation('ID_ALL'); } break; case 'CASES_NOTES': - $sObjectType = G::LoadTranslation('ID_CASES_NOTES'); - $sObject = 'N/A'; + $objectType = G::LoadTranslation('ID_CASES_NOTES'); + $object = self::DOES_NOT_APPLY; break; case 'MSGS_HISTORY': - $sObjectType = G::LoadTranslation('MSGS_HISTORY'); - $sObject = G::LoadTranslation('ID_ALL'); + $objectType = G::LoadTranslation('MSGS_HISTORY'); + $object = G::LoadTranslation('ID_ALL'); break; + /*----------------------------------********---------------------------------*/ + case 'REASSIGN_MY_CASES': + $objectType = G::LoadTranslation('ID_REASSIGN_MY_CASES'); + $object = self::DOES_NOT_APPLY; + $aRow['OP_ACTION'] = self::DOES_NOT_APPLY; + $participated = self::DOES_NOT_APPLY; + break; + /*----------------------------------********---------------------------------*/ default: - $sObjectType = G::LoadTranslation('ID_ALL'); - $sObject = G::LoadTranslation('ID_ALL'); + $objectType = G::LoadTranslation('ID_ALL'); + $object = G::LoadTranslation('ID_ALL'); + break; } - //Participated - if ($aRow['OP_PARTICIPATE'] == 0) { - $sParticipated = G::LoadTranslation('ID_NO'); - } else { - $sParticipated = G::LoadTranslation('ID_YES'); - } - //Obtain action (permission) - $sAction = G::LoadTranslation('ID_' . $aRow['OP_ACTION']); + //Add to array $arrayTemp = array(); $arrayTemp = array_merge($aRow, array( @@ -185,10 +183,10 @@ class ProcessPermissions 'TASK_TARGET' => $sTaskTarget, 'GROUP_USER' => $sUserGroup, 'TASK_SOURCE' => $sTaskSource, - 'OBJECT_TYPE' => $sObjectType, - 'OBJECT' => $sObject, - 'PARTICIPATED' => $sParticipated, - 'ACTION' => $sAction, + 'OBJECT_TYPE' => $objectType, + 'OBJECT' => $object, + 'PARTICIPATED' => $participated, + 'ACTION' => $action, 'OP_CASE_STATUS' => $aRow['OP_CASE_STATUS']) ); $aObjectsPermissions[] = array_change_key_case($arrayTemp, CASE_LOWER); @@ -213,7 +211,7 @@ class ProcessPermissions * * @access public * - * @return void + * @return void|array * @throws Exception */ public function saveProcessPermission($data, $opUid = '') @@ -226,7 +224,7 @@ class ProcessPermissions $opUid = $this->validateOpUid($opUid); } if (empty($data['USR_UID']) || (isset($data['USR_UID']) && $data['USR_UID'] === "null")) { - throw (new StandardException(G::LoadTranslation("ID_SELECT_USER_OR_GROUP"))); + throw (new Exception(G::LoadTranslation("ID_SELECT_USER_OR_GROUP"))); } if ($data['OP_USER_RELATION'] == "1") { $this->validateUsrUid($data['USR_UID']); @@ -244,50 +242,59 @@ class ProcessPermissions $data['OP_TASK_SOURCE'] = ''; } - $sObjectUID = ''; + $opCaseStatus = !empty($data['OP_CASE_STATUS']) ? $data['OP_CASE_STATUS'] : '0'; + $opObjectUid = ''; switch ($data['OP_OBJ_TYPE']) { case 'ANY': //case 'ANY_DYNAFORM':CASES_NOTES //case 'ANY_INPUT': //case 'ANY_OUTPUT': - $sObjectUID = ''; + $opObjectUid = ''; break; case 'DYNAFORM': $data['DYNAFORMS'] = $data['DYNAFORMS'] == 0 ? '': $data['DYNAFORMS']; if ($data['DYNAFORMS'] != '') { $this->validateDynUid($data['DYNAFORMS']); } - $sObjectUID = $data['DYNAFORMS']; + $opObjectUid = $data['DYNAFORMS']; break; case 'ATTACHED': - $sObjectUID = ''; + $opObjectUid = ''; break; case 'INPUT': $data['INPUTS'] = $data['INPUTS'] == 0 ? '': $data['INPUTS']; if ($data['INPUTS'] != '') { $this->validateInpUid($data['INPUTS']); } - $sObjectUID = $data['INPUTS']; + $opObjectUid = $data['INPUTS']; break; case 'OUTPUT': $data['OUTPUTS'] = $data['OUTPUTS'] == 0 ? '': $data['OUTPUTS']; if ($data['OUTPUTS'] != '') { $this->validateOutUid($data['OUTPUTS']); } - $sObjectUID = $data['OUTPUTS']; + $opObjectUid = $data['OUTPUTS']; + break; + case 'REASSIGN_MY_CASES': + $opCaseStatus = 'TO_DO'; + $data['OP_ACTION'] = ''; break; } - $oOP = new \ObjectPermission(); + $objectPermission = new ObjectPermission(); $permissionUid = ($opUid != '') ? $opUid : G::generateUniqueID(); $data['OP_UID'] = $permissionUid; - $data['OP_OBJ_UID'] = $sObjectUID; + $opParticipate = empty($data['OP_PARTICIPATE']) ? ObjectPermission::OP_PARTICIPATE_NO : $data['OP_PARTICIPATE']; + $data['OP_PARTICIPATE'] = $opParticipate; + $data['OP_CASE_STATUS'] = $opCaseStatus; + $data['OP_OBJ_UID'] = $opObjectUid; - if ($opUid == '') { - $oOP->fromArray( $data, \BasePeer::TYPE_FIELDNAME ); - $oOP->save(); - $daraRes = $oOP->load($permissionUid); - $daraRes = array_change_key_case($daraRes, CASE_LOWER); - return $daraRes; + if (empty($opUid)) { + $objectPermission->fromArray($data, BasePeer::TYPE_FIELDNAME); + $objectPermission->save(); + $newPermission = $objectPermission->load($permissionUid); + $newPermission = array_change_key_case($newPermission, CASE_LOWER); + + return $newPermission; } else { $data['TAS_UID'] = $data['TAS_UID'] != '' ? $data['TAS_UID'] : '0'; $data['OP_TASK_SOURCE'] = $data['OP_TASK_SOURCE'] != '' ? $data['OP_TASK_SOURCE'] : '0'; @@ -296,7 +303,8 @@ class ProcessPermissions $data['OP_OBJ_UID'] = $data['OP_OBJ_UID'] != '' ? $data['OP_OBJ_UID'] : '0'; $data['OP_ACTION'] = $data['OP_ACTION'] != '' ? $data['OP_ACTION'] : '0'; $data['OP_CASE_STATUS'] = $data['OP_CASE_STATUS'] != '' ? $data['OP_CASE_STATUS'] : '0'; - $oOP->update($data); + + $objectPermission->update($data); } } catch (Exception $e) { throw $e; diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Project/ProcessPermissions.php b/workflow/engine/src/ProcessMaker/Services/Api/Project/ProcessPermissions.php index 0bd76d30b..7a12670ce 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Project/ProcessPermissions.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Project/ProcessPermissions.php @@ -1,8 +1,10 @@ - * @copyright Colosa - Bolivia - * * @return array + * @throws RestException * * @url GET /:prj_uid/process-permissions */ public function doGetProcessPermissions($prj_uid) { try { - $processPermissions = new \ProcessMaker\BusinessModel\ProcessPermissions(); + $processPermissions = new BmProcessPermissions(); $response = $processPermissions->getProcessPermissions($prj_uid); return $response; - } catch (\Exception $e) { + } catch (Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } } @@ -39,20 +39,18 @@ class ProcessPermissions extends Api * @param string $prj_uid {@min 1} {@max 32} * @param string $ob_uid {@min 1} {@max 32} * - * @author Brayan Pereyra (Cochalo) - * @copyright Colosa - Bolivia - * * @return array + * @throws RestException * * @url GET /:prj_uid/process-permission/:ob_uid */ public function doGetProcessPermission($prj_uid, $ob_uid) { try { - $processPermissions = new \ProcessMaker\BusinessModel\ProcessPermissions(); + $processPermissions = new BmProcessPermissions(); $response = $processPermissions->getProcessPermissions($prj_uid, $ob_uid); return $response; - } catch (\Exception $e) { + } catch (Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } } @@ -75,11 +73,11 @@ class ProcessPermissions extends Api public function doPostProcessPermission($prj_uid, $request_data) { try { - $hiddenFields = array('task_target', 'group_user', 'task_source', + $hiddenFields = ['task_target', 'group_user', 'task_source', 'object_type', 'object', 'participated', 'action' - ); + ]; $request_data['pro_uid'] = $prj_uid; - $processPermissions = new \ProcessMaker\BusinessModel\ProcessPermissions(); + $processPermissions = new BmProcessPermissions(); $response = $processPermissions->saveProcessPermission($request_data); foreach ($response as $key => $eventData) { if (in_array($key, $hiddenFields)) { @@ -87,13 +85,13 @@ class ProcessPermissions extends Api } } return $response; - } catch (\Exception $e) { + } catch (Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } } /** - * Update process permisson. + * Update process permission. * * @url PUT /:prj_uid/process-permission/:ob_uid * @@ -104,7 +102,7 @@ class ProcessPermissions extends Api * @param string $op_user_relation {@from body} {@choice 1,2} * @param string $op_case_status {@from body} {@choice ALL,DRAFT,TO_DO,PAUSED,COMPLETED} * @param string $op_participate {@from body} {@choice 0,1} - * @param string $op_obj_type {@from body} {@choice ANY,DYNAFORM,ATTACHMENT,INPUT,OUTPUT,CASES_NOTES,MSGS_HISTORY,SUMMARY_FORM} + * @param string $op_obj_type {@from body} {@choice ANY,DYNAFORM,ATTACHMENT,INPUT,OUTPUT,CASES_NOTES,MSGS_HISTORY,SUMMARY_FORM,REASSIGN_MY_CASES} * @param string $op_action {@from body} {@choice VIEW,BLOCK,DELETE,RESEND} * @param string $tas_uid {@from body} * @param string $op_task_source {@from body} @@ -124,10 +122,10 @@ class ProcessPermissions extends Api $request_data, $usr_uid, $op_user_relation, - $op_case_status, - $op_participate, + $op_case_status = 'ALL', + $op_participate = '0', $op_obj_type, - $op_action, + $op_action = 'VIEW', $tas_uid = '', $op_task_source = '', $dynaforms = '', @@ -136,10 +134,11 @@ class ProcessPermissions extends Api ) { try { $request_data['pro_uid'] = $prj_uid; - $processPermissions = new \ProcessMaker\BusinessModel\ProcessPermissions(); + $request_data['op_action'] = $op_action; + $processPermissions = new BmProcessPermissions(); $response = $processPermissions->saveProcessPermission($request_data, $ob_uid); return $response; - } catch (\Exception $e) { + } catch (Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } } @@ -153,14 +152,14 @@ class ProcessPermissions extends Api * @param string $ob_uid {@min 1} {@max 32} * * @return void + * @throws RestException */ public function doDeleteProcessPermission($prj_uid, $ob_uid) { try { - $processPermissions = new \ProcessMaker\BusinessModel\ProcessPermissions(); - $response = $processPermissions->deleteProcessPermission($ob_uid, $prj_uid); - return $response; - } catch (\Exception $e) { + $processPermissions = new BmProcessPermissions(); + $processPermissions->deleteProcessPermission($ob_uid, $prj_uid); + } catch (Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } } diff --git a/workflow/engine/templates/cases/casesList.js b/workflow/engine/templates/cases/casesList.js index 22e822bdd..f44e7c2f6 100644 --- a/workflow/engine/templates/cases/casesList.js +++ b/workflow/engine/templates/cases/casesList.js @@ -1824,7 +1824,7 @@ Ext.onReady ( function() { }); winReassignInCasesList = new Ext.Window({ - title: '', + title: _('ID_REASSIGN_CASE'), width: 450, height: 350, layout:'auto', diff --git a/workflow/engine/templates/cases/open.js b/workflow/engine/templates/cases/open.js index 3b7457f0f..4ed41a35a 100644 --- a/workflow/engine/templates/cases/open.js +++ b/workflow/engine/templates/cases/open.js @@ -1127,7 +1127,7 @@ Ext.onReady(function(){ }); var winReassignInCasesList = new Ext.Window({ - title: '', + title: _('ID_REASSIGN_CASE'), width: 450, height: 350, layout: 'auto',