From c9152c20aef076e8c16e60e360a0aebdfefa77a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luciana=20Nu=C3=B1ez?= Date: Tue, 25 Oct 2022 17:05:13 -0400 Subject: [PATCH 01/15] PMCORE-4005 --- resources/assets/js/home/CaseDetail.vue | 17 +++++++++++++++-- .../translations/english/processmaker.en.po | 6 ++++++ workflow/engine/data/mysql/insert.sql | 1 + 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/resources/assets/js/home/CaseDetail.vue b/resources/assets/js/home/CaseDetail.vue index e755d46c7..a2933414a 100755 --- a/resources/assets/js/home/CaseDetail.vue +++ b/resources/assets/js/home/CaseDetail.vue @@ -10,12 +10,20 @@ > {{ dataAlert.message }} -

+

+

+
+
{{ $t("ID_CASE_DETAILS") }}
+
+ +
+
+ +
-

@@ -662,4 +670,9 @@ export default { padding-left: 50px; padding-right: 20px; } +.pm-in-text-icon { + font-size: 1.4rem; + padding-right: 10px; + line-height: 40px; +} \ No newline at end of file diff --git a/workflow/engine/content/translations/english/processmaker.en.po b/workflow/engine/content/translations/english/processmaker.en.po index 9723384c4..55f2b251a 100755 --- a/workflow/engine/content/translations/english/processmaker.en.po +++ b/workflow/engine/content/translations/english/processmaker.en.po @@ -4019,6 +4019,12 @@ msgstr "The case {0}: {1} with {2}: {3} does not exist." msgid "Case Description" msgstr "Case Description" +# TRANSLATION +# LABEL/ID_CASE_DETAILS +#: LABEL/ID_CASE_DETAILS +msgid "Case Details" +msgstr "Case Details" + # TRANSLATION # LABEL/ID_CASE_DOES_NOT_EXIST #: LABEL/ID_CASE_DOES_NOT_EXIST diff --git a/workflow/engine/data/mysql/insert.sql b/workflow/engine/data/mysql/insert.sql index 8bb2549d7..b101bb0b3 100755 --- a/workflow/engine/data/mysql/insert.sql +++ b/workflow/engine/data/mysql/insert.sql @@ -57403,6 +57403,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ( 'LABEL','ID_CASEDEMO','en','Case Demo','2014-01-15') , ( 'LABEL','ID_CASELIST_CAN_NOT_BE_IMPORTED_THE_PMTABLE_NOT_EXIST','en','Custom Case List {0} can not be imported because the PM Table does not exist in this Workspace.','2021-08-20') , ( 'LABEL','ID_CASE_DELETE_SUCCESFULLY','en','The Case was deleted successfully.','2020-01-08') , +( 'LABEL','ID_CASE_DETAILS','en','Case Details','2022-10-25') , ( 'LABEL','ID_CASE_UID','en','Case Uid','2021-04-04') , ( 'LABEL','ID_CASE_THREAD_TITLE','en','Case Thread Title','2021-08-27') , ( 'LABEL','ID_CASE_THREAD_TITLE_NAME','en','Case Thread Title Name','2021-09-29') , From 7ea223aa9907e18721a937a2b261886427fc9054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luciana=20Nu=C3=B1ez?= Date: Fri, 28 Oct 2022 17:05:13 -0400 Subject: [PATCH 02/15] PMCORE-4036 --- workflow/engine/skinEngine/neoclassic/css/app.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/skinEngine/neoclassic/css/app.css b/workflow/engine/skinEngine/neoclassic/css/app.css index 4d3313b8d..76fd761ec 100644 --- a/workflow/engine/skinEngine/neoclassic/css/app.css +++ b/workflow/engine/skinEngine/neoclassic/css/app.css @@ -473,7 +473,7 @@ a:hover { } .card-body { - background-color: #5aa4c4; + background-color: #0099DC; color: #fff; -ms-flex: 1 1 auto; flex: 1 1 auto; From 624102a815cfa5f7e56e957b64b88261c5069709 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luciana=20Nu=C3=B1ez?= Date: Fri, 4 Nov 2022 15:51:32 -0400 Subject: [PATCH 03/15] PMCORE-4057 --- .../src/ProcessMaker/Services/Api/Cases.php | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Cases.php b/workflow/engine/src/ProcessMaker/Services/Api/Cases.php index 19c9814e7..0537600fb 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Cases.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Cases.php @@ -1037,6 +1037,30 @@ class Cases extends Api } } + /** + * Assign Case + * + * @url PUT /:appUid/:usrUid/assign + * + * @param string $appUid {@min 1}{@max 32} + * @param string $usrUid {@min 1}{@max 32} + * @param integer $index {@from body} + * + * @throws RestException + * + * @access protected + * @class AccessControl {@permission PM_CASES} + */ + public function doPutAssignCase($appUid, $usrUid, $index) + { + try { + $cases = new BmCases(); + $cases->putClaimCase($appUid, $index, $usrUid); + } catch (Exception $e) { + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + } + /** * Execute trigger in a case. * From 98b919bab0344815c3cd89455d4f51b82bee5543 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luciana=20Nu=C3=B1ez?= Date: Mon, 7 Nov 2022 09:56:49 -0400 Subject: [PATCH 04/15] PMCORE-4058 --- .../ProcessMaker/BusinessModel/CasesTest.php | 59 +++++++++++++++++++ .../src/ProcessMaker/BusinessModel/Cases.php | 20 +++++++ .../src/ProcessMaker/Services/Api/Cases.php | 24 ++++++++ 3 files changed, 103 insertions(+) diff --git a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/CasesTest.php b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/CasesTest.php index 7d5dcdf60..c337a3adb 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/CasesTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/CasesTest.php @@ -11,6 +11,7 @@ use ProcessMaker\Model\Delegation; use ProcessMaker\Model\Documents; use ProcessMaker\Model\ListUnassigned; use ProcessMaker\Model\Process; +use ProcessMaker\Model\ProcessUser; use ProcessMaker\Model\Step; use ProcessMaker\Model\Task; use ProcessMaker\Model\Triggers; @@ -424,4 +425,62 @@ class CasesTest extends TestCase $this->assertArrayHasKey('PRO_UID', $result); } + /** + * It tests the response true of supervisor function + * + * @covers \ProcessMaker\BusinessModel\Cases::isSupervisor() + * @test + */ + public function it_should_test_supervisor_true() + { + $process = Process::factory()->create(); + ProcessUser::factory()->create([ + 'PU_TYPE' => 'SUPERVISOR', + 'PRO_UID' => $process->PRO_UID, + 'USR_UID' => $process->PRO_CREATE_USER + ]); + $application = Application::factory()->create([ + 'PRO_UID' => $process->PRO_UID + ]); + Delegation::factory()->create([ + 'APP_UID' => $application->APP_UID, + 'APP_NUMBER' => $application->APP_NUMBER, + 'PRO_UID' => $process->PRO_UID, + 'PRO_ID' => $process->PRO_ID + ]); + + $process = Process::factory()->create(); + + $cases = new Cases(); + $result = $cases->isSupervisor($process->PRO_CREATE_USER, $application->APP_NUMBER); + + // Asserts + $this->assertTrue($result); + } + + /** + * It tests the response false of supervisor function + * + * @covers \ProcessMaker\BusinessModel\Cases::isSupervisor() + * @test + */ + public function it_should_test_supervisor_false() + { + $process = Process::factory()->create(); + $application = Application::factory()->create([ + 'PRO_UID' => $process->PRO_UID + ]); + Delegation::factory()->create([ + 'APP_UID' => $application->APP_UID, + 'APP_NUMBER' => $application->APP_NUMBER, + 'PRO_UID' => $process->PRO_UID, + 'PRO_ID' => $process->PRO_ID + ]); + + $cases = new Cases(); + $result = $cases->isSupervisor($process->PRO_CREATE_USER, $application->APP_NUMBER); + + // Asserts + $this->assertNotTrue($result); + } } diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php index 8da2870e2..a376a3314 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php @@ -904,6 +904,26 @@ class Cases return $permission; } + /** + * Review if the user is supervisor + * + * @param string $usrUid + * @param int $caseNumber + * + * @return bool + */ + public function isSupervisor(string $usrUid, int $caseNumber) + { + $result = []; + $user = new BmUser(); + if ($user->checkPermission($usrUid, 'PM_SUPERVISOR')) { + $processes = ProcessUser::getProcessesOfSupervisor($usrUid); + $query = Delegation::query()->select(['APP_NUMBER'])->case($caseNumber)->processInList($processes); + $result = $query->get()->values()->toArray(); + } + return !empty($result); + } + /** * Reassign Case * diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Cases.php b/workflow/engine/src/ProcessMaker/Services/Api/Cases.php index 0537600fb..db64024db 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Cases.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Cases.php @@ -1036,6 +1036,30 @@ class Cases extends Api throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); } } + + /** + * User case supervisor permissions + * + * @url GET /:appNumber/supervisor + * + * @param int $appNumber + * + * @return boolean + * @throws RestException + * + * @access protected + * @class AccessControl {@permission PM_CASES} + */ + public function isSupervisor(int $appNumber) + { + try { + $userUid = $this->getUserId(); + $cases = new BmCases(); + return $cases->isSupervisor($userUid, $appNumber); + } catch (Exception $e) { + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + } /** * Assign Case From 3a38e8d2060c00babcc80b62d339143d7803a81c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luciana=20Nu=C3=B1ez?= Date: Wed, 16 Nov 2022 12:23:53 -0400 Subject: [PATCH 05/15] PMCORE-4060 --- .../engine/src/ProcessMaker/Services/Api/Cases.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Cases.php b/workflow/engine/src/ProcessMaker/Services/Api/Cases.php index db64024db..216ad4c77 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Cases.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Cases.php @@ -1068,18 +1068,26 @@ class Cases extends Api * * @param string $appUid {@min 1}{@max 32} * @param string $usrUid {@min 1}{@max 32} - * @param integer $index {@from body} + * @param int $index {@from body} + * @param string $reason {@from body} + * @param bool $sendMail {@from body} * * @throws RestException * * @access protected * @class AccessControl {@permission PM_CASES} */ - public function doPutAssignCase($appUid, $usrUid, $index) + public function doPutAssignCase($appUid, $usrUid, $index, $reason = '', $sendMail = false) { try { $cases = new BmCases(); $cases->putClaimCase($appUid, $index, $usrUid); + + /** Add the note */ + if (!empty($reason)) { + $currentUserUid = $this->getUserId(); + $cases->addNote($appUid, $currentUserUid, $reason, $sendMail); + } } catch (Exception $e) { throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); } From e030cf18bb7595c1e443229b1fccc6ed00bb114b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luciana=20Nu=C3=B1ez?= Date: Thu, 24 Nov 2022 10:18:35 -0400 Subject: [PATCH 06/15] PMCORE-4063 --- .../ProcessMaker/BusinessModel/CasesTest.php | 41 +++++++++++ .../src/ProcessMaker/BusinessModel/Cases.php | 72 +++++++++++++++++++ .../src/ProcessMaker/Services/Api/Cases.php | 27 +++++++ 3 files changed, 140 insertions(+) diff --git a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/CasesTest.php b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/CasesTest.php index c337a3adb..2af00b599 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/CasesTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/CasesTest.php @@ -9,6 +9,8 @@ use ProcessMaker\Model\AppDelay; use ProcessMaker\Model\Application; use ProcessMaker\Model\Delegation; use ProcessMaker\Model\Documents; +use ProcessMaker\Model\GroupUser; +use ProcessMaker\Model\Groupwf; use ProcessMaker\Model\ListUnassigned; use ProcessMaker\Model\Process; use ProcessMaker\Model\ProcessUser; @@ -483,4 +485,43 @@ class CasesTest extends TestCase // Asserts $this->assertNotTrue($result); } + + /** + * It tests get users to reassign + * + * @covers \ProcessMaker\BusinessModel\Cases::usersToReassign() + * @test + */ + public function it_should_test_users_to_reassign() + { + $process = Process::factory()->create(); + $task = Task::factory()->create([ + 'PRO_UID' => $process->PRO_UID, + 'TAS_ASSIGN_TYPE' => 'SELF_SERVICE', + 'TAS_GROUP_VARIABLE' => '@@arrayOfusers' + ]); + $users = User::factory(3)->create(); + $groupwf = Groupwf::factory()->create(); + + GroupUser::factory()->create([ + 'GRP_UID' => $groupwf->GRP_UID, + 'GRP_ID' => $groupwf->GRP_ID, + 'USR_UID' => $users[1]->USR_UID + ]); + GroupUser::factory()->create([ + 'GRP_UID' => $groupwf->GRP_UID, + 'GRP_ID' => $groupwf->GRP_ID, + 'USR_UID' => $users[2]->USR_UID + ]); + + $application = Application::factory()->create([ + 'PRO_UID' => $process->PRO_UID, + 'APP_DATA' => serialize(['arrayOfusers' => [$groupwf->GRP_UID, $users[0]->USR_UID]]) + ]); + + $cases = new Cases(); + $result = $cases->usersToReassign($users[0]['USR_UID'], $task->TAS_UID, $application->APP_UID); + // Asserts + $this->assertCount(3, $result['data']); + } } diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php index a376a3314..abf64e254 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php @@ -53,9 +53,12 @@ use ProcessMaker\Model\AppNotes as Notes; use ProcessMaker\Model\AppTimeoutAction; use ProcessMaker\Model\Delegation; use ProcessMaker\Model\Documents; +use ProcessMaker\Model\Groupwf; +use ProcessMaker\Model\GroupUser; use ProcessMaker\Model\ListUnassigned; use ProcessMaker\Model\Triggers; use ProcessMaker\Model\ProcessUser; +use ProcessMaker\Model\Task; use ProcessMaker\Model\User; use ProcessMaker\Plugins\PluginRegistry; use ProcessMaker\Services\Api; @@ -2761,6 +2764,75 @@ class Cases } } + /** + * Get Users to reassign + * + * @param string $userUid Unique id of User (User logged) + * @param string $taskUid Unique id of Task + * @param string $appUid Unique id of Application + * + * @return array Return Users to reassign + * @throws Exception + */ + public function usersToReassign( + $userUid, + $taskUid, + $appUid + ) { + $task = Task::where('TAS_UID', '=', $taskUid)->first(); + $type = $task->TAS_ASSIGN_TYPE; + $variable = $task->TAS_GROUP_VARIABLE; + $result = []; + + if ($type === 'SELF_SERVICE' && $variable !== '') { + $variable = substr($variable, 2); + $case = new ClassesCases(); + $app = new ModelApplication(); + $fields = $app::where('APP_UID', '=', $appUid)->first(); + $data = $case::unserializeData($fields->APP_DATA); + + $row = []; + $groups = new GroupUser(); + $groupwf = new Groupwf(); + + if (!empty($data[$variable])) { + foreach ($data[$variable] as $uid) { + $group = $groupwf::where('GRP_UID', '=', $uid)->first(); + if (!empty($group)) { + $users = $groups::where('GRP_UID', '=', $uid)->get()->toArray(); + foreach ($users as $data) { + $row[] = $data['USR_UID']; + } + } else { + $row[] = $uid; + } + } + } + + $user = new User(); + $users = []; + foreach ($row as $data) { + $obj = $user::where('USR_UID', '=', $data)->Active()->first(); + if (!is_null($obj) && $obj->USR_USERNAME !== "") { + $users[] = $obj; + } + } + + foreach ($users as $user) { + $result[] = [ + "USR_UID" => $user->USR_UID, + "USR_USERNAME" => $user->USR_USERNAME, + "USR_FIRSTNAME" => $user->USR_FIRSTNAME, + "USR_LASTNAME"=> $user->USR_LASTNAME + ]; + } + + } else { + $result = $this->getUsersToReassign($userUid, $taskUid)['data']; + } + return ['data' => $result]; + } + /** * Get Users to reassign * diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Cases.php b/workflow/engine/src/ProcessMaker/Services/Api/Cases.php index 216ad4c77..60c459d79 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Cases.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Cases.php @@ -1093,6 +1093,33 @@ class Cases extends Api } } + + + /** + * Get users to reassign or assign + * + * @url GET /:task_uid/:app_uid/userstoreassign + * + * @param string $task_uid + * @param string $app_uid + * + * @return array + * @throws RestException + * + * @access protected + * @class AccessControl {@permission PM_CASES} + */ + public function usersToReasign($task_uid, $app_uid) + { + try { + $usr_uid = $this->getUserId(); + $cases = new BmCases(); + return $cases->usersToReassign($usr_uid, $task_uid, $app_uid); + } catch (Exception $e) { + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + } + /** * Execute trigger in a case. * From fbb4fabad6c41ca86b57081084eadc74ed7c6bbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luciana=20Nu=C3=B1ez?= Date: Fri, 2 Dec 2022 15:55:09 -0400 Subject: [PATCH 07/15] PMCORE-4075 --- workflow/engine/classes/WsBase.php | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/workflow/engine/classes/WsBase.php b/workflow/engine/classes/WsBase.php index 1569b9595..2342ee227 100644 --- a/workflow/engine/classes/WsBase.php +++ b/workflow/engine/classes/WsBase.php @@ -12,6 +12,7 @@ use ProcessMaker\Core\JobsManager; use ProcessMaker\Core\System; use ProcessMaker\Model\Application; use ProcessMaker\Model\Delegation; +use ProcessMaker\Model\Task; class WsBase { @@ -2989,8 +2990,21 @@ class WsBase } $tasUid = $aRow['TAS_UID']; - $derivation = new Derivation(); - $userList = $derivation->getAllUsersFromAnyTask($tasUid, true); + $task = Task::where('TAS_UID', '=', $tasUid)->first(); + $type = $task->TAS_ASSIGN_TYPE; + $variable = $task->TAS_GROUP_VARIABLE; + + if ($type === 'SELF_SERVICE' && $variable !== '') { + $cases = new BmCases(); + $usersToReasign = $cases->usersToReassign($sessionId, $tasUid, $caseId)['data']; + $userList = []; + foreach ($usersToReasign as $user){ + $userList[] = $user['USR_UID']; + } + } else { + $derivation = new Derivation(); + $userList = $derivation->getAllUsersFromAnyTask($tasUid, true); + } if (!in_array($userIdTarget, $userList)) { $result = new WsResponse(34, G::loadTranslation('ID_TARGET_USER_DOES_NOT_HAVE_RIGHTS')); From 6b2c5594c33170f905b577426382c03fd303cec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luciana=20Nu=C3=B1ez?= Date: Mon, 5 Dec 2022 13:16:01 -0400 Subject: [PATCH 08/15] PMCORE-4079 --- workflow/engine/classes/WsBase.php | 13 ++++++++----- .../src/ProcessMaker/BusinessModel/Cases.php | 15 ++++++++------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/workflow/engine/classes/WsBase.php b/workflow/engine/classes/WsBase.php index 2342ee227..631e5e23c 100644 --- a/workflow/engine/classes/WsBase.php +++ b/workflow/engine/classes/WsBase.php @@ -3007,11 +3007,14 @@ class WsBase } if (!in_array($userIdTarget, $userList)) { - $result = new WsResponse(34, G::loadTranslation('ID_TARGET_USER_DOES_NOT_HAVE_RIGHTS')); - - $g->sessionVarRestore(); - - return $result; + $bmCase = new BmCases(); + if (!$bmCase->isSupervisor($userIdTarget, $rows['APP_NUMBER'])){ + $result = new WsResponse(34, G::loadTranslation('ID_TARGET_USER_DOES_NOT_HAVE_RIGHTS')); + + $g->sessionVarRestore(); + + return $result; + } } /** diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php index abf64e254..9430d8fb1 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php @@ -1162,16 +1162,17 @@ class Cases $appDelegation = new AppDelegation(); $delegation = $appDelegation->load($appUid, $index); if (empty($delegation['USR_UID'])) { - $case = new ClassesCases(); - $case->loadCase($appUid); + $classesCase = new ClassesCases(); + $case = $classesCase->loadCase($appUid); //Review if the user can be claim the case - if (!$case->isSelfService($userUid, $delegation['TAS_UID'], $appUid)) { - $message = preg_replace("##i", "", G::LoadTranslation("ID_NO_PERMISSION_NO_PARTICIPATED")); - throw new Exception($message); + if (!$classesCase->isSelfService($userUid, $delegation['TAS_UID'], $appUid)) { + if (!$this->isSupervisor($userUid, $case['APP_NUMBER'])){ + $message = preg_replace("##i", "", G::LoadTranslation("ID_NO_PERMISSION_NO_PARTICIPATED")); + throw new Exception($message); + } } - - $case->setCatchUser($appUid, $index, $userUid); + $classesCase->setCatchUser($appUid, $index, $userUid); } else { throw new Exception(G::LoadTranslation("ID_CASE_USER_INVALID_CLAIM_CASE", [$userUid])); } From 920c610e2564f7a72e549125737b496aa4e3176f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luciana=20Nu=C3=B1ez?= Date: Thu, 3 Nov 2022 15:04:29 -0400 Subject: [PATCH 09/15] PMCORE-4006 --- resources/assets/js/api/Cases.js | 66 ++++++ resources/assets/js/api/Services.js | 3 + resources/assets/js/home/CaseDetail.vue | 117 ++++++++++- resources/assets/js/home/MyCases/MyCases.vue | 1 + .../assets/js/home/modal/ModalAssignCase.vue | 190 ++++++++++++++++++ .../js/home/modal/ModalReassignCase.vue | 67 ++++-- .../translations/english/processmaker.en.po | 12 ++ workflow/engine/data/mysql/insert.sql | 2 + 8 files changed, 435 insertions(+), 23 deletions(-) create mode 100644 resources/assets/js/home/modal/ModalAssignCase.vue diff --git a/resources/assets/js/api/Cases.js b/resources/assets/js/api/Cases.js index ff4baab68..f522e9ca1 100644 --- a/resources/assets/js/api/Cases.js +++ b/resources/assets/js/api/Cases.js @@ -239,6 +239,21 @@ export let cases = { } }); }, + /** + * get the list of users to re-assign + * @param {*} data + * @returns + */ + getUsersToReassign(data) { + return Api.get({ + service: "GET_USERS_TO_REASSIGN", + data: {}, + keys: { + task_uid: data.TAS_UID, + app_uid: data.APP_UID + } + }); + }, reassingCase(data) { return Api.update({ service: "REASSIGN_CASE", @@ -254,6 +269,25 @@ export let cases = { } }); }, + /** + * Reassign a case to a new user + * @param {*} data + */ + reassingCaseSupervisor(data) { + return Api.update({ + service: "REASSIGN_CASE", + data: { + usr_uid_target: data.userSelected, + del_index: data.DEL_INDEX, + reason: data.reasonReassign, + sendMail: data.notifyUser, + usr_uid_source: data.USR_UID + }, + keys: { + app_uid: data.APP_UID + } + }); + }, /** * Claim case with endpoint * @param {*} data @@ -270,6 +304,38 @@ export let cases = { } }); }, + /** + * Assign case with endpoint + * @param {*} data + * @returns + */ + assignCase(data) { + return Api.update({ + service: "ASSIGN_CASE", + data: { + reason: data.reasonReassign, + sendMail: data.notifyUser, + index: data.DEL_INDEX + }, + keys: { + app_uid: data.APP_UID, + usr_uid: data.userSelected + } + }); + }, + /** + * Verify if the user is Supervisor + * @param {*} data + * @returns + */ + getIsSupervisor(data) { + return Api.get({ + service: "IS_SUPERVISOR", + keys: { + app_num: data + } + }); + }, /** * Service to jump a case by it's number * @param {object} dt diff --git a/resources/assets/js/api/Services.js b/resources/assets/js/api/Services.js index 71183beb5..bf3cae70b 100644 --- a/resources/assets/js/api/Services.js +++ b/resources/assets/js/api/Services.js @@ -1,4 +1,6 @@ export default { + ASSIGN_CASE: "/cases/{app_uid}/{usr_uid}/assign", + IS_SUPERVISOR: "/cases/{app_num}/supervisor", AUTHENTICATE_USER: "/oauth2/token", USER_DATA: "/light/user/data", GET_MAIN_MENU_COUNTERS: "/light/counters", @@ -10,6 +12,7 @@ GET_LISTS_PAUSED: "/light/paused", GET_LISTS_COMPLETED: "/light/completed", GET_USERS_PICTURES: "/light/users/data", + GET_USERS_TO_REASSIGN: "/cases/{task_uid}/{app_uid}/userstoreassign", FORMS_ARRAY: "/light/project/{pro_uid}/activity/{act_uid}/steps", GET_NEW_CASES: "/case/start-cases?type_view=category", GET_HISTORY_CASES: "/light/history/{app_uid}", diff --git a/resources/assets/js/home/CaseDetail.vue b/resources/assets/js/home/CaseDetail.vue index a2933414a..dde49e1f5 100755 --- a/resources/assets/js/home/CaseDetail.vue +++ b/resources/assets/js/home/CaseDetail.vue @@ -54,7 +54,7 @@
{{ $t("ID_CONTINUE") }}{{ $t("ID_UNPAUSE") }} + + + {{ $t("ID_ASSIGN") }} + + + + {{ $t("ID_REASSIGN") }} +
+
+ + + {{ $t("ID_REVIEW_CASE") }} + +
+ + + @@ -125,9 +154,11 @@ import CaseComment from "../components/home/caseDetail/CaseComment"; import CaseComments from "../components/home/caseDetail/CaseComments"; import TabsCaseDetail from "../home/TabsCaseDetail.vue"; import ButtonFleft from "../components/home/ButtonFleft.vue"; +import ModalAssignCase from "./modal/ModalAssignCase.vue"; import ModalCancelCase from "../home/modal/ModalCancelCase.vue"; import ModalNewRequest from "./ModalNewRequest.vue"; import ModalClaimCase from "./modal/ModalClaimCase.vue"; +import ModalReassignCase from "./modal/ModalReassignCase.vue"; import TaskCell from "../components/vuetable/TaskCell.vue"; import CurrentUserCell from "../components/vuetable/CurrentUserCell.vue" import utils from "./../utils/utils"; @@ -143,10 +174,12 @@ export default { AttachedDocumentsEdit, CaseComment, CaseComments, + ModalAssignCase, ModalCancelCase, ButtonFleft, ModalNewRequest, ModalClaimCase, + ModalReassignCase, TaskCell, CurrentUserCell }, @@ -230,7 +263,11 @@ export default { dataComments: { title: "Comments", items: [] - } + }, + dataCaseReview: {}, + app_num: this.$parent.dataCase.APP_NUMBER, + supervisor: false, + flagSupervising: false }; }, @@ -242,6 +279,7 @@ export default { //set dataCase this.dataCase = this.$parent.dataCase; this.$el.getElementsByClassName("VuePagination__count")[0].remove(); + this.changeFlagSupervising(this.dataCase.FLAG); this.getDataCaseSummary(); this.getInputDocuments(); this.getOutputDocuments(); @@ -506,6 +544,8 @@ export default { .pendingtask(that.$parent.dataCase) .then((response) => { dt = that.formatDataResponse(response.data); + this.dataCaseReview = dt[0]; + this.supervisor = that.isSupervisor(); resolutionFunc({ data: dt, count: response.data.length, @@ -538,7 +578,8 @@ export default { PRO_UID: v.PRO_UID, TAS_UID: v.TAS_UID, UNASSIGNED: v.UNASSIGNED, - USR_ID: v.USR_ID + USR_ID: v.USR_ID, + USR_UID: v.USR_UID }); }); return data; @@ -606,6 +647,21 @@ export default { this.$emit("onUpdatePage", "XCase"); } }, + /** + * Review case Click handler + * + * @param {object} data + */ + onClickReview(data) { + this.$emit("onUpdateDataCase", { + APP_UID: data.APP_UID, + DEL_INDEX: data.DEL_INDEX, + PRO_UID: data.PRO_UID, + TAS_UID: data.TAS_UID, + ACTION: "to_revise" + }); + this.$emit("onUpdatePage", "XCase"); + }, /** * Unpause click handler * @@ -622,6 +678,58 @@ export default { .catch((error) => { that.showAlert(error.response.data.error.message, 'danger'); }); + }, + /** + * Assign click handler + * + * @param {object} item + */ + onClickAssign(item) { + let that = this; + Api.cases.open(_.extend({ ACTION: "assign" }, item)).then(() => { + Api.cases.cases_open(_.extend({ ACTION: "todo" }, item)).then(() => { + that.$refs["modal-assign-case"].data = item; + that.$refs["modal-assign-case"].show(); + }); + }); + }, + /** + * Reassign click handler + * + * @param {object} item + */ + onClickReassign(item) { + let that = this; + item.FLAG = this.flagSupervising; + Api.cases.open(_.extend({ ACTION: "reassign" }, item)).then(() => { + Api.cases.cases_open(_.extend({ ACTION: "todo" }, item)).then(() => { + that.$refs["modal-reassign-case"].data = item; + that.$refs["modal-reassign-case"].show(); + }); + }); + }, + /** + * Is supervisor + * + * @return {bool} response + */ + isSupervisor() { + Api.cases.getIsSupervisor(this.app_num).then((response) => { + let res = false; + if (response.statusText === "OK" || response.status === 200) { + this.supervisor = response.data; + } + }) + }, + /** + * Change the flag supervisor + * + * @param {string} data + */ + changeFlagSupervising(data) { + if (data === 'SUPERVISING'){ + this.flagSupervising = true; + } }, /** * Claim case @@ -675,4 +783,7 @@ export default { padding-right: 10px; line-height: 40px; } +.table td, .table th { + vertical-align: middle; +} \ No newline at end of file diff --git a/resources/assets/js/home/MyCases/MyCases.vue b/resources/assets/js/home/MyCases/MyCases.vue index 72bc4ed0a..957dff815 100755 --- a/resources/assets/js/home/MyCases/MyCases.vue +++ b/resources/assets/js/home/MyCases/MyCases.vue @@ -358,6 +358,7 @@ export default { PRO_UID: item.PRO_UID, TAS_UID: item.TAS_UID, APP_NUMBER: item.CASE_NUMBER, + FLAG: this.filterHeader, ACTION: that.filterHeader === "SUPERVISING" ? "to_revise" diff --git a/resources/assets/js/home/modal/ModalAssignCase.vue b/resources/assets/js/home/modal/ModalAssignCase.vue new file mode 100644 index 000000000..83b5f39a8 --- /dev/null +++ b/resources/assets/js/home/modal/ModalAssignCase.vue @@ -0,0 +1,190 @@ + + + \ No newline at end of file diff --git a/resources/assets/js/home/modal/ModalReassignCase.vue b/resources/assets/js/home/modal/ModalReassignCase.vue index d8e2f021f..d85490b15 100644 --- a/resources/assets/js/home/modal/ModalReassignCase.vue +++ b/resources/assets/js/home/modal/ModalReassignCase.vue @@ -7,7 +7,7 @@ > { + api.cases.getUserToReassign(this.data).then((response) => { var users = response.data.data, i; if (response.statusText == "OK" || response.status === 200) { @@ -146,25 +151,47 @@ export default { this.data.userSelected = this.userSelected; this.data.reasonReassign = this.reasonReassign; this.notifyUser = this.notifyUser; - api.cases.reassingCase(this.data).then((response) => { - if (response.statusText == "OK" || response.status === 200) { - that.$refs["modal-reassign-case"].hide(); - if (that.$parent.$refs["vueTable"] !== undefined) { - that.$parent.$refs["vueTable"].getData(); + if (!this.data.FLAG){ + api.cases.reassingCase(this.data).then((response) => { + if (response.statusText == "OK" || response.status === 200) { + that.$refs["modal-reassign-case"].hide(); + if (that.$parent.$refs["vueTable"] !== undefined) { + that.$parent.$refs["vueTable"].getData(); + } + if (that.$parent.$refs["vueListView"] !== undefined) { + that.$parent.$refs["vueListView"].getData(); + } + if (that.$parent.$refs["vueCardView"] !== undefined) { + that.$parent.$refs["vueCardView"].getData(); + } } - if (that.$parent.$refs["vueListView"] !== undefined) { - that.$parent.$refs["vueListView"].getData(); + }) + .catch((e) => { + if(e.response.data && e.response.data.error){ + that.showAlert(e.response.data.error.message, "danger"); } - if (that.$parent.$refs["vueCardView"] !== undefined) { - that.$parent.$refs["vueCardView"].getData(); + }); + } else { + api.cases.reassingCaseSupervisor(this.data).then((response) => { + if (response.statusText == "OK" || response.status === 200) { + that.$refs["modal-reassign-case"].hide(); + if (that.$parent.$refs["vueTable"] !== undefined) { + that.$parent.$refs["vueTable"].getData(); + } + if (that.$parent.$refs["vueListView"] !== undefined) { + that.$parent.$refs["vueListView"].getData(); + } + if (that.$parent.$refs["vueCardView"] !== undefined) { + that.$parent.$refs["vueCardView"].getData(); + } } - } - }) - .catch((e) => { - if(e.response.data && e.response.data.error){ - that.showAlert(e.response.data.error.message, "danger"); - } - }); + }) + .catch((e) => { + if(e.response.data && e.response.data.error){ + that.showAlert(e.response.data.error.message, "danger"); + } + }); + } }, /** * Show the alert message diff --git a/workflow/engine/content/translations/english/processmaker.en.po b/workflow/engine/content/translations/english/processmaker.en.po index 55f2b251a..4e62b8735 100755 --- a/workflow/engine/content/translations/english/processmaker.en.po +++ b/workflow/engine/content/translations/english/processmaker.en.po @@ -2419,6 +2419,12 @@ msgstr "Array of variables is empty" msgid "Assign" msgstr "Assign" +# TRANSLATION +# LABEL/ID_ASSIGN_CASE +#: LABEL/ID_ASSIGN_CASE +msgid "Assign Case" +msgstr "Assign Case" + # TRANSLATION # LABEL/ID_ASSIGNED_FIEDS #: LABEL/ID_ASSIGNED_FIEDS @@ -24017,6 +24023,12 @@ msgstr "Resume" msgid "Return" msgstr "Return" +# TRANSLATION +# LABEL/ID_REVIEW_CASE +#: LABEL/ID_REVIEW_CASE +msgid "Review Case" +msgstr "Review Case" + # TRANSLATION # LABEL/ID_RIGHT #: LABEL/ID_RIGHT diff --git a/workflow/engine/data/mysql/insert.sql b/workflow/engine/data/mysql/insert.sql index b101bb0b3..8da14ffab 100755 --- a/workflow/engine/data/mysql/insert.sql +++ b/workflow/engine/data/mysql/insert.sql @@ -57205,6 +57205,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ( 'LABEL','ID_ARE_YOU_SURE_UNPAUSE_TASK','en','Are you sure want to unpause the task?','2021-01-26') , ( 'LABEL','ID_ARRAY_VARIABLES_EMPTY','en','Array of variables is empty','2014-01-15') , ( 'LABEL','ID_ASSIGN','en','Assign','2014-01-15') , +( 'LABEL','ID_ASSIGN_CASE','en','Assign Case','2022-11-04') , ( 'LABEL','ID_ASSIGNED_FIEDS','en','ASSIGNED FIELDS','2014-01-15') , ( 'LABEL','ID_ASSIGNED_GROUPS','en','ASSIGNED GROUPS','2014-01-15') , ( 'LABEL','ID_ASSIGNED_MEMBERS','en','MEMBERS','2014-01-15') , @@ -60924,6 +60925,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ( 'LABEL','ID_RESTORING_CASE','en','Restoring case','2015-09-15') , ( 'LABEL','ID_RESULT','en','Result','2014-01-15') , ( 'LABEL','ID_RESUME','en','Resume','2014-01-15') , +( 'LABEL','ID_REVIEW_CASE','en','Review Case','2022-11-10') , ( 'LABEL','ID_RETURN_ADVANCED_SEARCH','en','Return','2019-07-17') , ( 'LABEL','ID_RIGHT','en','right','2014-09-18') , ( 'LABEL','ID_RIGHT_MARGIN','en','Right Margin','2014-01-15') , From a1e77e3a5963c1a760685c8876df0702aaabef45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luciana=20Nu=C3=B1ez?= Date: Tue, 6 Dec 2022 12:18:03 -0400 Subject: [PATCH 10/15] PMCORE-4083 --- resources/assets/js/home/modal/ModalAssignCase.vue | 2 +- resources/assets/js/home/modal/ModalReassignCase.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) mode change 100644 => 100755 resources/assets/js/home/modal/ModalAssignCase.vue mode change 100644 => 100755 resources/assets/js/home/modal/ModalReassignCase.vue diff --git a/resources/assets/js/home/modal/ModalAssignCase.vue b/resources/assets/js/home/modal/ModalAssignCase.vue old mode 100644 new mode 100755 index 83b5f39a8..0cdd309ab --- a/resources/assets/js/home/modal/ModalAssignCase.vue +++ b/resources/assets/js/home/modal/ModalAssignCase.vue @@ -121,7 +121,7 @@ export default { */ getUsers() { let that = this; - api.cases.getUserToReassign(this.data).then((response) => { + api.cases.getUsersToReassign(this.data).then((response) => { var users = response.data.data, i; if (response.statusText == "OK" || response.status === 200) { diff --git a/resources/assets/js/home/modal/ModalReassignCase.vue b/resources/assets/js/home/modal/ModalReassignCase.vue old mode 100644 new mode 100755 index d85490b15..a92778ad7 --- a/resources/assets/js/home/modal/ModalReassignCase.vue +++ b/resources/assets/js/home/modal/ModalReassignCase.vue @@ -125,7 +125,7 @@ export default { */ getUsersReassign() { let that = this; - api.cases.getUserToReassign(this.data).then((response) => { + api.cases.getUsersToReassign(this.data).then((response) => { var users = response.data.data, i; if (response.statusText == "OK" || response.status === 200) { From e97ae0f9176232e968c816af7c64e79ba3b6b777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luciana=20Nu=C3=B1ez?= Date: Tue, 6 Dec 2022 12:37:01 -0400 Subject: [PATCH 11/15] PMCORE-4004: Solving last comments --- resources/assets/js/api/Cases.js | 2 +- resources/assets/js/home/CaseDetail.vue | 4 +--- .../src/ProcessMaker/BusinessModel/Cases.php | 17 ++++++----------- .../src/ProcessMaker/Services/Api/Cases.php | 4 +--- 4 files changed, 9 insertions(+), 18 deletions(-) mode change 100644 => 100755 resources/assets/js/api/Cases.js mode change 100644 => 100755 workflow/engine/src/ProcessMaker/BusinessModel/Cases.php mode change 100644 => 100755 workflow/engine/src/ProcessMaker/Services/Api/Cases.php diff --git a/resources/assets/js/api/Cases.js b/resources/assets/js/api/Cases.js old mode 100644 new mode 100755 index f522e9ca1..13d737ffb --- a/resources/assets/js/api/Cases.js +++ b/resources/assets/js/api/Cases.js @@ -240,7 +240,7 @@ export let cases = { }); }, /** - * get the list of users to re-assign + * Get the list of users to re-assign * @param {*} data * @returns */ diff --git a/resources/assets/js/home/CaseDetail.vue b/resources/assets/js/home/CaseDetail.vue index dde49e1f5..2a56d5022 100755 --- a/resources/assets/js/home/CaseDetail.vue +++ b/resources/assets/js/home/CaseDetail.vue @@ -727,9 +727,7 @@ export default { * @param {string} data */ changeFlagSupervising(data) { - if (data === 'SUPERVISING'){ - this.flagSupervising = true; - } + this.flagSupervising = (data === 'SUPERVISING'); }, /** * Claim case diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php old mode 100644 new mode 100755 index 9430d8fb1..9cf14b4f8 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php @@ -2787,21 +2787,17 @@ class Cases if ($type === 'SELF_SERVICE' && $variable !== '') { $variable = substr($variable, 2); - $case = new ClassesCases(); - $app = new ModelApplication(); - $fields = $app::where('APP_UID', '=', $appUid)->first(); - $data = $case::unserializeData($fields->APP_DATA); + $fields = ModelApplication::where('APP_UID', '=', $appUid)->first(); + $data = ClassesCases::unserializeData($fields->APP_DATA); $row = []; - $groups = new GroupUser(); - $groupwf = new Groupwf(); if (!empty($data[$variable])) { foreach ($data[$variable] as $uid) { - $group = $groupwf::where('GRP_UID', '=', $uid)->first(); + $group = Groupwf::where('GRP_UID', '=', $uid)->first(); if (!empty($group)) { - $users = $groups::where('GRP_UID', '=', $uid)->get()->toArray(); - foreach ($users as $data) { + $usersOfGroup = GroupUser::where('GRP_UID', '=', $uid)->get()->toArray(); + foreach ($usersOfGroup as $data) { $row[] = $data['USR_UID']; } } else { @@ -2810,10 +2806,9 @@ class Cases } } - $user = new User(); $users = []; foreach ($row as $data) { - $obj = $user::where('USR_UID', '=', $data)->Active()->first(); + $obj = User::where('USR_UID', '=', $data)->Active()->first(); if (!is_null($obj) && $obj->USR_USERNAME !== "") { $users[] = $obj; } diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Cases.php b/workflow/engine/src/ProcessMaker/Services/Api/Cases.php old mode 100644 new mode 100755 index 60c459d79..7785394a0 --- a/workflow/engine/src/ProcessMaker/Services/Api/Cases.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Cases.php @@ -1038,7 +1038,7 @@ class Cases extends Api } /** - * User case supervisor permissions + * Verify if current user is a supervisor * * @url GET /:appNumber/supervisor * @@ -1093,8 +1093,6 @@ class Cases extends Api } } - - /** * Get users to reassign or assign * From 3f88a7d75d58a0f112d8b9971c5eb5a94642cd38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luciana=20Nu=C3=B1ez?= Date: Wed, 7 Dec 2022 11:48:46 -0400 Subject: [PATCH 12/15] PMCORE-4088 --- .../src/ProcessMaker/BusinessModel/Cases.php | 31 +++++++++++++++++-- .../src/ProcessMaker/Services/Api/Cases.php | 4 +-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php index 9cf14b4f8..23428442c 100755 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php @@ -934,7 +934,7 @@ class Cases * @param string $usrUid Unique id of User * @param int $delIndex * @param string $userSource Unique id of User Source - * @param string $userTarget $userUidTarget id of User Target + * @param string $userTarget id of User Target * @param string $reason * @param boolean $sendMail * @@ -967,6 +967,18 @@ class Cases $cases = new BmCases(); $response = $cases->addNote($appUid, $usrUid, $noteContent, $sendMail); } + + // Log + $message = 'Reassign case'; + $context = $data = [ + "appUid" => $appUid, + "usrUidSupervisor" => $usrUid, + "userSource" => $userSource, + "userTarget" => $userTarget, + "reason" => $reason, + "delIndex" => $delIndex + ]; + Log::channel(':ReassignCase')->info($message, Bootstrap::context($context)); } catch (Exception $e) { throw $e; } @@ -1143,13 +1155,15 @@ class Cases * @param string $appUid * @param integer $index * @param string $userUid + * @param string $action + * @param string $reason * * @return void * @throws Exception * * @access public */ - public function putClaimCase($appUid, $index, $userUid) + public function putClaimCase($appUid, $index, $userUid, $action, $reason = '') { // Validate the parameters Validator::isString($appUid, '$appUid'); @@ -1176,6 +1190,19 @@ class Cases } else { throw new Exception(G::LoadTranslation("ID_CASE_USER_INVALID_CLAIM_CASE", [$userUid])); } + + $usrUidSupervisor = (Server::getUserId() === $userUid) ? '' : Server::getUserId(); + + // Log + $message = $action . ' case'; + $context = $data = [ + "appUid" => $appUid, + "usrUidSupervisor" => $usrUidSupervisor, + "userTarget" => $userUid, + "reason" => $reason, + "delIndex" => $index + ]; + Log::channel(':' . $action . 'Case')->info($message, Bootstrap::context($context)); } /** diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Cases.php b/workflow/engine/src/ProcessMaker/Services/Api/Cases.php index 7785394a0..806f84580 100755 --- a/workflow/engine/src/ProcessMaker/Services/Api/Cases.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Cases.php @@ -1031,7 +1031,7 @@ class Cases extends Api try { $userUid = $this->getUserId(); $cases = new BmCases(); - $cases->putClaimCase($appUid, $index, $userUid); + $cases->putClaimCase($appUid, $index, $userUid, 'Claim'); } catch (Exception $e) { throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); } @@ -1081,7 +1081,7 @@ class Cases extends Api { try { $cases = new BmCases(); - $cases->putClaimCase($appUid, $index, $usrUid); + $cases->putClaimCase($appUid, $index, $usrUid, 'Assign', $reason); /** Add the note */ if (!empty($reason)) { From 0d08c371fece2ca756c4b521918f44201f15ca68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luciana=20Nu=C3=B1ez?= Date: Thu, 8 Dec 2022 10:36:44 -0400 Subject: [PATCH 13/15] PMCORE-4087 --- .../assets/js/home/modal/ModalAssignCase.vue | 2 +- .../js/home/modal/ModalReassignCase.vue | 2 +- .../translations/english/processmaker.en.po | 6 +++ workflow/engine/data/mysql/insert.sql | 1 + .../src/ProcessMaker/BusinessModel/Cases.php | 46 +++++++++++++++++-- .../src/ProcessMaker/Services/Api/Cases.php | 2 +- 6 files changed, 52 insertions(+), 7 deletions(-) diff --git a/resources/assets/js/home/modal/ModalAssignCase.vue b/resources/assets/js/home/modal/ModalAssignCase.vue index 0cdd309ab..e83518ae3 100755 --- a/resources/assets/js/home/modal/ModalAssignCase.vue +++ b/resources/assets/js/home/modal/ModalAssignCase.vue @@ -146,7 +146,7 @@ export default { let that = this; this.data.userSelected = this.userSelected; this.data.reasonAssign = this.reasonAssign; - this.notifyUser = this.notifyUser; + this.data.notifyUser = this.notifyUser; api.cases.assignCase(this.data).then((response) => { if (response.statusText == "OK" || response.status === 200) { that.$refs["modal-assign-case"].hide(); diff --git a/resources/assets/js/home/modal/ModalReassignCase.vue b/resources/assets/js/home/modal/ModalReassignCase.vue index a92778ad7..e475e6a49 100755 --- a/resources/assets/js/home/modal/ModalReassignCase.vue +++ b/resources/assets/js/home/modal/ModalReassignCase.vue @@ -150,7 +150,7 @@ export default { let that = this; this.data.userSelected = this.userSelected; this.data.reasonReassign = this.reasonReassign; - this.notifyUser = this.notifyUser; + this.data.notifyUser = this.notifyUser; if (!this.data.FLAG){ api.cases.reassingCase(this.data).then((response) => { if (response.statusText == "OK" || response.status === 200) { diff --git a/workflow/engine/content/translations/english/processmaker.en.po b/workflow/engine/content/translations/english/processmaker.en.po index 4e62b8735..67001106b 100755 --- a/workflow/engine/content/translations/english/processmaker.en.po +++ b/workflow/engine/content/translations/english/processmaker.en.po @@ -2533,6 +2533,12 @@ msgstr "Assign group to" msgid "Assign Manager To Department" msgstr "Assign Manager To Department" +# TRANSLATION +# LABEL/ID_ASSIGN_NOTIFICATION +#: LABEL/ID_ASSIGN_NOTIFICATION +msgid "You were assigned to case #{0}." +msgstr "You were assigned to case #{0}." + # TRANSLATION # LABEL/ID_ASSIGN_ROLE #: LABEL/ID_ASSIGN_ROLE diff --git a/workflow/engine/data/mysql/insert.sql b/workflow/engine/data/mysql/insert.sql index 8da14ffab..d867fc689 100755 --- a/workflow/engine/data/mysql/insert.sql +++ b/workflow/engine/data/mysql/insert.sql @@ -57226,6 +57226,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ( 'LABEL','ID_ASSIGN_GROUP_TASK','en','Assign Group Task','2015-02-20') , ( 'LABEL','ID_ASSIGN_GROUP_TO','en','Assign group to','2014-01-15') , ( 'LABEL','ID_ASSIGN_MANAGER_TO_DEPARTAMENT','en','Assign Manager To Department','2014-10-21') , +( 'LABEL','ID_ASSIGN_NOTIFICATION','en','You were assigned to case #{0}.','2022-12-08') , ( 'LABEL','ID_ASSIGN_ROLE','en','Assign user','2014-01-15') , ( 'LABEL','ID_ASSIGN_RULES','en','Error: There is a problem with the next tasks of this process. One of them has manual assignment. Manual assignment shouldn''t be used with sub-processes','2015-02-24') , ( 'LABEL','ID_ASSIGN_SCREEN','en','Assign Screen','2014-01-15') , diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php index 23428442c..d1e192bf4 100755 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php @@ -962,10 +962,7 @@ class Cases /** Add the note */ if (!empty($reason)) { - $noteContent = $reason; - // Define the Case for register a case note - $cases = new BmCases(); - $response = $cases->addNote($appUid, $usrUid, $noteContent, $sendMail); + $this->sendMail($appUid, $usrUid, $reason, $sendMail, $userTarget); } // Log @@ -4059,6 +4056,47 @@ class Cases return $result; } + /** + * Send mail to notify and Add a case note + * + * @param string $appUid + * @param string $userUid + * @param string $note + * @param bool $sendMail + * @param string $toUser + * + */ + public function sendMail($appUid, $userUid, $note, $sendMail = false, $toUser = '') + { + + $appNumber = ModelApplication::getCaseNumber($appUid); + + // Register the note + $attributes = [ + "APP_UID" => $appUid, + "APP_NUMBER" => $appNumber, + "USR_UID" => $userUid, + "NOTE_DATE" => date("Y-m-d H:i:s"), + "NOTE_CONTENT" => $note, + "NOTE_TYPE" => "USER", + "NOTE_AVAILABILITY" => "PUBLIC", + "NOTE_RECIPIENTS" => "" + ]; + $newNote = Notes::create($attributes); + + // Send the email + if ($sendMail) { + // Get the FK + $noteId = $newNote->NOTE_ID; + + $note = G::LoadTranslation('ID_ASSIGN_NOTIFICATION', [$appNumber]) . '
' . G::LoadTranslation('ID_REASON') . ': ' . stripslashes($note); + + // Send the notification + $appNote = new AppNotes(); + $appNote->sendNoteNotification($appUid, $userUid, $note, $toUser, '', 0, $noteId); + } + } + /** * Upload file related to the case notes * diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Cases.php b/workflow/engine/src/ProcessMaker/Services/Api/Cases.php index 806f84580..836be841f 100755 --- a/workflow/engine/src/ProcessMaker/Services/Api/Cases.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Cases.php @@ -1086,7 +1086,7 @@ class Cases extends Api /** Add the note */ if (!empty($reason)) { $currentUserUid = $this->getUserId(); - $cases->addNote($appUid, $currentUserUid, $reason, $sendMail); + $cases->sendMail($appUid, $currentUserUid, $reason, $sendMail, $usrUid); } } catch (Exception $e) { throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); From afb94f2234ebb95e63fb334d5f1afb12fdc02f6a Mon Sep 17 00:00:00 2001 From: Roly Gutierrez Date: Thu, 15 Dec 2022 12:47:29 -0400 Subject: [PATCH 14/15] PMCORE-4084 Supervisor > multiple step > Previous and Next step buttons are not displayed --- database/factories/StepSupervisorFactory.php | 23 +++++++ .../engine/classes/PmDynaformTest.php | 36 ++++++++++ .../ProcessMaker/BusinessModel/CasesTest.php | 58 ++++++++++++++++ workflow/engine/classes/PmDynaform.php | 53 ++++++++++++++- .../methods/cases/cases_StepToRevise.php | 26 +------ .../cases/cases_StepToReviseInputs.php | 33 +-------- .../src/ProcessMaker/BusinessModel/Cases.php | 67 +++++++++++++++++++ .../src/ProcessMaker/Model/StepSupervisor.php | 17 +++++ ...ged-table-inputDocumentsToReviseNavBar.php | 11 +++ 9 files changed, 267 insertions(+), 57 deletions(-) create mode 100644 database/factories/StepSupervisorFactory.php create mode 100644 workflow/engine/src/ProcessMaker/Model/StepSupervisor.php create mode 100644 workflow/engine/templates/cases/paged-table-inputDocumentsToReviseNavBar.php diff --git a/database/factories/StepSupervisorFactory.php b/database/factories/StepSupervisorFactory.php new file mode 100644 index 000000000..2efaf5f16 --- /dev/null +++ b/database/factories/StepSupervisorFactory.php @@ -0,0 +1,23 @@ + $this->faker->regexify("/[a-zA-Z]{32}/"), + 'PRO_UID' => function () { + return \ProcessMaker\Model\Process::factory()->create()->PRO_UID; + }, + 'STEP_TYPE_OBJ' => 'DYNAFORM', + 'STEP_UID_OBJ' => function () { + return \ProcessMaker\Model\Dynaform::factory()->create()->DYN_UID; + }, + 'STEP_POSITION' => 1 + ]; + } +} diff --git a/tests/unit/workflow/engine/classes/PmDynaformTest.php b/tests/unit/workflow/engine/classes/PmDynaformTest.php index 7aec26425..db54c550a 100644 --- a/tests/unit/workflow/engine/classes/PmDynaformTest.php +++ b/tests/unit/workflow/engine/classes/PmDynaformTest.php @@ -1,8 +1,11 @@ assertTrue(empty($_SESSION['USER_LOGGED'])); } + + /** + * @test + * @covers PmDynaform::navigationBarForStepsToRevise + */ + public function it_should_test_navigationBarForStepsToRevise() + { + //definition data + $dynaform = Dynaform::factory()->create(); + $inputDocument = InputDocument::factory()->create(); + $application = Application::factory()->create([ + 'PRO_UID' => $dynaform->PRO_UID + ]); + StepSupervisor::factory()->create([ + 'PRO_UID' => $application->PRO_UID, + 'STEP_TYPE_OBJ' => 'DYNAFORM', + 'STEP_UID_OBJ' => $dynaform->DYN_UID + ]); + StepSupervisor::factory()->create([ + 'PRO_UID' => $application->PRO_UID, + 'STEP_TYPE_OBJ' => 'DYNAFORM', + 'STEP_UID_OBJ' => $dynaform->DYN_UID + ]); + StepSupervisor::factory()->create([ + 'PRO_UID' => $application->PRO_UID, + 'STEP_TYPE_OBJ' => 'INPUT_DOCUMENT', + 'STEP_UID_OBJ' => $inputDocument->INP_DOC_UID + ]); + + //assertion + $result = PmDynaform::navigationBarForStepsToRevise($application->APP_UID, $dynaform->DYN_UID, 2); + $this->assertNotEmpty($result); + } } // Dummy function used for the coverture diff --git a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/CasesTest.php b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/CasesTest.php index 8067315ff..2b36a3cf6 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/CasesTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/CasesTest.php @@ -8,13 +8,16 @@ use Illuminate\Support\Facades\DB; use ProcessMaker\Model\AppDelay; use ProcessMaker\Model\Application; use ProcessMaker\Model\Delegation; +use ProcessMaker\Model\Dynaform; use ProcessMaker\Model\Documents; use ProcessMaker\Model\GroupUser; use ProcessMaker\Model\Groupwf; +use ProcessMaker\Model\InputDocument; use ProcessMaker\Model\ListUnassigned; use ProcessMaker\Model\Process; use ProcessMaker\Model\ProcessUser; use ProcessMaker\Model\Step; +use ProcessMaker\Model\StepSupervisor; use ProcessMaker\Model\Task; use ProcessMaker\Model\Triggers; use ProcessMaker\Model\User; @@ -534,4 +537,59 @@ class CasesTest extends TestCase // Asserts $this->assertCount(3, $result['data']); } + + /** + * This test the method getStepsToRevise. + * @test + * @covers ProcessMaker\BusinessModel\Cases::getStepsToRevise + */ + public function it_should_test_getStepsToRevise() + { + //definition data + $dynaform = Dynaform::factory()->create(); + $application = Application::factory()->create([ + 'PRO_UID' => $dynaform->PRO_UID + ]); + $stepSupervisor = StepSupervisor::factory()->create([ + 'PRO_UID' => $application->PRO_UID, + 'STEP_TYPE_OBJ' => 'DYNAFORM', + 'STEP_UID_OBJ' => $dynaform->DYN_UID + ]); + + //assertion + $cases = new Cases(); + $result = $cases->getStepsToRevise($application->APP_UID, 'DYNAFORM'); + $this->assertEquals($stepSupervisor->PRO_UID, $result[0]['PRO_UID']); + } + + /** + * This test the method getAllUrlStepsToRevise. + * @test + * @covers ProcessMaker\BusinessModel\Cases::getAllUrlStepsToRevise + */ + public function it_should_test_getAllUrlStepsToRevise() + { + //definition data + $dynaform = Dynaform::factory()->create(); + $inputDocument = InputDocument::factory()->create(); + $application = Application::factory()->create([ + 'PRO_UID' => $dynaform->PRO_UID + ]); + $stepSupervisor = StepSupervisor::factory()->create([ + 'PRO_UID' => $application->PRO_UID, + 'STEP_TYPE_OBJ' => 'DYNAFORM', + 'STEP_UID_OBJ' => $dynaform->DYN_UID + ]); + $stepSupervisor = StepSupervisor::factory()->create([ + 'PRO_UID' => $application->PRO_UID, + 'STEP_TYPE_OBJ' => 'INPUT_DOCUMENT', + 'STEP_UID_OBJ' => $inputDocument->INP_DOC_UID + ]); + + //assertion + $cases = new Cases(); + $result = $cases->getAllUrlStepsToRevise($application->APP_UID, 2); + $this->assertEquals($dynaform->DYN_UID, $result[0]['uid']); + $this->assertEquals($inputDocument->INP_DOC_UID, $result[1]['uid']); + } } diff --git a/workflow/engine/classes/PmDynaform.php b/workflow/engine/classes/PmDynaform.php index aeebed6ce..70b174382 100644 --- a/workflow/engine/classes/PmDynaform.php +++ b/workflow/engine/classes/PmDynaform.php @@ -1377,8 +1377,16 @@ class PmDynaform exit(); } - public function printEditSupervisor() + /** + * Print edit supervisor forms. + * @param array $param + */ + public function printEditSupervisor(array $param = []) { + $navbar = ''; + if (isset($param['DEL_INDEX'])) { + $navbar = self::navigationBarForStepsToRevise($this->fields["APP_UID"], $this->fields["CURRENT_DYNAFORM"], $param['DEL_INDEX']); + } ob_clean(); $json = G::json_decode($this->record["DYN_CONTENT"]); $this->jsonr($json); @@ -1405,6 +1413,7 @@ class PmDynaform " . $this->getTheStringVariableForGoogleMaps() . " + {$navbar}
" . $this->getSessionMessageForSupervisor() . "
@@ -2629,4 +2638,46 @@ class PmDynaform } }; } + + /** + * Get html navigation bar for steps to revise. + * @param string $appUid + * @param string $dynUid + * @param int $delIndex + * @return string + */ + public static function navigationBarForStepsToRevise(string $appUid, string $dynUid, int $delIndex): string + { + $navbar = ''; + $cases = new Cases(); + $steps = $cases->getAllUrlStepsToRevise($appUid, $delIndex); + $n = count($steps); + foreach ($steps as $key => $step) { + if ($step['uid'] === $dynUid) { + $previousLabel = ''; + $previousUrl = ''; + $nextLabel = ''; + $nextUrl = ''; + if ($key - 1 >= 0) { + $previousLabel = G::LoadTranslation('ID_PREVIOUS'); + $previousUrl = $steps[$key - 1]['url']; + } + if ($key + 1 < $n) { + $nextLabel = G::LoadTranslation('ID_NEXT'); + $nextUrl = $steps[$key + 1]['url']; + } + $navbar = "
" . + "  " . + " " . + " {$previousLabel}" . + " " . + "  " . + " " . + " {$nextLabel}" . + " " . + "
"; + } + } + return $navbar; + } } diff --git a/workflow/engine/methods/cases/cases_StepToRevise.php b/workflow/engine/methods/cases/cases_StepToRevise.php index 30d9ad870..e68448e40 100644 --- a/workflow/engine/methods/cases/cases_StepToRevise.php +++ b/workflow/engine/methods/cases/cases_StepToRevise.php @@ -1,28 +1,4 @@ . - * - * For more information, contact Colosa Inc, 2566 Le Jeune Rd., - * Coral Gables, FL, 33134, USA, or email info@colosa.com. - */ -// die("first"); -/* Permissions */ $filter = new InputFilter(); $_GET = $filter->xssFilterHard($_GET, "url"); @@ -151,7 +127,7 @@ if ($_GET['DYN_UID'] != '') { $FieldsPmDynaform["CURRENT_DYNAFORM"] = $_GET['DYN_UID']; $a = new PmDynaform($FieldsPmDynaform); if ($a->isResponsive()) { - $a->printEditSupervisor(); + $a->printEditSupervisor(['DEL_INDEX' => $_GET['DEL_INDEX']]); } else { $G_PUBLISH->AddContent('dynaform', 'xmlform', $_SESSION['PROCESS'] . '/' . $_GET['DYN_UID'], '', $Fields['APP_DATA'], 'cases_SaveDataSupervisor?UID=' . $_GET['DYN_UID'] . '&ex=' . $_GET['ex']); } diff --git a/workflow/engine/methods/cases/cases_StepToReviseInputs.php b/workflow/engine/methods/cases/cases_StepToReviseInputs.php index 077240d2b..c15021e75 100644 --- a/workflow/engine/methods/cases/cases_StepToReviseInputs.php +++ b/workflow/engine/methods/cases/cases_StepToReviseInputs.php @@ -1,28 +1,4 @@ . - * - * For more information, contact Colosa Inc, 2566 Le Jeune Rd., - * Coral Gables, FL, 33134, USA, or email info@colosa.com. - */ -//die("second"); -/* Permissions */ $filter = new InputFilter(); $_GET = $filter->xssFilterHard($_GET, "url"); @@ -119,13 +95,8 @@ if (! isset($_GET['INP_DOC_UID'])) { $Fields['MESSAGE2'] = G::LoadTranslation('ID_PLEASE_SELECT_FILE'); $docName = $Fields['INP_DOC_TITLE']; $oHeadPublisher->addScriptCode('var documentName=\'Reviewing Input Document
' . $docName . '\';'); - // $G_PUBLISH->AddContent('xmlform', 'xmlform', $sXmlForm, '', $Fields, 'cases_SupervisorSaveDocument?UID=' . - //$_GET['INP_DOC_UID'] . '&APP_UID=' . $_GET['APP_UID'] . '&position=' . $_GET['position']); - $G_PUBLISH->AddContent('propeltable', 'cases/paged-table-inputDocumentsToRevise', 'cases/cases_ToReviseInputdocsList', $oCase->getInputDocumentsCriteria($_SESSION['APPLICATION'], $_SESSION['INDEX'], $_GET['INP_DOC_UID']), array_merge(array('DOC_UID' => $_GET['INP_DOC_UID'] - ), $Fields)); - //$aFields - // $G_PUBLISH->AddContent('propeltable', 'cases/paged-table-inputDocuments', 'cases/cases_InputdocsList', - //$oCase->getInputDocumentsCriteria($_SESSION['APPLICATION']));//$aFields + $G_PUBLISH->AddContent('view','cases/paged-table-inputDocumentsToReviseNavBar'); + $G_PUBLISH->AddContent('propeltable', 'cases/paged-table-inputDocumentsToRevise', 'cases/cases_ToReviseInputdocsList', $oCase->getInputDocumentsCriteria($_SESSION['APPLICATION'], $_SESSION['INDEX'], $_GET['INP_DOC_UID']), array_merge(['DOC_UID' => $_GET['INP_DOC_UID']], $Fields)); } G::RenderPage('publish', 'blank'); diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php index 9cf14b4f8..53e1c2018 100755 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php @@ -58,6 +58,7 @@ use ProcessMaker\Model\GroupUser; use ProcessMaker\Model\ListUnassigned; use ProcessMaker\Model\Triggers; use ProcessMaker\Model\ProcessUser; +use ProcessMaker\Model\StepSupervisor; use ProcessMaker\Model\Task; use ProcessMaker\Model\User; use ProcessMaker\Plugins\PluginRegistry; @@ -4388,4 +4389,70 @@ class Cases // Return results return $dynaForms; } + + /** + * Get objects that they have send it. + * @param string $appUid + * @param string $typeObject + * @return array + */ + public function getStepsToRevise(string $appUid, string $typeObject): array + { + $application = ModelApplication::where('APP_UID', '=', $appUid) + ->first(); + $result = StepSupervisor::where('PRO_UID', '=', $application['PRO_UID'])-> + where('STEP_TYPE_OBJ', '=', $typeObject)-> + orderBy('STEP_POSITION', 'ASC')-> + get()-> + toArray(); + return $result; + } + + /** + * Get all url steps to revise. + * @param string $appUid + * @param int $delIndex + * @return array + */ + public function getAllUrlStepsToRevise(string $appUid, int $delIndex): array + { + $result = []; + $dynaformStep = $this->getStepsToRevise($appUid, 'DYNAFORM'); + $i = 0; + foreach ($dynaformStep as $step) { + $url = "cases_StepToRevise?" + . "type=DYNAFORM&" + . "ex={$i}&" + . "PRO_UID={$step["PRO_UID"]}&" + . "DYN_UID={$step['STEP_UID_OBJ']}&" + . "APP_UID={$appUid}&" + . "position={$step['STEP_POSITION']}&" + . "DEL_INDEX={$delIndex}"; + $result[] = [ + 'uid' => $step['STEP_UID_OBJ'], + 'url' => $url + ]; + $i++; + } + + $inputDocumentStep = $this->getStepsToRevise($appUid, 'INPUT_DOCUMENT'); + $i = 0; + foreach ($inputDocumentStep as $step) { + $url = "cases_StepToReviseInputs?" + . "type=INPUT_DOCUMENT&" + . "ex={$i}&" + . "PRO_UID={$step["PRO_UID"]}&" + . "INP_DOC_UID={$step['STEP_UID_OBJ']}&" + . "APP_UID={$appUid}&" + . "position={$step['STEP_POSITION']}&" + . "DEL_INDEX={$delIndex}"; + $result[] = [ + 'uid' => $step['STEP_UID_OBJ'], + 'url' => $url + ]; + $i++; + } + return $result; + } + } diff --git a/workflow/engine/src/ProcessMaker/Model/StepSupervisor.php b/workflow/engine/src/ProcessMaker/Model/StepSupervisor.php new file mode 100644 index 000000000..a40c8d172 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Model/StepSupervisor.php @@ -0,0 +1,17 @@ +' + . '
' + . '
' + . $navbar + . '
' + . '
' + . '
'; From 5d047be00e4c0477dc92602b306c61eb67a78605 Mon Sep 17 00:00:00 2001 From: Roly Gutierrez Date: Thu, 5 Jan 2023 11:37:41 -0400 Subject: [PATCH 15/15] PMCORE-4086 Supervisor > multiple step > the `Case Details` is not displayed when the last dynaform passed --- resources/assets/js/home/Home.vue | 9 ++++ workflow/engine/classes/PmDynaform.php | 14 ++++-- .../cases/cases_SaveDataSupervisor.php | 43 ++++++++----------- .../src/ProcessMaker/BusinessModel/Cases.php | 40 ++++++++--------- workflow/engine/templates/cases/open.js | 3 +- 5 files changed, 59 insertions(+), 50 deletions(-) diff --git a/resources/assets/js/home/Home.vue b/resources/assets/js/home/Home.vue index bb472cae5..9dc059851 100755 --- a/resources/assets/js/home/Home.vue +++ b/resources/assets/js/home/Home.vue @@ -192,6 +192,9 @@ export default { if ( e.data === "redirect=todo" || e.message === "redirect=todo"){ that.OnClickSidebarItem(that.getItemMenuByValue("page","inbox")); } + if ( e.data === "redirect=MyCases" || e.message === "redirect=MyCases"){ + that.OnClickSidebarItem(that.getItemMenuByValue("page","MyCases")); + } if ( e.data === "update=debugger" || e.message === "update=debugger"){ if(that.$refs["component"].updateView){ that.$refs["component"].updateView(); @@ -616,6 +619,9 @@ export default { */ getItemMenuByValue(key, value) { let obj = _.find(this.menu, function(o) { + if(o[key] == value){ + return true; + } if(o.component){ return o.props.item[key] == value; } @@ -624,6 +630,9 @@ export default { if(obj.component){ return obj.props; } + if(obj.page){ + return {item : obj}; + } return obj; }, /** diff --git a/workflow/engine/classes/PmDynaform.php b/workflow/engine/classes/PmDynaform.php index 70b174382..3ced3698b 100644 --- a/workflow/engine/classes/PmDynaform.php +++ b/workflow/engine/classes/PmDynaform.php @@ -2642,18 +2642,18 @@ class PmDynaform /** * Get html navigation bar for steps to revise. * @param string $appUid - * @param string $dynUid + * @param string $uid * @param int $delIndex * @return string */ - public static function navigationBarForStepsToRevise(string $appUid, string $dynUid, int $delIndex): string + public static function navigationBarForStepsToRevise(string $appUid, string $uid, int $delIndex): string { $navbar = ''; $cases = new Cases(); $steps = $cases->getAllUrlStepsToRevise($appUid, $delIndex); $n = count($steps); foreach ($steps as $key => $step) { - if ($step['uid'] === $dynUid) { + if ($step['uid'] === $uid) { $previousLabel = ''; $previousUrl = ''; $nextLabel = ''; @@ -2666,6 +2666,14 @@ class PmDynaform $nextLabel = G::LoadTranslation('ID_NEXT'); $nextUrl = $steps[$key + 1]['url']; } + if (empty($nextUrl)) { + $nextLabel = G::LoadTranslation('ID_FINISH'); + $nextUrl = 'javascript:if(window.parent && window.parent.parent){window.parent.parent.postMessage("redirect=MyCases","*");}'; + } + //this condition modify the next Url for submit action + if ($step['type'] === 'DYNAFORM') { + $nextUrl = 'javascript:document.querySelector(".pmdynaform-container .pmdynaform-form").submit();'; + } $navbar = "
" . "  " . " " . diff --git a/workflow/engine/methods/cases/cases_SaveDataSupervisor.php b/workflow/engine/methods/cases/cases_SaveDataSupervisor.php index e12d94aa1..845d3fcce 100644 --- a/workflow/engine/methods/cases/cases_SaveDataSupervisor.php +++ b/workflow/engine/methods/cases/cases_SaveDataSupervisor.php @@ -1,29 +1,7 @@ . - * - * For more information, contact Colosa Inc, 2566 Le Jeune Rd., - * Coral Gables, FL, 33134, USA, or email info@colosa.com. - */ -//validate the data post use ProcessMaker\Plugins\PluginRegistry; +use ProcessMaker\BusinessModel\Cases as BusinessModelCases; $dynaForm = DynaformPeer::retrieveByPK($_GET["UID"]); @@ -210,6 +188,21 @@ if (isset( $_FILES["form"]["name"] ) && count( $_FILES["form"]["name"] ) > 0) { //Define the STEP_POSITION $ex = isset($_GET['ex']) ? $_GET['ex'] : 0; //go to the next step -$aNextStep = $oCase->getNextSupervisorStep( $_SESSION['PROCESS'], $_SESSION['STEP_POSITION'] ); -G::header( 'Location: cases_StepToRevise?type=DYNAFORM&ex=' . $ex . '&PRO_UID=' . $_SESSION['PROCESS'] . '&DYN_UID=' . $aNextStep['UID'] . '&APP_UID=' . $_SESSION['APPLICATION'] . '&position=' . $aNextStep['POSITION'] . '&DEL_INDEX=' . $_SESSION['INDEX'] ); +$nextSteps = $oCase->getNextSupervisorStep($_SESSION['PROCESS'], $_SESSION['STEP_POSITION']); +$url = ''; +$steps = (new BusinessModelCases())->getAllUrlStepsToRevise($_SESSION['APPLICATION'], $_SESSION['INDEX']); +$n = count($steps); +foreach ($steps as $key => $step) { + if ($step['uid'] === $nextSteps['UID'] && $key + 1 < $n) { + $nextUrl = $steps[$key + 1]['url']; + $url = $nextUrl; + break; + } +} +if (empty($url)) { + die(''); +} +G::header('Location:' . $url); die(); \ No newline at end of file diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php index 117f79adc..3285b312c 100755 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php @@ -4483,36 +4483,34 @@ class Cases { $result = []; $dynaformStep = $this->getStepsToRevise($appUid, 'DYNAFORM'); - $i = 0; - foreach ($dynaformStep as $step) { - $url = "cases_StepToRevise?" - . "type=DYNAFORM&" - . "ex={$i}&" - . "PRO_UID={$step["PRO_UID"]}&" - . "DYN_UID={$step['STEP_UID_OBJ']}&" - . "APP_UID={$appUid}&" - . "position={$step['STEP_POSITION']}&" - . "DEL_INDEX={$delIndex}"; - $result[] = [ - 'uid' => $step['STEP_UID_OBJ'], - 'url' => $url - ]; - $i++; - } - $inputDocumentStep = $this->getStepsToRevise($appUid, 'INPUT_DOCUMENT'); + $objects = array_merge($dynaformStep, $inputDocumentStep); + usort($objects, function ($a, $b) { + return $a['STEP_POSITION'] > $b['STEP_POSITION']; + }); $i = 0; - foreach ($inputDocumentStep as $step) { - $url = "cases_StepToReviseInputs?" - . "type=INPUT_DOCUMENT&" + $endPoint = ''; + $uidName = ''; + foreach ($objects as $step) { + if ($step['STEP_TYPE_OBJ'] === 'DYNAFORM') { + $endPoint = 'cases_StepToRevise'; + $uidName = 'DYN_UID'; + } + if ($step['STEP_TYPE_OBJ'] === 'INPUT_DOCUMENT') { + $endPoint = 'cases_StepToReviseInputs'; + $uidName = 'INP_DOC_UID'; + } + $url = "{$endPoint}?" + . "type={$step['STEP_TYPE_OBJ']}&" . "ex={$i}&" . "PRO_UID={$step["PRO_UID"]}&" - . "INP_DOC_UID={$step['STEP_UID_OBJ']}&" + . "{$uidName}={$step['STEP_UID_OBJ']}&" . "APP_UID={$appUid}&" . "position={$step['STEP_POSITION']}&" . "DEL_INDEX={$delIndex}"; $result[] = [ 'uid' => $step['STEP_UID_OBJ'], + 'type' => $step['STEP_TYPE_OBJ'], 'url' => $url ]; $i++; diff --git a/workflow/engine/templates/cases/open.js b/workflow/engine/templates/cases/open.js index e34d7f25b..43ef8bb17 100644 --- a/workflow/engine/templates/cases/open.js +++ b/workflow/engine/templates/cases/open.js @@ -531,7 +531,8 @@ Ext.onReady(function(){ }, iconCls: 'ICON_STEPS', toggleHandler: togglePreview, - disabled: true + disabled: true, + hidden: true }, { id: 'informationMenu', text: _('ID_INFORMATION'),