diff --git a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/DraftTest.php b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/DraftTest.php index 35bedfce8..a1ebb2b75 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/DraftTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/DraftTest.php @@ -641,4 +641,83 @@ class DraftTest extends TestCase $res = $draft->getCountersByProcesses(null, false, [$process->PRO_ID]); $this->assertCount(1, $res); } + + /** + * It tests the getCountersByRange() method + * + * @covers \ProcessMaker\BusinessModel\Cases\Draft::getCountersByRange() + * @test + */ + public function it_should_test_get_counters_by_range_method() + { + $process1 = factory(Process::class)->create(); + $process2 = factory(Process::class)->create(); + $user = factory(User::class)->create(); + $application = factory(Application::class, 4)->states('draft')->create([ + 'APP_INIT_USER' => $user->USR_UID, + 'APP_CUR_USER' => $user->USR_UID, + ]); + factory(Delegation::class)->states('foreign_keys')->create([ + 'DEL_THREAD_STATUS' => 'OPEN', + 'DEL_INDEX' => 1, + 'USR_UID' => $application[0]->APP_INIT_USER, + 'USR_ID' => $user->USR_ID, + 'APP_UID' => $application[0]->APP_UID, + 'APP_NUMBER' => $application[0]->APP_NUMBER, + 'PRO_ID' => $process1->PRO_ID, + 'PRO_UID' => $process1->PRO_UID, + 'DEL_DELEGATE_DATE' => '2021-05-20 09:52:32' + ]); + factory(Delegation::class)->states('foreign_keys')->create([ + 'DEL_THREAD_STATUS' => 'OPEN', + 'DEL_INDEX' => 1, + 'USR_UID' => $application[1]->APP_INIT_USER, + 'USR_ID' => $user->USR_ID, + 'APP_UID' => $application[1]->APP_UID, + 'APP_NUMBER' => $application[1]->APP_NUMBER, + 'PRO_ID' => $process1->PRO_ID, + 'PRO_UID' => $process1->PRO_UID, + 'DEL_DELEGATE_DATE' => '2021-05-21 09:52:32' + ]); + factory(Delegation::class)->states('foreign_keys')->create([ + 'DEL_THREAD_STATUS' => 'OPEN', + 'DEL_INDEX' => 1, + 'USR_UID' => $application[2]->APP_INIT_USER, + 'USR_ID' => $user->USR_ID, + 'APP_UID' => $application[2]->APP_UID, + 'APP_NUMBER' => $application[2]->APP_NUMBER, + 'PRO_ID' => $process1->PRO_ID, + 'PRO_UID' => $process1->PRO_UID, + 'DEL_DELEGATE_DATE' => '2021-05-22 00:00:00' + ]); + factory(Delegation::class)->states('foreign_keys')->create([ + 'DEL_THREAD_STATUS' => 'OPEN', + 'DEL_INDEX' => 1, + 'USR_UID' => $application[3]->APP_INIT_USER, + 'USR_ID' => $user->USR_ID, + 'APP_UID' => $application[3]->APP_UID, + 'APP_NUMBER' => $application[3]->APP_NUMBER, + 'PRO_ID' => $process2->PRO_ID, + 'PRO_UID' => $process2->PRO_UID, + 'DEL_DELEGATE_DATE' => '2021-05-23 09:52:32' + ]); + $draft = new Draft(); + $draft->setUserId($user->USR_ID); + $draft->setUserUid($user->USR_ID); + + $res = $draft->getCountersByRange(); + $this->assertCount(4, $res); + + $res = $draft->getCountersByRange(null, null, null, 'month'); + $this->assertCount(1, $res); + + $res = $draft->getCountersByRange(null, null, null, 'year'); + $this->assertCount(1, $res); + + $res = $draft->getCountersByRange($process2->PRO_ID); + $this->assertCount(1, $res); + + $res = $draft->getCountersByRange(null, '2021-05-20', '2021-05-22'); + $this->assertCount(3, $res); + } } diff --git a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/InboxTest.php b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/InboxTest.php index fa108b20b..7a274ae88 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/InboxTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/InboxTest.php @@ -566,4 +566,52 @@ class InboxTest extends TestCase $res = $inbox->getCountersByProcesses(null, false, [$process->PRO_ID]); $this->assertCount(1, $res); } + + /** + * It tests the getCountersByRange() method + * + * @covers \ProcessMaker\BusinessModel\Cases\Inbox::getCountersByRange() + * @test + */ + public function it_should_test_get_counters_by_range_method() + { + $user = factory(User::class)->create(); + $process = factory(Process::class)->create(); + $process2 = factory(Process::class)->create(); + factory(Delegation::class)->states('foreign_keys')->create([ + 'DEL_THREAD_STATUS' => 'OPEN', + 'DEL_INDEX' => 2, + 'USR_UID' => $user->USR_UID, + 'USR_ID' => $user->USR_ID, + 'PRO_ID' => $process->PRO_ID, + 'PRO_UID' => $process->PRO_UID, + 'DEL_DELEGATE_DATE' => '2021-05-20 09:52:32' + ]); + factory(Delegation::class)->states('foreign_keys')->create([ + 'DEL_THREAD_STATUS' => 'OPEN', + 'DEL_INDEX' => 2, + 'USR_UID' => $user->USR_UID, + 'USR_ID' => $user->USR_ID, + 'PRO_ID' => $process2->PRO_ID, + 'PRO_UID' => $process2->PRO_UID, + 'DEL_DELEGATE_DATE' => '2021-05-25 09:52:32' + ]); + $inbox = new Inbox(); + $inbox->setUserId($user->USR_ID); + $inbox->setUserUid($user->USR_UID); + $res = $inbox->getCountersByRange(); + $this->assertCount(2, $res); + + $res = $inbox->getCountersByRange(null, null, null, 'month'); + $this->assertCount(1, $res); + + $res = $inbox->getCountersByRange(null, null, null, 'year'); + $this->assertCount(1, $res); + + $res = $inbox->getCountersByRange($process2->PRO_ID); + $this->assertCount(1, $res); + + $res = $inbox->getCountersByRange(null, '2021-05-20', '2021-05-23'); + $this->assertCount(1, $res); + } } diff --git a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/PausedTest.php b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/PausedTest.php index 81888cdad..85873a905 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/PausedTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/PausedTest.php @@ -500,4 +500,110 @@ class PausedTest extends TestCase $res = $paused->getCountersByProcesses(null, false, [$process1->PRO_ID]); $this->assertCount(1, $res); } + + /** + * It tests the getCountersByRange() method + * + * @covers \ProcessMaker\BusinessModel\Cases\Paused::getCountersByRange() + * @test + */ + public function it_should_test_get_counters_by_range_method() + { + $user = factory(User::class)->create(); + $process1 = factory(Process::class)->create(); + $task = factory(Task::class)->create([ + 'TAS_ASSIGN_TYPE' => '', + 'TAS_GROUP_VARIABLE' => '', + 'PRO_UID' => $process1->PRO_UID, + 'TAS_TYPE' => 'NORMAL' + ]); + + $application1 = factory(Application::class)->create(); + factory(Delegation::class)->create([ + 'APP_UID' => $application1->APP_UID, + 'APP_NUMBER' => $application1->APP_NUMBER, + 'TAS_ID' => $task->TAS_ID, + 'DEL_THREAD_STATUS' => 'CLOSED', + 'USR_UID' => $user->USR_UID, + 'USR_ID' => $user->USR_ID, + 'PRO_ID' => $process1->PRO_ID, + 'PRO_UID' => $process1->PRO_UID, + 'DEL_PREVIOUS' => 0, + 'DEL_INDEX' => 1 + ]); + $delegation1 = factory(Delegation::class)->create([ + 'APP_UID' => $application1->APP_UID, + 'APP_NUMBER' => $application1->APP_NUMBER, + 'TAS_ID' => $task->TAS_ID, + 'DEL_THREAD_STATUS' => 'OPEN', + 'USR_UID' => $user->USR_UID, + 'USR_ID' => $user->USR_ID, + 'PRO_ID' => $process1->PRO_ID, + 'PRO_UID' => $process1->PRO_UID, + 'DEL_PREVIOUS' => 1, + 'DEL_INDEX' => 2, + 'DEL_DELEGATE_DATE' => '2021-05-23 00:00:00' + ]); + factory(AppDelay::class)->create([ + 'APP_DELEGATION_USER' => $user->USR_UID, + 'PRO_UID' => $process1->PRO_UID, + 'APP_NUMBER' => $delegation1->APP_NUMBER, + 'APP_DEL_INDEX' => $delegation1->DEL_INDEX, + 'APP_DISABLE_ACTION_USER' => 0, + 'APP_TYPE' => 'PAUSE' + ]); + + $application2 = factory(Application::class)->create(); + factory(Delegation::class)->create([ + 'APP_UID' => $application2->APP_UID, + 'APP_NUMBER' => $application2->APP_NUMBER, + 'TAS_ID' => $task->TAS_ID, + 'DEL_THREAD_STATUS' => 'CLOSED', + 'USR_UID' => $user->USR_UID, + 'USR_ID' => $user->USR_ID, + 'PRO_ID' => $process1->PRO_ID, + 'PRO_UID' => $process1->PRO_UID, + 'DEL_PREVIOUS' => 0, + 'DEL_INDEX' => 1 + ]); + $delegation2 = factory(Delegation::class)->create([ + 'APP_UID' => $application2->APP_UID, + 'APP_NUMBER' => $application2->APP_NUMBER, + 'TAS_ID' => $task->TAS_ID, + 'DEL_THREAD_STATUS' => 'OPEN', + 'USR_UID' => $user->USR_UID, + 'USR_ID' => $user->USR_ID, + 'PRO_ID' => $process1->PRO_ID, + 'PRO_UID' => $process1->PRO_UID, + 'DEL_PREVIOUS' => 1, + 'DEL_INDEX' => 2, + 'DEL_DELEGATE_DATE' => '2021-05-24 09:52:32' + ]); + factory(AppDelay::class)->create([ + 'APP_DELEGATION_USER' => $user->USR_UID, + 'PRO_UID' => $process1->PRO_UID, + 'APP_NUMBER' => $delegation2->APP_NUMBER, + 'APP_DEL_INDEX' => $delegation2->DEL_INDEX, + 'APP_DISABLE_ACTION_USER' => 0, + 'APP_TYPE' => 'PAUSE' + ]); + $paused = new Paused(); + $paused->setUserId($user->USR_ID); + $paused->setUserUid($user->USR_UID); + + $res = $paused->getCountersByRange(); + $this->assertCount(2, $res); + + $res = $paused->getCountersByRange(null, null, null, 'month'); + $this->assertCount(1, $res); + + $res = $paused->getCountersByRange(null, null, null, 'year'); + $this->assertCount(1, $res); + + $res = $paused->getCountersByRange($process1->PRO_ID); + $this->assertCount(2, $res); + + $res = $paused->getCountersByRange(null, '2021-05-20', '2021-05-23'); + $this->assertCount(1, $res); + } } diff --git a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/UnassignedTest.php b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/UnassignedTest.php index d972307cd..5f96e08c1 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/UnassignedTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/UnassignedTest.php @@ -579,4 +579,82 @@ class UnassignedTest extends TestCase $res = $unassigned->getCountersByProcesses(null, false, [$process1->PRO_ID]); $this->assertCount(1, $res); } + + /** + * It tests the getCountersByRange() method + * + * @covers \ProcessMaker\BusinessModel\Cases\Unassigned::getCountersByRange() + * @test + */ + public function it_should_test_get_counters_by_range_method() + { + $user = factory(User::class)->create(); + $process1 = factory(Process::class)->create([ + 'CATEGORY_ID' => 2 + ]); + $process2 = factory(Process::class)->create([ + 'CATEGORY_ID' => 3 + ]); + $application = factory(Application::class)->create([ + 'APP_STATUS_ID' => 2 + ]); + $task = factory(Task::class)->create([ + 'TAS_ASSIGN_TYPE' => 'SELF_SERVICE', + 'TAS_GROUP_VARIABLE' => '', + 'PRO_UID' => $process1->PRO_UID, + 'PRO_ID' => $process1->PRO_ID, + ]); + factory(TaskUser::class)->create([ + 'TAS_UID' => $task->TAS_UID, + 'USR_UID' => $user->USR_UID, + 'TU_RELATION' => 1, + 'TU_TYPE' => 1 + ]); + factory(Delegation::class)->create([ + 'APP_NUMBER' => $application->APP_NUMBER, + 'TAS_ID' => $task->TAS_ID, + 'PRO_ID' => $process1->PRO_ID, + 'DEL_THREAD_STATUS' => 'OPEN', + 'USR_ID' => 0, + 'DEL_DELEGATE_DATE' => '2021-05-21 09:52:32' + ]); + $task2 = factory(Task::class)->create([ + 'TAS_ASSIGN_TYPE' => 'SELF_SERVICE', + 'TAS_GROUP_VARIABLE' => '', + 'PRO_UID' => $process2->PRO_UID, + 'PRO_ID' => $process2->PRO_ID, + ]); + factory(TaskUser::class)->create([ + 'TAS_UID' => $task2->TAS_UID, + 'USR_UID' => $user->USR_UID, + 'TU_RELATION' => 1, + 'TU_TYPE' => 1 + ]); + factory(Delegation::class)->create([ + 'APP_NUMBER' => $application->APP_NUMBER, + 'TAS_ID' => $task2->TAS_ID, + 'PRO_ID' => $process2->PRO_ID, + 'DEL_THREAD_STATUS' => 'OPEN', + 'USR_ID' => 0, + 'DEL_DELEGATE_DATE' => '2021-05-24 09:52:32' + ]); + $unassigned = new Unassigned(); + $unassigned->setUserId($user->USR_ID); + $unassigned->setUserUid($user->USR_UID); + + $res = $unassigned->getCountersByRange(); + $this->assertCount(2, $res); + + $res = $unassigned->getCountersByRange(null, null, null, 'month'); + $this->assertCount(1, $res); + + $res = $unassigned->getCountersByRange(null, null, null, 'year'); + $this->assertCount(1, $res); + + $res = $unassigned->getCountersByRange($process1->PRO_ID); + $this->assertCount(1, $res); + + $res = $unassigned->getCountersByRange(null, '2021-05-20', '2021-05-23'); + $this->assertCount(1, $res); + } } diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/AbstractCases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/AbstractCases.php index e72b28a61..8dc725c3a 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/AbstractCases.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/AbstractCases.php @@ -3,6 +3,7 @@ namespace ProcessMaker\BusinessModel\Cases; use Datetime; +use DB; use Exception; use ProcessMaker\BusinessModel\Interfaces\CasesInterface; use ProcessMaker\BusinessModel\Validator; @@ -1474,4 +1475,56 @@ class AbstractCases implements CasesInterface } return $query->get()->values()->toArray(); } + + /** + * Count how many cases has each process by range of dates + * + * @param int $processId + * @param string $dateFrom + * @param string $dateTo + * @param string $groupBy + * + * @return array + */ + public function getCountersByRange($processId = null, $dateFrom = null, $dateTo = null, $groupBy = 'day') + { + $rawQuery = 'count(APP_DELEGATION.DELEGATION_ID) as TOTAL, APP_DELEGATION.PRO_ID, PROCESS.PRO_TITLE, DATE(APP_DELEGATION.DEL_DELEGATE_DATE) as dateGroup'; + switch ($groupBy) { + case 'month': + $rawQuery = 'count(APP_DELEGATION.DELEGATION_ID) as TOTAL, APP_DELEGATION.PRO_ID, PROCESS.PRO_TITLE, EXTRACT(YEAR_MONTH From APP_DELEGATION.DEL_DELEGATE_DATE) as dateGroup'; + break; + case 'year': + $rawQuery = 'count(APP_DELEGATION.DELEGATION_ID) as TOTAL, APP_DELEGATION.PRO_ID, PROCESS.PRO_TITLE, YEAR(APP_DELEGATION.DEL_DELEGATE_DATE) as dateGroup'; + break; + } + $query = Delegation::selectRaw($rawQuery); + $query->groupBy('dateGroup'); + $listArray = explode("\\", get_class($this)); + $list = end($listArray); + switch ($list) { + case 'Inbox': + $query->inbox($this->getUserId()); + break; + case 'Draft': + $query->draft($this->getUserId()); + break; + case 'Paused': + $query->paused($this->getUserId()); + break; + case 'Unassigned': + $query->selfService($this->getUserUid()); + break; + } + $query->joinProcess(); + if (!is_null($processId)) { + $query->inProcesses([$processId]); + } + if (!is_null($dateFrom)) { + $query->where('APP_DELEGATION.DEL_DELEGATE_DATE', '>=', $dateFrom); + } + if (!is_null($dateTo)) { + $query->where('APP_DELEGATION.DEL_DELEGATE_DATE', '<=', $dateTo); + } + return $query->get()->values()->toArray(); + } } diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Metrics.php b/workflow/engine/src/ProcessMaker/Services/Api/Metrics.php index aeb39f083..c8a8d1700 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Metrics.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Metrics.php @@ -66,4 +66,45 @@ class Metrics extends Api throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); } } + + /** + * Get total cases by range + * + * @url /process-total-cases + * + * @param string $caseList + * @param int $processId + * @param string $dateFrom + * @param string $dateTo + * @param string $groupBy + * + * @return array + * + * @throws RestException + * + * @class AccessControl {@permission TASK_METRICS_VIEW} + */ + public function getTotalCasesByRange($caseList, $processId = null, $dateFrom = null, $dateTo = null, $groupBy = 'day') + { + try { + switch ($caseList) { + case 'inbox': + $list = new Inbox(); + break; + case 'draft': + $list = new Draft(); + break; + case 'paused': + $list = new Paused(); + break; + case 'unassigned': + $list = new Unassigned(); + break; + } + $result = $list->getCountersByRange($processId, $dateFrom, $dateTo, $groupBy); + return $result; + } catch (Exception $e) { + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + } }