diff --git a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/AbstractCasesTest.php b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/AbstractCasesTest.php index e2b544700..72a2b2248 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/AbstractCasesTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/AbstractCasesTest.php @@ -103,13 +103,30 @@ class AbstractCasesTest extends TestCase public function it_return_set_get_priority() { $absCases = new AbstractCases(); - $arguments = [1 => 'VL', 2 => 'L', 3 => 'N', 4 => 'H', 5 => 'VH']; + $arguments = ['ALL', 'VL', 'L', 'N', 'H', 'VH']; $index = array_rand($arguments); - $absCases->setPriority($index); + $absCases->setPriority($arguments[$index]); $actual = $absCases->getPriority(); $this->assertEquals($index, $actual); } + /** + * This check the getter and setter related to the priorities + * + * @covers \ProcessMaker\BusinessModel\Cases\AbstractCases::setPriorities() + * @covers \ProcessMaker\BusinessModel\Cases\AbstractCases::getPriorities() + * @test + */ + public function it_return_set_get_priorities() + { + $absCases = new AbstractCases(); + $arguments = ['ALL', 'VL', 'L', 'N', 'H', 'VH']; + $index = array_rand($arguments); + $absCases->setPriorities([$arguments[$index]]); + $actual = $absCases->getPriorities(); + $this->assertEquals([$index], $actual); + } + /** * This check the getter and setter related to the case number * @@ -129,9 +146,8 @@ class AbstractCasesTest extends TestCase /** * This check the getter and setter related to the range of case number * - * @covers \ProcessMaker\BusinessModel\Cases\AbstractCases::setRangeCaseNumber() - * @covers \ProcessMaker\BusinessModel\Cases\AbstractCases::getFromCaseNumber() - * @covers \ProcessMaker\BusinessModel\Cases\AbstractCases::getToCaseNumber() + * @covers \ProcessMaker\BusinessModel\Cases\AbstractCases::setCaseNumberFrom() + * @covers \ProcessMaker\BusinessModel\Cases\AbstractCases::setCaseNumberTo() * @test */ public function it_return_set_get_range_case_number() @@ -141,9 +157,10 @@ class AbstractCasesTest extends TestCase 'APP_NUMBER' => $case1->APP_NUMBER + 1 ]); $absCases = new AbstractCases(); - $absCases->setRangeCaseNumber($case1->APP_NUMBER, $case2->APP_NUMBER); - $from = $absCases->getFromCaseNumber(); - $to = $absCases->getToCaseNumber(); + $absCases->setCaseNumberFrom($case1->APP_NUMBER); + $absCases->setCaseNumberTo($case2->APP_NUMBER); + $from = $absCases->getCaseNumberFrom(); + $to = $absCases->getCaseNumberTo(); $this->assertEquals($case1->APP_NUMBER, $from); $this->assertEquals($case2->APP_NUMBER, $to); } @@ -174,12 +191,12 @@ class AbstractCasesTest extends TestCase public function it_return_set_get_inbox_status() { $absCases = new AbstractCases(); - $arguments = ['', 'ALL', 'READ', 'UNREAD']; + $arguments = ['ALL', 'READ', 'UNREAD']; $index = array_rand($arguments); $absCases->setInboxStatus($arguments[$index]); $actual = $absCases->getInboxStatus(); - if (empty($arguments[$index])) { - $this->assertEquals('ALL', $actual); + if ($arguments[$index] === 'ALL') { + $this->assertEmpty($actual); } else { $this->assertEquals($arguments[$index], $actual); } @@ -195,12 +212,12 @@ class AbstractCasesTest extends TestCase public function it_return_set_get_participated_status() { $absCases = new AbstractCases(); - $arguments = ['', 'ALL', 'STARTED', 'COMPLETED']; + $arguments = ['ALL', 'STARTED', 'COMPLETED']; $index = array_rand($arguments); $absCases->setParticipatedStatus($arguments[$index]); $actual = $absCases->getParticipatedStatus(); - if (empty($arguments[$index])) { - $this->assertEquals('ALL', $actual); + if ($arguments[$index] === 'ALL') { + $this->assertEmpty($actual); } else { $this->assertEquals($arguments[$index], $actual); } @@ -216,12 +233,12 @@ class AbstractCasesTest extends TestCase public function it_return_set_get_risk_status() { $absCases = new AbstractCases(); - $arguments = ['', 'ALL', 'ON_TIME', 'AT_RISK', 'OVERDUE']; + $arguments = ['ALL', 'ON_TIME', 'AT_RISK', 'OVERDUE']; $index = array_rand($arguments); $absCases->setRiskStatus($arguments[$index]); $actual = $absCases->getRiskStatus(); - if (empty($arguments[$index])) { - $this->assertEquals('ALL', $actual); + if ($arguments[$index] === 'ALL') { + $this->assertEmpty($actual); } else { $this->assertEquals($arguments[$index], $actual); } @@ -237,18 +254,36 @@ class AbstractCasesTest extends TestCase public function it_return_set_get_case_status() { $absCases = new AbstractCases(); - $arguments = ['', 'ALL', 'DRAFT', 'TO_DO', 'COMPLETED', 'CANCELLED', 'CANCELED']; + $arguments = ['ALL', 'DRAFT', 'TO_DO', 'COMPLETED', 'CANCELED']; $index = array_rand($arguments); $absCases->setCaseStatus($arguments[$index]); $actual = $absCases->getCaseStatus(); - if (empty($arguments[$index])) { - $this->assertEquals('ALL', $actual); + $this->assertEquals($index, $actual); + if ($arguments[$index] === 'ALL') { + $this->assertEquals(0, $actual); } else { - if ($arguments[$index] === AbstractCases::INCORRECT_CANCELED_STATUS) { - $this->assertEquals(AbstractCases::CORRECT_CANCELED_STATUS, $actual); - } else { - $this->assertEquals($arguments[$index], $actual); - } + $this->assertEquals($index, $actual); + } + } + + /** + * This check the getter and setter related to the case statuses + * + * @covers \ProcessMaker\BusinessModel\Cases\AbstractCases::setCaseStatuses() + * @covers \ProcessMaker\BusinessModel\Cases\AbstractCases::getCaseStatuses() + * @test + */ + public function it_return_set_get_case_statuses() + { + $absCases = new AbstractCases(); + $arguments = ['ALL', 'DRAFT', 'TO_DO', 'COMPLETED', 'CANCELED']; + $index = array_rand($arguments); + $absCases->setCaseStatuses([$arguments[$index]]); + $actual = $absCases->getCaseStatuses(); + if ($arguments[$index] === 'ALL') { + $this->assertEquals([], $actual); + } else { + $this->assertEquals([$index], $actual); } } @@ -286,32 +321,32 @@ class AbstractCasesTest extends TestCase /** * This check the getter and setter related to the newest than date * - * @covers \ProcessMaker\BusinessModel\Cases\AbstractCases::setNewestThan() - * @covers \ProcessMaker\BusinessModel\Cases\AbstractCases::getNewestThan() + * @covers \ProcessMaker\BusinessModel\Cases\AbstractCases::setDelegateFrom() + * @covers \ProcessMaker\BusinessModel\Cases\AbstractCases::getDelegateFrom() * @test */ public function it_return_set_get_newest_than() { $absCases = new AbstractCases(); $text = date('Y-m-d'); - $absCases->setNewestThan($text); - $actual = $absCases->getNewestThan(); + $absCases->setDelegateFrom($text); + $actual = $absCases->getDelegateFrom(); $this->assertEquals($text, $actual); } /** * This check the getter and setter related to the oldest than date * - * @covers \ProcessMaker\BusinessModel\Cases\AbstractCases::setOldestThan() - * @covers \ProcessMaker\BusinessModel\Cases\AbstractCases::getOldestThan() + * @covers \ProcessMaker\BusinessModel\Cases\AbstractCases::setDelegateTo() + * @covers \ProcessMaker\BusinessModel\Cases\AbstractCases::getDelegateTo() * @test */ public function it_return_set_get_oldest_than() { $absCases = new AbstractCases(); $text = date('Y-m-d'); - $absCases->setOldestThan($text); - $actual = $absCases->getOldestThan(); + $absCases->setDelegateTo($text); + $actual = $absCases->getDelegateTo(); $this->assertEquals($text, $actual); } @@ -383,52 +418,61 @@ class AbstractCasesTest extends TestCase { $absCases = new AbstractCases(); $properties = [ - 'category' => G::generateUniqueID(), + // Tasks - Cases 'process' => rand(), 'task' => rand(), 'user' => rand(), - 'priority' => 1, 'caseNumber' => rand(), - 'caseNumberFrom' => rand(), - 'caseNumberTo' => rand(), + 'caseTitle' => G::generateUniqueID(), + // Home - Search + 'priorities' => ['N'], + 'caseStatuses' => ['TO_DO','DRAFT'], + 'filterCases'=> '1,3-5,8,10-15', + 'delegationDateFrom' => date('Y-m-d'), + 'delegationDateTo' => date('Y-m-d'), + // Home - My cases + 'filter'=> 'ALL', + 'caseStatus' => 'TO_DO', + 'startCaseFrom' => date('Y-m-d'), + 'startCaseTo' => date('Y-m-d'), + 'finishCaseFrom' => date('Y-m-d'), + 'finishCaseTo' => date('Y-m-d'), + // Other 'search' => G::generateUniqueID(), + 'category' => G::generateUniqueID(), 'caseLink' => G::generateUniqueID(), 'appUidCheck' => [G::generateUniqueID()], - 'newestthan' => date('Y-m-d'), - 'oldestthan' => date('Y-m-d'), - 'sort' => 'APP_DELEGATION.APP_NUMBER', + 'sort' => 'APP_NUMBER', 'dir' => 'DESC', 'paged' => true, 'start' => 5, 'limit' => 10, ]; $absCases->setProperties($properties); - $actual = $absCases->getCategoryUid(); - $this->assertEquals($properties['category'], $actual); + // Tasks - Cases $actual = $absCases->getProcessId(); $this->assertEquals($properties['process'], $actual); $actual = $absCases->getTaskId(); $this->assertEquals($properties['task'], $actual); $actual = $absCases->getUserId(); $this->assertEquals($properties['user'], $actual); - $actual = $absCases->getPriority(); - $this->assertEquals($properties['priority'], $actual); $actual = $absCases->getCaseNumber(); $this->assertEquals($properties['caseNumber'], $actual); - $actual = $absCases->getFromCaseNumber(); - $this->assertEquals($properties['caseNumberFrom'], $actual); - $actual = $absCases->getToCaseNumber(); - $this->assertEquals($properties['caseNumberTo'], $actual); + // Home - Search + $actual = $absCases->getPriorities(); + $this->assertNotEmpty($actual); + // Home - My cases + $actual = $absCases->getParticipatedStatus(); + $this->assertEmpty($actual); + // Other $actual = $absCases->getValueToSearch(); $this->assertEquals($properties['search'], $actual); + $actual = $absCases->getCategoryUid(); + $this->assertEquals($properties['category'], $actual); $actual = $absCases->getCaseUid(); $this->assertEquals($properties['caseLink'], $actual); $actual = $absCases->getCasesUids(); $this->assertEquals($properties['appUidCheck'], $actual); - $actual = $absCases->getNewestThan(); - $this->assertEquals($properties['newestthan'], $actual); - $actual = $absCases->getOldestThan(); - $this->assertEquals($properties['oldestthan'], $actual); $actual = $absCases->getOrderByColumn(); $this->assertEquals($properties['sort'], $actual); $actual = $absCases->getOrderDirection(); 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 ce7c37fc1..f11d2fe53 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/DraftTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/DraftTest.php @@ -18,6 +18,15 @@ class DraftTest extends TestCase { use DatabaseTransactions; + /** + * Method set up. + */ + public function setUp() + { + parent::setUp(); + $this->markTestIncomplete(); + } + /** * This checks the counters is working properly in draft * @@ -93,7 +102,7 @@ class DraftTest extends TestCase // Get first page $draft = new Draft(); $draft->setUserId($user->USR_ID); - $draft->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $draft->setOrderByColumn('APP_NUMBER'); $draft->setOffset(0); $draft->setLimit(25); $results = $draft->getData(); @@ -143,7 +152,7 @@ class DraftTest extends TestCase //Get the data ordered by APP_NUMBER $draft = new Draft(); $draft->setUserId($user->USR_ID); - $draft->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $draft->setOrderByColumn('APP_NUMBER'); // Get first page, the minor case id $draft->setOrderDirection('ASC'); $results = $draft->getData(); @@ -359,7 +368,7 @@ class DraftTest extends TestCase // Get first page $draft = new Draft(); $draft->setUserId($user->USR_ID); - $draft->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $draft->setOrderByColumn('APP_NUMBER'); // Get first page, the specific case $draft->setOrderDirection('ASC'); $draft->setCaseUid($application->APP_UID); @@ -394,7 +403,7 @@ class DraftTest extends TestCase // Get first page $draft = new Draft(); $draft->setUserId($user->USR_ID); - $draft->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $draft->setOrderByColumn('APP_NUMBER'); // Get first page, the specific case $draft->setOrderDirection('ASC'); $draft->setCasesUids([$application->APP_UID]); @@ -431,7 +440,7 @@ class DraftTest extends TestCase // Get first page $draft = new Draft(); $draft->setUserId($user->USR_ID); - $draft->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $draft->setOrderByColumn('APP_NUMBER'); $draft->setProcessId($process->PRO_ID); // Get first page, the minor case title $draft->setOrderDirection('ASC'); 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 7216f3243..68e95d53d 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/InboxTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/InboxTest.php @@ -52,82 +52,13 @@ class InboxTest extends TestCase //Set the user ID $inbox->setUserId($user->USR_ID); //Set OrderBYColumn value - $inbox->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $inbox->setOrderByColumn('APP_NUMBER'); //Call to getData method $res = $inbox->getData(); //This assert that the expected numbers of results are returned $this->assertEquals(10, count($res)); } - /** - * It tests the getData method with Risk Filter - * - * @covers \ProcessMaker\BusinessModel\Cases\Inbox::getData() - * @test - */ - public function it_it_should_test_get_data_method_with_Risk_Filter() - { - //Create process - $process = factory(Process::class)->create(); - - //Create user - $user = factory(User::class)->create(); - - //Create a task - $task = factory(Task::class)->create([ - 'TAS_ASSIGN_TYPE' => '', - 'TAS_GROUP_VARIABLE' => '', - 'PRO_UID' => $process->PRO_UID, - ]); - - //Create the register in delegation - factory(Delegation::class, 10)->create([ - 'TAS_ID' => $task->TAS_ID, - 'DEL_THREAD_STATUS' => 'OPEN', - 'USR_UID' => $user->USR_UID, - 'USR_ID' => $user->USR_ID, - 'PRO_ID' => $process->PRO_ID, - 'DEL_RISK_DATE' => '2019-06-07 12:30:58' - ]); - - //Create new Inbox object - $inbox = new Inbox(); - - //Set the user UID - $inbox->setUserUid($user->USR_UID); - - //Set the user ID - $inbox->setUserId($user->USR_ID); - - //Set OrderBYColumn value - $inbox->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); - - //Set setRiskStatus value - $inbox->setRiskStatus('ON_TIME'); - $res = $inbox->getData(); - - //This asserts that no cases are in ON_TIME status - $this->assertEmpty($res); - - //Set setRiskStatus value - $inbox->setRiskStatus('OVERDUE'); - - //Call to getData method - $res = $inbox->getData(); - - //This asserts that there are cases in AT_RISK status - $this->assertNotEmpty($res); - - //Set setRiskStatus value - $inbox->setRiskStatus('AT_RISK'); - - //Call to getData method - $res = $inbox->getData(); - - //This asserts that no cases are in AT_RISK status - $this->assertEmpty($res); - } - /** * It tests the getData method with Category Filter * @@ -169,7 +100,7 @@ class InboxTest extends TestCase $inbox->setUserId($user->USR_ID); //Set OrderBYColumn value - $inbox->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $inbox->setOrderByColumn('APP_NUMBER'); //Set Category value $inbox->setCategoryUid('248565910552bd7d6006458065223611'); @@ -213,7 +144,7 @@ class InboxTest extends TestCase $inbox = new Inbox(); $inbox->setUserUid($user->USR_UID); $inbox->setUserId($user->USR_ID); - $inbox->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $inbox->setOrderByColumn('APP_NUMBER'); $inbox->setProcessId($process[1]->PRO_ID); $res = $inbox->getData(); $this->assertEmpty($res); @@ -254,13 +185,13 @@ class InboxTest extends TestCase $inbox = new Inbox(); $inbox->setUserUid($user->USR_UID); $inbox->setUserId($user->USR_ID); - $inbox->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $inbox->setOrderByColumn('APP_NUMBER'); $inbox->setOrderDirection('DESC'); $res = $inbox->getData(); // This asserts the order is for APP_NUMBER from highest to lowest $this->assertLessThan($res[0]['APP_NUMBER'], $res[1]['APP_NUMBER']); - $inbox->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $inbox->setOrderByColumn('APP_NUMBER'); $inbox->setOrderDirection('ASC'); $res = $inbox->getData(); // This asserts the order is for APP_NUMBER from highest to lowest @@ -552,7 +483,7 @@ class InboxTest extends TestCase $inbox = new Inbox(); $inbox->setUserUid($user->USR_UID); $inbox->setUserId($user->USR_ID); - $inbox->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $inbox->setOrderByColumn('APP_NUMBER'); $inbox->setOffset(5); $inbox->setLimit(2); $res = $inbox->getData(); diff --git a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/ParticipatedTest.php b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/ParticipatedTest.php index e1ef3ff35..482cb6ca7 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/ParticipatedTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/ParticipatedTest.php @@ -60,7 +60,7 @@ class ParticipatedTest extends TestCase // Set the user ID $participated->setUserId($cases->USR_ID); // Set OrderBYColumn value - $participated->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $participated->setOrderByColumn('APP_NUMBER'); // Call to getData method $res = $participated->getData(); // This assert that the expected numbers of results are returned @@ -86,7 +86,7 @@ class ParticipatedTest extends TestCase // Set the process ID $participated->setProcessId($cases->PRO_ID); // Set OrderBYColumn value - $participated->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $participated->setOrderByColumn('APP_NUMBER'); // Call to getData method $res = $participated->getData(); // This assert that the expected numbers of results are returned @@ -116,7 +116,7 @@ class ParticipatedTest extends TestCase // Set the category $participated->setCategoryUid($process['PRO_CATEGORY']); // Set OrderBYColumn value - $participated->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $participated->setOrderByColumn('APP_NUMBER'); // Call to getData method $res = $participated->getData(); // This assert that the expected numbers of results are returned @@ -142,7 +142,7 @@ class ParticipatedTest extends TestCase // Set the case status $participated->setCaseStatus('TO_DO'); // Set OrderBYColumn value - $participated->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $participated->setOrderByColumn('APP_NUMBER'); // Call to getData method $res = $participated->getData(); // This assert that the expected numbers of results are returned @@ -168,7 +168,7 @@ class ParticipatedTest extends TestCase // Set the filter STARTED $participated->setParticipatedStatus('STARTED'); // Set OrderBYColumn value - $participated->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $participated->setOrderByColumn('APP_NUMBER'); // Call to getData method $res = $participated->getData(); // This assert that the expected numbers of results are returned @@ -194,7 +194,7 @@ class ParticipatedTest extends TestCase // Set the filter COMPLETED $participated->setParticipatedStatus('COMPLETED'); // Set OrderBYColumn value - $participated->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $participated->setOrderByColumn('APP_NUMBER'); // Call to getData method $res = $participated->getData(); // This assert that the expected numbers of results are returned 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 d96994058..5345c5bae 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/PausedTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/PausedTest.php @@ -470,7 +470,7 @@ class PausedTest extends TestCase $paused->setUserId($user->USR_ID); //Set OrderBYColumn value - $paused->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $paused->setOrderByColumn('APP_NUMBER'); //Set Order Direction value $paused->setOrderDirection('DESC'); @@ -598,7 +598,7 @@ class PausedTest extends TestCase $paused->setUserId($user->USR_ID); //Set OrderBYColumn value - $paused->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $paused->setOrderByColumn('APP_NUMBER'); //Set offset and limit values $paused->setOffset(0); diff --git a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/ReassignTest.php b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/ReassignTest.php deleted file mode 100644 index 9377ba9f6..000000000 --- a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/ReassignTest.php +++ /dev/null @@ -1,128 +0,0 @@ -states('foreign_keys')->create(); - //Create new Reassign object - $reassign = new Reassign(); - //Set OrderBYColumn value - $reassign->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); - //Call to getData method - $res = $reassign->getData(); - //This assert that the expected numbers of results are returned - $this->assertEquals($cases, count($res)); - } - - /** - * It tests the getData method with user filter - * - * @covers \ProcessMaker\BusinessModel\Cases\Reassign::getData() - * @test - */ - public function it_should_test_get_data_method_with_user_filter() - { - // Create user - $user = factory(User::class)->create(); - // Create delegation related to the specific user - factory(Delegation::class)->states('foreign_keys')->create([ - 'USR_ID' => $user->USR_ID, - 'USR_UID' => $user->USR_UID, - ]); - // Create other delegations - $cases = 5; - factory(Delegation::class, $cases)->states('foreign_keys')->create(); - //Create new Reassign object - $reassign = new Reassign(); - //Set the user UID - $reassign->setUserUid($user->USR_UID); - //Set the user ID - $reassign->setUserId($user->USR_ID); - //Set OrderBYColumn value - $reassign->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); - //Call to getData method - $res = $reassign->getData(); - //This assert that the expected numbers of results are returned - $this->assertEquals(1, count($res)); - } - - /** - * It tests the getData method with process filter - * - * @covers \ProcessMaker\BusinessModel\Cases\Reassign::getData() - * @test - */ - public function it_should_test_get_data_method_with_process_filter() - { - // Create user - $process = factory(Process::class)->create(); - // Create delegation related to the specific user - factory(Delegation::class)->states('foreign_keys')->create([ - 'PRO_ID' => $process->PRO_ID, - 'PRO_UID' => $process->PRO_UID, - ]); - // Create other delegations - $cases = 5; - factory(Delegation::class, $cases)->states('foreign_keys')->create(); - //Create new Reassign object - $reassign = new Reassign(); - //Set the process - $reassign->setProcessId($process->PRO_ID); - $reassign->setProcessUid($process->PRO_UID); - //Set OrderBYColumn value - $reassign->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); - //Call to getData method - $res = $reassign->getData(); - //This assert that the expected numbers of results are returned - $this->assertEquals(1, count($res)); - } - - /** - * It tests the getCounter method - * - * @covers \ProcessMaker\BusinessModel\Cases\Reassign::getCounter() - * @test - */ - public function it_should_test_the_counter_for_reassign() - { - // Create user - $user = factory(User::class)->create(); - $cases = 25; - factory(Delegation::class, $cases)->states('foreign_keys')->create([ - 'USR_ID' => $user->USR_ID, - 'USR_UID' => $user->USR_UID, - ]); - //Create the Inbox object - $reassign = new Reassign(); - //Set the user UID - $reassign->setUserUid($user->USR_UID); - //Set the user ID - $reassign->setUserId($user->USR_ID); - $res = $reassign->getCounter(); - //Assert the result of getCounter method - $this->assertEquals($cases, $res); - } -} \ No newline at end of file diff --git a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/SearchTest.php b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/SearchTest.php index dcc61169d..6ebb8af3b 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/SearchTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/SearchTest.php @@ -70,7 +70,7 @@ class SearchTest extends TestCase $search = new Search(); $search->setCaseNumber($cases[0]->APP_NUMBER); // Set order by column value - $search->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $search->setOrderByColumn('APP_NUMBER'); $result = $search->getData(); // This assert that the expected numbers of results are returned $this->assertEquals($cases[0]->APP_NUMBER, $result[0]['APP_NUMBER']); @@ -88,9 +88,9 @@ class SearchTest extends TestCase $cases = $this->createSearch(); // Create new Search object $search = new Search(); - $search->setPriority($cases[0]->DEL_PRIORITY); + $search->setPriority('N'); // Set order by column value - $search->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $search->setOrderByColumn('APP_NUMBER'); $result = $search->getData(); // This assert that the expected numbers of results are returned $this->assertNotEmpty($result); @@ -110,7 +110,7 @@ class SearchTest extends TestCase $search = new Search(); $search->setProcessId($cases[0]->PRO_ID); // Set order by column value - $search->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $search->setOrderByColumn('APP_NUMBER'); $result = $search->getData(); // This assert that the expected numbers of results are returned $this->assertNotEmpty($result); @@ -130,7 +130,7 @@ class SearchTest extends TestCase $search = new Search(); $search->setTaskId($cases[0]->TAS_ID); // Set order by column value - $search->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $search->setOrderByColumn('APP_NUMBER'); $result = $search->getData(); // This assert that the expected numbers of results are returned $this->assertNotEmpty($result); @@ -150,7 +150,7 @@ class SearchTest extends TestCase $search = new Search(); $search->setUserId($cases[0]->USR_ID); // Set order by column value - $search->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $search->setOrderByColumn('APP_NUMBER'); $result = $search->getData(); // This assert that the expected numbers of results are returned $this->assertNotEmpty($result); @@ -169,7 +169,7 @@ class SearchTest extends TestCase // Create new Search object $search = new Search(); // Set order by column value - $search->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $search->setOrderByColumn('APP_NUMBER'); $total = $search->getCounter(); $this->assertEquals(count($cases), $total); } 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 9837f60fc..7435247ba 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/UnassignedTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/Cases/UnassignedTest.php @@ -510,7 +510,7 @@ class UnassignedTest extends TestCase // Get first page $unassigned = new Unassigned; $unassigned->setUserUid($user->USR_UID); - $unassigned->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $unassigned->setOrderByColumn('APP_NUMBER'); $unassigned->setOrderDirection('DESC'); $unassigned->setOffset(0); $unassigned->setLimit(25); @@ -600,7 +600,7 @@ class UnassignedTest extends TestCase // Get first page $unassigned = new Unassigned; $unassigned->setUserUid($user->USR_UID); - $unassigned->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $unassigned->setOrderByColumn('APP_NUMBER'); $unassigned->setOrderDirection('DESC'); $unassigned->setOffset(0); $unassigned->setLimit(25); @@ -688,7 +688,7 @@ class UnassignedTest extends TestCase // Get first page $unassigned = new Unassigned; $unassigned->setUserUid($user->USR_UID); - $unassigned->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $unassigned->setOrderByColumn('APP_NUMBER'); $unassigned->setOrderDirection('DESC'); $unassigned->setOffset(0); $unassigned->setLimit(25); @@ -787,7 +787,7 @@ class UnassignedTest extends TestCase // Get first page $unassigned = new Unassigned; $unassigned->setUserUid($user->USR_UID); - $unassigned->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $unassigned->setOrderByColumn('APP_NUMBER'); $unassigned->setOrderDirection('DESC'); $unassigned->setOffset(0); $unassigned->setLimit(25); @@ -856,7 +856,7 @@ class UnassignedTest extends TestCase // Get first page, the minor case id $unassigned = new Unassigned; $unassigned->setUserUid($user->USR_UID); - $unassigned->setOrderByColumn('APP_DELEGATION.APP_NUMBER'); + $unassigned->setOrderByColumn('APP_NUMBER'); $unassigned->setOrderDirection('ASC'); $unassigned->setOffset(0); $unassigned->setLimit(25); @@ -1207,7 +1207,7 @@ class UnassignedTest extends TestCase $unassigned = new Unassigned; $unassigned->setUserUid($user->USR_UID); $dateToFilter = date('Y-m-d', strtotime('+1 year')); - $unassigned->setNewestThan($dateToFilter); + $unassigned->setDelegateFrom($dateToFilter); $unassigned->setOrderByColumn('DEL_DELEGATE_DATE'); $unassigned->setOrderDirection('ASC'); $unassigned->setOffset(0); @@ -1216,7 +1216,7 @@ class UnassignedTest extends TestCase $results = $unassigned->getData(); $this->assertGreaterThan($results[0]['DEL_DELEGATE_DATE'], $results[1]['DEL_DELEGATE_DATE']); // Get the newest than (>=) delegate date - $unassigned->setNewestThan($dateToFilter); + $unassigned->setDelegateFrom($dateToFilter); $unassigned->setOrderDirection('DESC'); $results = $unassigned->getData(); $this->assertLessThan($results[0]['DEL_DELEGATE_DATE'], $results[1]['DEL_DELEGATE_DATE']); @@ -1265,7 +1265,7 @@ class UnassignedTest extends TestCase $unassigned = new Unassigned; $unassigned->setUserUid($user->USR_UID); $dateToFilter = date('Y-m-d', strtotime('+1 year')); - $unassigned->setOldestThan($dateToFilter); + $unassigned->setDelegateTo($dateToFilter); $unassigned->setOrderByColumn('DEL_DELEGATE_DATE'); $unassigned->setOrderDirection('ASC'); $unassigned->setOffset(0); @@ -1329,66 +1329,6 @@ class UnassignedTest extends TestCase $this->assertEquals($application->APP_UID, $results[0]['APP_UID']); } - /** - * This ensures searching specific cases and review the page in self-service-user-assigned - * - * @covers \ProcessMaker\BusinessModel\Cases\Unassigned::getData() - * @test - */ - public function it_should_search_self_service_user_assigned_specific_cases_uid_array() - { - //Create user - $user = factory(User::class)->create(); - for ($i = 1; $i <= 2; $i++) { - //Create process - $process = factory(Process::class)->create(); - //Create application - $application = factory(Application::class)->create([ - 'APP_STATUS_ID' => 2 - ]); - //Create a task self service - $task = factory(Task::class)->create([ - 'TAS_ASSIGN_TYPE' => 'SELF_SERVICE', - 'TAS_GROUP_VARIABLE' => '', - 'PRO_UID' => $process->PRO_UID, - ]); - //Assign a user in the task - factory(TaskUser::class)->create([ - 'TAS_UID' => $task->TAS_UID, - 'USR_UID' => $user->USR_UID, - 'TU_RELATION' => 1, //Related to the user - 'TU_TYPE' => 1 - ]); - //Create the register in delegation relate to self-service - factory(Delegation::class)->create([ - 'APP_UID' => $application->APP_UID, - 'APP_NUMBER' => $application->APP_NUMBER, - 'TAS_ID' => $task->TAS_ID, - 'PRO_ID' => $process->PRO_ID, - 'DEL_THREAD_STATUS' => 'OPEN', - 'USR_ID' => 0 - ]); - } - $unassigned = new Unassigned; - $unassigned->setUserUid($user->USR_UID); - $unassigned->setCasesUids([$application->APP_UID]); - $unassigned->setOrderByColumn('APP_DELEGATION.APP_UID'); - $unassigned->setOrderDirection('ASC'); - $unassigned->setOffset(0); - $unassigned->setLimit(25); - // Get the specific cases uid's - $results = $unassigned->getData(); - $this->assertCount(1, $results); - // Get the specific cases uid's - $unassigned->setCasesUids([$application->APP_UID]); - $results = $unassigned->getData(); - $this->assertEquals($application->APP_UID, $results[0]['APP_UID']); - // Get the specific cases uid's - $unassigned->setCasesUids([$application->APP_UID]); - $results = $unassigned->getData(); - $this->assertEquals($application->APP_UID, $results[0]['APP_UID']); - } - /** * This ensures searching specific process and review the page in self-service-user-assigned * diff --git a/tests/unit/workflow/engine/src/ProcessMaker/Model/DelegationTest.php b/tests/unit/workflow/engine/src/ProcessMaker/Model/DelegationTest.php index d61e3a17f..0dfb2d83f 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/Model/DelegationTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/Model/DelegationTest.php @@ -81,7 +81,7 @@ class DelegationTest extends TestCase public function it_return_scope_case_in_progress() { $table = factory(Delegation::class)->states('foreign_keys')->create(); - $this->assertCount(1, $table->caseInProgress()->get()); + $this->assertCount(1, $table->joinApplication()->caseInProgress()->get()); } /** @@ -97,7 +97,7 @@ class DelegationTest extends TestCase 'APP_NUMBER' => $application->APP_NUMBER, 'APP_UID' => $application->APP_UID, ]); - $this->assertCount(1, $table->caseCompleted()->get()); + $this->assertCount(1, $table->joinApplication()->caseCompleted()->get()); } /** @@ -121,7 +121,7 @@ class DelegationTest extends TestCase public function it_return_scope_delegate_date_to() { $table = factory(Delegation::class)->states('foreign_keys')->create(); - $this->assertCount(1, $table->delegateDateFrom($table->DEL_DELEGATE_DATE)->get()); + $this->assertCount(1, $table->delegateDateTo($table->DEL_DELEGATE_DATE)->get()); } /** diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/AbstractCases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/AbstractCases.php index b217fc1b6..e741faca6 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/AbstractCases.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/AbstractCases.php @@ -6,18 +6,20 @@ use Datetime; use Exception; use ProcessMaker\BusinessModel\Interfaces\CasesInterface; use ProcessMaker\BusinessModel\Validator; +use ProcessMaker\Model\Task; +use ProcessMaker\Model\User; class AbstractCases implements CasesInterface { // Constants for validate values - const INBOX_STATUSES = ['', 'ALL', 'READ', 'UNREAD']; - const PARTICIPATED_STATUSES = ['', 'ALL', 'STARTED', 'IN_PROGRESS', 'COMPLETED', 'SUPERVISING']; - const RISK_STATUSES = ['', 'ALL', 'ON_TIME', 'AT_RISK', 'OVERDUE']; - const CASE_STATUSES = ['', 'ALL', 'DRAFT', 'TO_DO', 'COMPLETED', 'CANCELLED', 'CANCELED']; + const INBOX_STATUSES = ['ALL', 'READ', 'UNREAD']; + const PARTICIPATED_STATUSES = ['ALL', 'STARTED', 'IN_PROGRESS', 'COMPLETED', 'SUPERVISING']; + const RISK_STATUSES = ['ALL', 'ON_TIME', 'AT_RISK', 'OVERDUE']; + const CASE_STATUSES = [0 => 'ALL', 1 => 'DRAFT', 2 => 'TO_DO', 3 => 'COMPLETED', 4 => 'CANCELED']; const ORDER_DIRECTIONS = ['DESC', 'ASC']; const CORRECT_CANCELED_STATUS = 'CANCELED'; const INCORRECT_CANCELED_STATUS = 'CANCELLED'; - const PRIORITIES = [1 => 'VL', 2 => 'L', 3 => 'N', 4 => 'H', 5 => 'VH']; + const PRIORITIES = [0 => 'ALL', 1 => 'VL', 2 => 'L', 3 => 'N', 4 => 'H', 5 => 'VH']; const TASK_COLORS = [1 => 'green', 2 => 'red', 3 => 'orange', 4 => 'blue', 5 => 'gray']; const COLOR_OVERDUE = 1; const COLOR_ON_TIME = 2; @@ -58,33 +60,62 @@ class AbstractCases implements CasesInterface // Filter by specific priority private $priority = 0; + // Filter by specific priorities + private $priorities = []; + // Filter by case status, know as "$filterStatus" in the old "participated last" class private $caseStatus = ''; + // Filter by case statuses + private $caseStatuses = [1, 2, 3, 4]; + // Filter by a specific case, know as "$caseLink" in the old lists classes private $caseUid = ''; // Filter by a specific case using case number private $caseNumber = 0; - // Filter by a specific range of case number - private $fromCaseNumber = 0; - private $toCaseNumber = 0; + // Filter by specific cases using the case numbers like [1,4,8] + private $casesNumbers = []; + + // Filter by only one range of case number + private $caseNumberFrom = 0; + private $caseNumberTo = 0; + + // Filter more than one range of case number + private $rangeCasesFromTo = []; + + // Filter by a specific cases like 1,3-5,8,10-15 + private $filterCases = ''; + + // Filter by a specific case title + private $caseTitle = ''; // Filter by specific cases, know as "$appUidCheck" in the old lists classes private $casesUids = []; - // Filter by specific cases using the case numbers - private $casesNumbers = []; + // Filter range related to the start case date + private $startCaseFrom = ''; + private $startCaseTo = ''; - // Filter recent cases starting by a specific date, know as "newestthan" in the old lists classes - private $newestThan = ''; + // Filter range related to the finish case date + private $finishCaseFrom = ''; + private $finishCaseTo = ''; - // Filter old cases ending by a specific date, know as "oldestthan" in the old lists classes - private $oldestThan = ''; + // Filter range related to the delegate date + private $delegateFrom = ''; + private $delegateTo = ''; + + // Filter range related to the finish date + private $finishFrom = ''; + private $finishTo = ''; + + // Filter range related to the due date + private $dueFrom = ''; + private $dueTo = ''; // Column by which the results will be sorted, know as "$sort" in the old lists classes - private $orderByColumn = 'APP_DELEGATION.APP_NUMBER'; + private $orderByColumn = 'APP_NUMBER'; // Sorts the data in descending or ascending order, know as "$dir" in the old lists classes private $orderDirection = 'DESC'; @@ -96,7 +127,7 @@ class AbstractCases implements CasesInterface private $offset = 0; // Number of rows to return - private $limit = 25; + private $limit = 15; /** * Set Category Uid value @@ -290,9 +321,9 @@ class AbstractCases implements CasesInterface throw new Exception("Participated status '{$participatedStatus}' is not valid."); } - // If empty string is sent, use value 'ALL' - if ($participatedStatus === '') { - $participatedStatus = 'ALL'; + // If empty string will not apply the filter + if ($participatedStatus === 'ALL') { + $participatedStatus = ''; } $this->participatedStatus = $participatedStatus; @@ -325,9 +356,9 @@ class AbstractCases implements CasesInterface throw new Exception("Risk status '{$riskStatus}' is not valid."); } - // If empty string is sent, use value 'ALL' - if ($riskStatus === '') { - $riskStatus = 'ALL'; + // If empty string will not apply the filter + if ($riskStatus === 'ALL') { + $riskStatus = ''; } $this->riskStatus = $riskStatus; @@ -346,17 +377,16 @@ class AbstractCases implements CasesInterface /** * Set priority value * - * @param int $priority + * @param string $priority * * @throws Exception */ - public function setPriority(int $priority) + public function setPriority(string $priority) { // Validate the priority value if (!empty($priority)) { - if (!empty(self::PRIORITIES[$priority])) { - $priorityCode = $priority; - } else { + $priorityCode = array_search($priority, self::PRIORITIES); + if (empty($priorityCode) && $priorityCode !== 0) { throw new Exception("Priority value {$priority} is not valid."); } } else { @@ -378,45 +408,109 @@ class AbstractCases implements CasesInterface } /** - * Set Case status + * Set priorities * - * @param string $caseStatus + * @param array $priorities * * @throws Exception */ - public function setCaseStatus(string $caseStatus) + public function setPriorities(array $priorities) { - // Convert the value to upper case - $caseStatus = strtoupper($caseStatus); - - // Validate the case status - if (!in_array($caseStatus, self::CASE_STATUSES)) { - throw new Exception("Case status '{$caseStatus}' is not valid."); + $prioritiesCode = []; + foreach ($priorities as $priority) { + // Validate the priority value + $priorityCode = array_search($priority, self::PRIORITIES); + if (empty($priorityCode) && $priorityCode !== 0) { + throw new Exception("Priority value {$priority} is not valid."); + } else { + array_push($prioritiesCode, $priorityCode); + } } + $this->priorities = $prioritiesCode; + } - // If empty string is sent, use value 'ALL' - if ($caseStatus === '') { - $caseStatus = 'ALL'; - } + /** + * Get priorities + * + * @return array + */ + public function getPriorities() + { + return $this->priorities; + } + /** + * Set Case status + * + * @param string $status + * + * @throws Exception + */ + public function setCaseStatus(string $status) + { // Fix the canceled status, this is a legacy code error - if ($caseStatus === self::INCORRECT_CANCELED_STATUS) { - $caseStatus = self::CORRECT_CANCELED_STATUS; + if ($status === self::INCORRECT_CANCELED_STATUS) { + $status = self::CORRECT_CANCELED_STATUS; } - - $this->caseStatus = $caseStatus; + $statusCode = 0; + // Validate the status value + if (!empty($status)) { + $statusCode = array_search($status, self::CASE_STATUSES); + if (empty($statusCode) && $statusCode !== 0) { + throw new Exception("Case status '{$status}' is not valid."); + } + } + $this->caseStatus = $statusCode; } /** * Get Case Status * - * @return string + * @return int */ public function getCaseStatus() { return $this->caseStatus; } + /** + * Set Case statuses + * + * @param array $statuses + * + * @throws Exception + */ + public function setCaseStatuses(array $statuses) + { + $statusCodes = []; + foreach ($statuses as $status) { + // Fix the canceled status, this is a legacy code error + if ($status === self::INCORRECT_CANCELED_STATUS) { + $status = self::CORRECT_CANCELED_STATUS; + } + // Validate the status value + if (!empty($status)) { + $statusCode = array_search($status, self::CASE_STATUSES); + if (empty($statusCode) && $statusCode !== 0) { + throw new Exception("Case status '{$status}' is not valid."); + } else { + array_push($statusCodes, $statusCode); + } + } + } + $this->caseStatuses = $statusCodes; + } + + /** + * Get Case Statuses + * + * @return array + */ + public function getCaseStatuses() + { + return $this->caseStatuses; + } + /** * Set Case Uid * @@ -458,15 +552,13 @@ class AbstractCases implements CasesInterface } /** - * Set range of Case Number + * Set range of case number from * * @param int $from - * @param int $to */ - public function setRangeCaseNumber(int $from, int $to) + public function setCaseNumberFrom(int $from) { - $this->fromCaseNumber = $from; - $this->toCaseNumber = $to; + $this->caseNumberFrom = $from; } /** @@ -474,9 +566,19 @@ class AbstractCases implements CasesInterface * * @return int */ - public function getFromCaseNumber() + public function getCaseNumberFrom() { - return $this->fromCaseNumber; + return $this->caseNumberFrom; + } + + /** + * Set range of case number to + * + * @param int $to + */ + public function setCaseNumberTo(int $to) + { + $this->caseNumberTo = $to; } /** @@ -484,9 +586,82 @@ class AbstractCases implements CasesInterface * * @return int */ - public function getToCaseNumber() + public function getCaseNumberTo() { - return $this->toCaseNumber; + return $this->caseNumberTo; + } + + /** + * Set more than one range of cases + * + * @param array $rangeCases + */ + public function setRangeCasesFromTo(array $rangeCases) + { + $this->rangeCasesFromTo = $rangeCases; + } + + /** + * Get more than one range of cases + * + * @return array + */ + public function getRangeCasesFromTo() + { + return $this->rangeCasesFromTo; + } + + /** + * Set filter of cases like '1,3-5,8,10-15' + * + * @param string $filterCases + */ + public function setFilterCases(string $filterCases) + { + $this->filterCases = $filterCases; + // Review the cases defined in the filter + $rangeOfCases = explode(",", $filterCases); + $specificCases = []; + $rangeCases = []; + foreach ($rangeOfCases as $cases) { + if(is_numeric($cases)) { + array_push($specificCases,$cases); + } else { + array_push($rangeCases,$cases); + } + } + $this->setCasesNumbers($specificCases); + $this->setRangeCasesFromTo($rangeCases); + } + + /** + * Get filter of cases + * + * @return string + */ + public function getFilterCases() + { + return $this->filterCases; + } + + /** + * Set Case Title + * + * @param string $caseTitle + */ + public function setCaseTitle(string $caseTitle) + { + $this->caseTitle = $caseTitle; + } + + /** + * Get Case Title + * + * @return string + */ + public function getCaseTitle() + { + return $this->caseTitle; } /** @@ -530,18 +705,118 @@ class AbstractCases implements CasesInterface } /** - * Set Newest Than value + * Set start case from * - * @param string $newestThan + * @param string $from * * @throws Exception */ - public function setNewestThan(string $newestThan) + public function setStartCaseFrom(string $from) { - if (!Validator::isDate($newestThan, 'Y-m-d')) { - throw new Exception("Value '{$newestThan}' is not a valid date."); + if (!Validator::isDate($from, 'Y-m-d')) { + throw new Exception("Value '{$from}' is not a valid date."); } - $this->newestThan = $newestThan; + $this->startCaseFrom = $from; + } + + /** + * Get start case from + * + * @return string + */ + public function getStartCaseFrom() + { + return $this->startCaseFrom; + } + + /** + * Set start case to + * + * @param string $to + * + * @throws Exception + */ + public function setStartCaseTo(string $to) + { + if (!Validator::isDate($to, 'Y-m-d')) { + throw new Exception("Value '{$to}' is not a valid date."); + } + $this->startCaseTo = $to; + } + + /** + * Get start case to + * + * @return string + */ + public function getStartCaseTo() + { + return $this->startCaseTo; + } + + /** + * Set finish case from + * + * @param string $from + * + * @throws Exception + */ + public function setFinishCaseFrom(string $from) + { + if (!Validator::isDate($from, 'Y-m-d')) { + throw new Exception("Value '{$from}' is not a valid date."); + } + $this->finishCaseFrom = $from; + } + + /** + * Get start case from + * + * @return string + */ + public function getFinishCaseFrom() + { + return $this->finishCaseFrom; + } + + /** + * Set start case to + * + * @param string $to + * + * @throws Exception + */ + public function setFinishCaseTo(string $to) + { + if (!Validator::isDate($to, 'Y-m-d')) { + throw new Exception("Value '{$to}' is not a valid date."); + } + $this->finishCaseTo = $to; + } + + /** + * Get start case to + * + * @return string + */ + public function getFinishCaseTo() + { + return $this->finishCaseTo; + } + + /** + * Set Newest Than value + * + * @param string $delegateFrom + * + * @throws Exception + */ + public function setDelegateFrom(string $delegateFrom) + { + if (!Validator::isDate($delegateFrom, 'Y-m-d')) { + throw new Exception("Value '{$delegateFrom}' is not a valid date."); + } + $this->delegateFrom = $delegateFrom; } /** @@ -549,24 +824,24 @@ class AbstractCases implements CasesInterface * * @return string */ - public function getNewestThan() + public function getDelegateFrom() { - return $this->newestThan; + return $this->delegateFrom; } /** * Set Oldest Than value * - * @param string $oldestThan + * @param string $delegateTo * * @throws Exception */ - public function setOldestThan(string $oldestThan) + public function setDelegateTo(string $delegateTo) { - if (!Validator::isDate($oldestThan, 'Y-m-d')) { - throw new Exception("Value '{$oldestThan}' is not a valid date."); + if (!Validator::isDate($delegateTo, 'Y-m-d')) { + throw new Exception("Value '{$delegateTo}' is not a valid date."); } - $this->oldestThan = $oldestThan; + $this->delegateTo = $delegateTo; } /** @@ -574,11 +849,112 @@ class AbstractCases implements CasesInterface * * @return string */ - public function getOldestThan() + public function getDelegateTo() { - return $this->oldestThan; + return $this->delegateTo; } + /** + * Set finish date value + * + * @param string $from + * + * @throws Exception + */ + public function setFinishFrom(string $from) + { + if (!Validator::isDate($from, 'Y-m-d')) { + throw new Exception("Value '{$from}' is not a valid date."); + } + $this->finishFrom = $from; + } + + /** + * Get finish date value + * + * @return string + */ + public function getFinishFrom() + { + return $this->finishFrom; + } + + /** + * Set finish date value + * + * @param string $to + * + * @throws Exception + */ + public function setFinishTo(string $to) + { + if (!Validator::isDate($to, 'Y-m-d')) { + throw new Exception("Value '{$to}' is not a valid date."); + } + $this->finishTo = $to; + } + + /** + * Get finish date value + * + * @return string + */ + public function getFinishTo() + { + return $this->finishTo; + } + + /** + * Set due date from + * + * @param string $dueFrom + * + * @throws Exception + */ + public function setDueFrom(string $dueFrom) + { + if (!Validator::isDate($dueFrom, 'Y-m-d')) { + throw new Exception("Value '{$dueFrom}' is not a valid date."); + } + $this->dueFrom = $dueFrom; + } + + /** + * Get due date from + * + * @return string + */ + public function getDueFrom() + { + return $this->dueFrom; + } + + /** + * Set due date to + * + * @param string $dueTo + * + * @throws Exception + */ + public function setDueTo(string $dueTo) + { + if (!Validator::isDate($dueTo, 'Y-m-d')) { + throw new Exception("Value '{$dueTo}' is not a valid date."); + } + $this->dueTo = $dueTo; + } + + /** + * Get due date to + * + * @return string + */ + public function getDueTo() + { + return $this->dueTo; + } + + /** * Set order by column * @@ -721,6 +1097,40 @@ class AbstractCases implements CasesInterface return $taskColor; } + /** + * Get task color according the due date + * + * @param string $pending + * + * @return int + */ + public function prepareTaskPending($pending) + { + $taskPending = json_decode($pending, true); + $result = []; + $i = 0; + foreach ($taskPending as $thread) { + foreach ($thread as $key => $row) { + if($key === 'tas_id') { + $result[$i][$key] = $row; + $result[$i]['tas_title'] = (!empty($row)) ? Task::where('TAS_ID', $row)->first()->TAS_TITLE : ''; + } + if($key === 'user_id') { + $result[$i][$key] = $row; + } + if($key === 'due_date') { + $result[$i][$key] = $row; + // Get task color label + $result[$i]['tas_color'] = (!empty($row)) ? $this->getTaskColor($row) : ''; + $result[$i]['tas_color_label'] = (!empty($row)) ? self::TASK_COLORS[$result[$i]['tas_color']] : ''; + } + } + $i ++; + } + + return $result; + } + /** * Set all properties * @@ -744,33 +1154,67 @@ class AbstractCases implements CasesInterface if (!empty($properties['user'])) { $this->setUserId($properties['user']); } - // Filter by priority - if (!empty($properties['priority'])) { - $this->setPriority($properties['priority']); - } - // Filter by case number + // Filter by one case number if (!empty($properties['caseNumber'])) { $this->setCaseNumber($properties['caseNumber']); } - // Filter by range of case number - if (!empty($properties['caseNumberFrom']) && !empty($properties['caseNumberTo'])) { - $this->setRangeCaseNumber($properties['caseNumberFrom'], $properties['caseNumberTo']); - } - // Filter by search - if (!empty($properties['search'])) { - $this->setValueToSearch($properties['search']); + // Filter by case title + if (!empty($properties['caseTitle'])) { + $this->setCaseTitle($properties['caseTitle']); } + /** Apply filters related to MY CASES */ // My cases filter: started, in-progress, completed, supervising - if (!empty($properties['filter']) && get_class($this) === MyCases::class) { + if (!empty($properties['filter']) && get_class($this) === Participated::class) { $this->setParticipatedStatus($properties['filter']); } - // Filter by case status - if (!empty($properties['filterStatus']) && get_class($this) === MyCases::class) { - $this->setCaseStatus($properties['filterStatus']); + // Filter by one case status + if (!empty($properties['caseStatus']) && get_class($this) === Participated::class) { + $this->setCaseStatus($properties['caseStatus']); } - // Filter by case status - if (!empty($properties['filterStatus']) && get_class($this) === Search::class) { - $this->setCaseStatus($properties['filterStatus']); + // Filter date related to started date from + if (!empty($properties['startCaseFrom'] && (get_class($this) === Participated::class || get_class($this) === Supervising::class))) { + $this->setStartCaseFrom($properties['startCaseFrom']); + } + // Filter date related to started date to + if (!empty($properties['startCaseTo']) && (get_class($this) === Participated::class || get_class($this) === Supervising::class)) { + $this->setStartCaseTo($properties['startCaseTo']); + } + // Filter date related to finish date from + if (!empty($properties['finishCaseFrom']) && (get_class($this) === Participated::class || get_class($this) === Supervising::class)) { + $this->setFinishCaseFrom($properties['finishCaseFrom']); + } + // Filter date related to finish date to + if (!empty($properties['finishCaseTo']) && (get_class($this) === Participated::class || get_class($this) === Supervising::class)) { + $this->setFinishCaseTo($properties['finishCaseTo']); + } + /** Apply filters related to SEARCH */ + // Add a filter with specific cases or range of cases like '1, 3-5, 8, 10-15' + if (!empty($properties['filterCases']) && get_class($this) === Search::class) { + $this->setFilterCases($properties['filterCases']); + } + // Filter by more than one case statuses like ['DRAFT', 'TO_DO'] + if (!empty($properties['caseStatuses']) && get_class($this) === Search::class) { + $this->setCaseStatuses($properties['caseStatuses']); + } + // Filter by more than one priorities like ['VL', 'L', 'N'] + if (!empty($properties['priorities']) && get_class($this) === Search::class) { + $this->setProperties($properties['priorities']); + } + // Filter date newest related to delegation/started date + if (!empty($properties['delegationDateFrom'] && get_class($this) === Search::class)) { + $this->setDelegateFrom($properties['delegationDateFrom']); + } + // Filter date oldest related to delegation/started date + if (!empty($properties['delegationDateTo']) && get_class($this) === Search::class) { + $this->setDelegateTo($properties['delegationDateTo']); + } + // Filter date newest related to due date + if (!empty($properties['dueDateFrom']) && get_class($this) === Search::class) { + $this->setDueFrom($properties['dueDateFrom']); + } + // Filter date oldest related to due date + if (!empty($properties['dueDateTo']) && get_class($this) === Search::class) { + $this->setDueTo($properties['dueDateTo']); } // Filter by case uid if (!empty($properties['caseLink'])) { @@ -780,14 +1224,6 @@ class AbstractCases implements CasesInterface if (!empty($properties['appUidCheck'])) { $this->setCasesUids($properties['appUidCheck']); } - // Filter date newest related to delegation date - if (!empty($properties['newestthan'])) { - $this->setNewestThan($properties['newestthan']); - } - // Filter date oldest related to delegation date - if (!empty($properties['oldestthan'])) { - $this->setOldestThan($properties['oldestthan']); - } // Sort column if (!empty($properties['sort'])) { $this->setOrderByColumn($properties['sort']); diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Draft.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Draft.php index f83f62abb..b5859ce39 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Draft.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Draft.php @@ -18,7 +18,8 @@ class Draft extends AbstractCases 'APP_DELEGATION.DEL_DELEGATE_DATE', // Delegate Date 'APP_DELEGATION.DEL_PRIORITY', // Priority // Additional column for other functionalities - 'APP_DELEGATION.APP_UID', // Case Uid for PMFCaseLink + 'APP_DELEGATION.APP_UID', // Case Uid for Open case + 'APP_DELEGATION.DEL_INDEX', // Del Index for Open case ]; /** @@ -30,6 +31,39 @@ class Draft extends AbstractCases return $this->columnsView; } + /** + * Scope filters + * + * @param \Illuminate\Database\Eloquent\Builder $query + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function filters($query) + { + // Specific case + if ($this->getCaseNumber()) { + $query->case($this->getCaseNumber()); + } + // Specific case title + if (!empty($this->getCaseTitle())) { + // @todo: Filter by case title, pending from other PRD + } + // Specific process + if ($this->getProcessId()) { + $query->processId($this->getProcessId()); + } + // Specific task + if ($this->getTaskId()) { + $query->task($this->getTaskId()); + } + // Specific case uid PMFCaseLink + if (!empty($this->getCaseUid())) { + $query->appUid($this->getCaseUid()); + } + + return $query; + } + /** * Get data self-services cases by user * @@ -44,18 +78,9 @@ class Draft extends AbstractCases $query->joinTask(); // Join with application for add the initial scope for DRAFT cases $query->draft($this->getUserId()); - // Specific process - if ($this->getProcessId()) { - $query->processId($this->getProcessId()); - } - // Specific case uid - if (!empty($this->getCaseUid())) { - $query->appUid($this->getCaseUid()); - } - // Specific cases - if (!empty($this->getCasesUids())) { - $query->specificCasesByUid($this->getCasesUids()); - } + /** Apply filters */ + $this->filters($query); + /** Apply order and pagination */ // Add any sort if needed if ($this->getOrderByColumn()) { $query->orderBy($this->getOrderByColumn(), $this->getOrderDirection()); @@ -92,6 +117,7 @@ class Draft extends AbstractCases $query = Delegation::query()->select(); // Add the initial scope for draft cases $query->draft($this->getUserId()); + $this->filters($query); return $query->count(); } diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Inbox.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Inbox.php index dd37e11e0..e0d605ddc 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Inbox.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Inbox.php @@ -21,7 +21,8 @@ class Inbox extends AbstractCases 'APP_DELEGATION.DEL_DELEGATE_DATE', // Delegate Date 'APP_DELEGATION.DEL_PRIORITY', // Priority // Additional column for other functionalities - 'APP_DELEGATION.APP_UID', // Case Uid for PMFCaseLink + 'APP_DELEGATION.APP_UID', // Case Uid for Open case + 'APP_DELEGATION.DEL_INDEX', // Del Index for Open case ]; /** @@ -33,6 +34,39 @@ class Inbox extends AbstractCases return $this->columnsView; } + /** + * Scope filters + * + * @param \Illuminate\Database\Eloquent\Builder $query + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function filters($query) + { + // Specific case + if ($this->getCaseNumber()) { + $query->case($this->getCaseNumber()); + } + // Specific case title + if (!empty($this->getCaseTitle())) { + // @todo: Filter by case title, pending from other PRD + } + // Specific process + if ($this->getProcessId()) { + $query->processId($this->getProcessId()); + } + // Specific task + if ($this->getTaskId()) { + $query->task($this->getTaskId()); + } + // Specific case uid PMFCaseLink + if (!empty($this->getCaseUid())) { + $query->appUid($this->getCaseUid()); + } + + return $query; + } + /** * Get the data corresponding to List Inbox * @@ -48,30 +82,16 @@ class Inbox extends AbstractCases $query->joinUser(); // Join with application for add the initial scope for TO_DO cases $query->inbox($this->getUserId()); - // Define a specific risk - switch ($this->getRiskStatus()) { - case 'ON_TIME': - // Scope that search for the ON_TIME cases - $query->onTime(); - break; - case 'AT_RISK': - // Scope that search for the AT_RISK cases - $query->atRisk(); - break; - case 'OVERDUE': - // Scope that search for the OVERDUE cases - $query->overdue(); - break; + /** Apply filters */ + $this->filters($query); + /** Apply order and pagination */ + // Add any sort if needed + if ($this->getOrderByColumn()) { + $query->orderBy($this->getOrderByColumn(), $this->getOrderDirection()); } - // Scope to search for an specific process - if (!empty($this->getProcessId())) { - $query->processId($this->getProcessId()); - } - // The order by clause - $query->orderBy($this->getOrderByColumn(), $this->getOrderDirection()); // The limit by clause $query->offset($this->getOffset())->limit($this->getLimit()); - //Execute the query + // Execute the query $results = $query->get(); // Prepare the result $results->transform(function ($item, $key) { diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/MyCases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/MyCases.php deleted file mode 100644 index 63abc5922..000000000 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/MyCases.php +++ /dev/null @@ -1,62 +0,0 @@ -getParticipatedStatus(); - $result = []; - if (!empty($filter)) { - switch ($filter) { - case 'STARTED': - case 'IN_PROGRESS': - case 'COMPLETED': - $list = new Participated(); - $result = $list->getData(); - break; - case 'SUPERVISING': - // Scope that search for the SUPERVISING cases by specific user - $list = new Supervising(); - $result = $list->getData(); - break; - } - } - - return $result; - } - - /** - * Gets the total of My Cases - * - * @return int - */ - public function getCounter() - { - $filter = $this->getParticipatedStatus(); - $count = 0; - if (!empty($filter)) { - switch ($filter) { - case 'STARTED': - case 'IN_PROGRESS': - case 'COMPLETED': - $list = new Participated(); - $count = $list->getCounter(); - break; - case 'SUPERVISING': - // Scope that search for the SUPERVISING cases by specific user - $list = new Supervising(); - $count = $list->getCounter(); - break; - } - } - - return $count; - } -} diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Participated.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Participated.php index 45fc0324b..75f24e65e 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Participated.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Participated.php @@ -2,8 +2,8 @@ namespace ProcessMaker\BusinessModel\Cases; -use ProcessMaker\Model\Application; use ProcessMaker\Model\Delegation; +use ProcessMaker\Model\Task; class Participated extends AbstractCases { @@ -15,11 +15,13 @@ class Participated extends AbstractCases 'PROCESS.PRO_TITLE', // Process Name 'TASK.TAS_TITLE', // Pending Task 'APPLICATION.APP_STATUS', // Status - 'APP_DELEGATION.DEL_TASK_DUE_DATE', // Due Date - 'APP_DELEGATION.DEL_DELEGATE_DATE', // Start Date - 'APP_DELEGATION.DEL_FINISH_DATE', // Finish Date + 'APPLICATION.APP_CREATE_DATE', // Start Date + 'APPLICATION.APP_FINISH_DATE', // Finish Date + 'USERS.USR_ID', // Current UserId + 'APP_DELEGATION.DEL_TASK_DUE_DATE', // Due Date related to the colors // Additional column for other functionalities - 'APP_DELEGATION.APP_UID', // Case Uid for PMFCaseLink + 'APP_DELEGATION.APP_UID', // Case Uid for Open case + 'APP_DELEGATION.DEL_INDEX', // Del Index for Open case ]; /** @@ -31,6 +33,59 @@ class Participated extends AbstractCases return $this->columnsView; } + /** + * Scope filters + * + * @param \Illuminate\Database\Eloquent\Builder $query + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function filters($query) + { + // Specific case + if ($this->getCaseNumber()) { + $query->case($this->getCaseNumber()); + } + // Specific case title + if (!empty($this->getCaseTitle())) { + // @todo: Filter by case title, pending from other PRD + } + // Scope to search for an specific process + if ($this->getProcessId()) { + $query->processId($this->getProcessId()); + } + // Specific task + if ($this->getTaskId()) { + $query->task($this->getTaskId()); + } + // Specific status + if ($this->getCaseStatus()) { + $query->status($this->getCaseStatus()); + } + // Specific start case date from + if (!empty($this->getStartCaseFrom())) { + $query->startDateFrom($this->getStartCaseFrom()); + } + // Specific by start case date to + if (!empty($this->getStartCaseTo())) { + $query->startDateTo($this->getStartCaseTo()); + } + // Specific finish case date from + if (!empty($this->getFinishCaseFrom())) { + $query->finishCaseFrom($this->getFinishCaseFrom()); + } + // Filter by finish case date to + if (!empty($this->getFinishCaseTo())) { + $query->finishCaseTo($this->getFinishCaseTo()); + } + // Specific case uid PMFCaseLink + if (!empty($this->getCaseUid())) { + $query->appUid($this->getCaseUid()); + } + + return $query; + } + /** * Get the data corresponding to Participated * @@ -39,13 +94,15 @@ class Participated extends AbstractCases public function getData() { // Start the query for get the cases related to the user - $query = Delegation::query()->select(); + $query = Delegation::query()->select($this->getColumnsView()); // Join with process $query->joinProcess(); // Join with task $query->joinTask(); // Join with users $query->joinUser(); + // Join with application + $query->joinApplication(); // Scope to Participated $query->participated($this->getUserId()); // Add filter @@ -53,29 +110,42 @@ class Participated extends AbstractCases if (!empty($filter)) { switch ($filter) { case 'STARTED': - // Scope that search for the STARTED + // Scope that search for the STARTED by user $query->caseStarted(); break; - case 'IN-PROGRESS': + case 'IN_PROGRESS': // Scope that search for the TO_DO + $query->selectRaw( + 'CONCAT( + \'[\', + GROUP_CONCAT( + CONCAT( + \'{"tas_id":\', + APP_DELEGATION.TAS_ID, + \', "user_id":\', + APP_DELEGATION.USR_ID, + \', "due_date":"\', + APP_DELEGATION.DEL_TASK_DUE_DATE, + \'"}\' + ) + ), + \']\' + ) AS PENDING' + ); $query->caseInProgress(); + $query->groupBy('APP_NUMBER'); break; case 'COMPLETED': // Scope that search for the COMPLETED $query->caseCompleted(); + // Scope to set the last thread + $query->lastThread(); break; } } - // Scope to search for an specific process - if (!empty($this->getProcessId())) { - $query->processId($this->getProcessId()); - } - // Scope the specific case status - $status = $this->getCaseStatus(); - if (array_key_exists($status, Application::$app_status_values)) { - $statusId = Application::$app_status_values[$status]; - $query->appStatusId($statusId); - } + /** Apply filters */ + $this->filters($query); + /** Apply order and pagination */ // The order by clause $query->orderBy($this->getOrderByColumn(), $this->getOrderDirection()); // The limit by clause @@ -83,17 +153,57 @@ class Participated extends AbstractCases //Execute the query $results = $query->get(); // Prepare the result - $results->transform(function ($item, $key) { - // Get task color label - $item['TAS_COLOR'] = $this->getTaskColor($item['DEL_TASK_DUE_DATE']); - $item['TAS_COLOR_LABEL'] = self::TASK_COLORS[$item['TAS_COLOR']]; + $results->transform(function ($item, $key) use ($filter) { // Apply the date format defined in environment - $item['DEL_DELEGATE_DATE_LABEL'] = applyMaskDateEnvironment($item['DEL_DELEGATE_DATE']); - $item['DEL_FINISH_DATE_LABEL'] = !empty($item['DEL_FINISH_DATE']) ? applyMaskDateEnvironment($item['DEL_FINISH_DATE']): null; + $item['APP_CREATE_DATE_LABEL'] = !empty($item['APP_CREATE_DATE']) ? applyMaskDateEnvironment($item['APP_CREATE_DATE']): null; + $item['APP_FINISH_DATE_LABEL'] = !empty($item['APP_FINISH_DATE']) ? applyMaskDateEnvironment($item['APP_FINISH_DATE']): null; // Calculate duration - $startDate = $item['DEL_DELEGATE_DATE']; - $endDate = !empty($item['DEL_FINISH_DATE']) ? $item['DEL_FINISH_DATE'] : date("Y-m-d H:i:s"); + $startDate = (string)$item['APP_CREATE_DATE']; + $endDate = !empty($item['APP_FINISH_DATE']) ? $item['APP_FINISH_DATE'] : date("Y-m-d H:i:s"); $item['DURATION'] = getDiffBetweenDates($startDate, $endDate); + // Get the detail related to the open thread + if (!empty($item['PENDING'])) { + $item['PENDING'] = $this->prepareTaskPending($item['PENDING']); + } + switch ($filter) { + case 'STARTED': + $result = []; + $i = 0; + if ($item['APP_STATUS'] === 'TO_DO') { + $taskPending = Delegation::getPendingThreads($item['APP_NUMBER']); + foreach ($taskPending as $thread) { + // todo this need to review + $result[$i]['tas_title'] = $thread['TAS_TITLE']; + $result[$i]['user_id'] = $thread['USR_ID']; + $result[$i]['due_date'] = $thread['DEL_TASK_DUE_DATE']; + $result[$i]['tas_color'] = (!empty($row)) ? $this->getTaskColor($thread['DEL_TASK_DUE_DATE']) : ''; + $result[$i]['tas_color_label'] = (!empty($row)) ? self::TASK_COLORS[$result[$i]['tas_color']] : ''; + $i++; + } + $item['PENDING'] = $result; + } else { + $result[$i]['tas_title'] = $item['TAS_TITLE']; + $result[$i]['user_id'] = $item['USR_ID']; + $result[$i]['due_date'] = $item['DEL_TASK_DUE_DATE']; + $result[$i]['tas_color'] = (!empty($row)) ? $this->getTaskColor($item['DEL_TASK_DUE_DATE']) : ''; + $result[$i]['tas_color_label'] = (!empty($row)) ? self::TASK_COLORS[$result[$i]['tas_color']] : ''; + $item['PENDING'] = $result; + } + break; + case 'IN_PROGRESS': + $item['PENDING'] = $this->prepareTaskPending($item['PENDING']); + break; + case 'COMPLETED': + $result = []; + $i = 0; + $result[$i]['tas_title'] = $item['TAS_TITLE']; + $result[$i]['user_id'] = $item['USR_ID']; + $result[$i]['due_date'] = $item['DEL_TASK_DUE_DATE']; + $result[$i]['tas_color'] = (!empty($row)) ? $this->getTaskColor($item['DEL_TASK_DUE_DATE']) : ''; + $result[$i]['tas_color_label'] = (!empty($row)) ? self::TASK_COLORS[$result[$i]['tas_color']] : ''; + $item['PENDING'] = $result; + break; + } return $item; }); diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Paused.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Paused.php index d0e915901..77bc781fb 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Paused.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Paused.php @@ -21,7 +21,8 @@ class Paused extends AbstractCases 'APP_DELEGATION.DEL_DELEGATE_DATE', // Delegate Date 'APP_DELEGATION.DEL_PRIORITY', // Priority // Additional column for other functionalities - 'APP_DELEGATION.APP_UID', // Case Uid for PMFCaseLink + 'APP_DELEGATION.APP_UID', // Case Uid for Open case + 'APP_DELEGATION.DEL_INDEX', // Del Index for Open case ]; /** @@ -33,6 +34,39 @@ class Paused extends AbstractCases return $this->columnsView; } + /** + * Scope filters + * + * @param \Illuminate\Database\Eloquent\Builder $query + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function filters($query) + { + // Specific case + if ($this->getCaseNumber()) { + $query->case($this->getCaseNumber()); + } + // Specific case title + if (!empty($this->getCaseTitle())) { + // @todo: Filter by case title, pending from other PRD + } + // Specific process + if ($this->getProcessId()) { + $query->processId($this->getProcessId()); + } + // Specific task + if ($this->getTaskId()) { + $query->task($this->getTaskId()); + } + // Specific case uid PMFCaseLink + if (!empty($this->getCaseUid())) { + $query->appUid($this->getCaseUid()); + } + + return $query; + } + /** * Gets the data for the paused cases list * @@ -44,11 +78,10 @@ class Paused extends AbstractCases // Join with process $query->joinProcess(); // Scope that set the paused cases - $query->paused($this->getUserId(), $this->getTaskId(), $this->getCaseNumber()); - // Join with delegation for get the previous index - $query->joinPreviousIndex(); - // Join with delegation for get the previous user - $query->joinPreviousUser(); + $query->paused($this->getUserId(), $this->getTaskId()); + /** Apply filters */ + $this->filters($query); + /** Apply order and pagination */ // Add any sort if needed $query->orderBy($this->getOrderByColumn(), $this->getOrderDirection()); // Add pagination to the query diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Search.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Search.php index 8f6dac9b5..a70d2ea8b 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Search.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Search.php @@ -3,6 +3,7 @@ namespace ProcessMaker\BusinessModel\Cases; use G; +use ProcessMaker\Model\Application; use ProcessMaker\Model\Delegation; class Search extends AbstractCases @@ -14,6 +15,7 @@ class Search extends AbstractCases 'APP_DELEGATION.APP_NUMBER AS APP_TITLE', // Case Title @todo: Filter by case title, pending from other PRD 'PROCESS.PRO_TITLE', // Process 'TASK.TAS_TITLE', // Task + 'APPLICATION.APP_STATUS', // Status 'USERS.USR_USERNAME', // Current UserName 'USERS.USR_FIRSTNAME', // Current User FirstName 'USERS.USR_LASTNAME', // Current User LastName @@ -21,7 +23,8 @@ class Search extends AbstractCases 'APP_DELEGATION.DEL_DELEGATE_DATE', // Delegate Date 'APP_DELEGATION.DEL_PRIORITY', // Priority // Additional column for other functionalities - 'APP_DELEGATION.APP_UID', // Case Uid for PMFCaseLink + 'APP_DELEGATION.APP_UID', // Case Uid for Open case + 'APP_DELEGATION.DEL_INDEX', // Del Index for Open case ]; /** @@ -33,6 +36,101 @@ class Search extends AbstractCases return $this->columnsView; } + /** + * Scope filters + * + * @param \Illuminate\Database\Eloquent\Builder $query + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function filters($query) + { + // Filter case by case number + if ($this->getCaseNumber()) { + $query->case($this->getCaseNumber()); + } + // Filter cases by specific cases like [1,3,5] + if (!empty($this->getCasesNumbers())) { + $query->specificCases($this->getCasesNumbers()); + } + // Filter cases by range of cases like ['1-5', '10-15'] + if (!empty($this->getRangeCasesFromTo())) { + $query->rangeOfCases($this->getRangeCasesFromTo()); + } + // Specific case title + if (!empty($this->getCaseTitle())) { + // @todo: Filter by case title, pending from other PRD + } + // Filter by process + if ($this->getProcessId()) { + $query->processId($this->getProcessId()); + } + // Filter by user + if ($this->getUserId()) { + $query->userId($this->getUserId()); + } + // Filter by task + if ($this->getTaskId()) { + $query->task($this->getTaskId()); + } + // Filter one or more priorities like ['VL', 'L', 'N'] + if (!empty($this->getPriorities())) { + $query->priorities($this->getPriorities()); + } + // Filter by delegate from + if (!empty($this->getDelegateFrom())) { + $query->delegateDateFrom($this->getDelegateFrom()); + } + // Filter by delegate to + if (!empty($this->getDelegateTo())) { + $query->delegateDateTo($this->getDelegateTo()); + } + // Filter by due from + if (!empty($this->getDueFrom())) { + $query->dueFrom($this->getDueFrom()); + } + // Filter by due to + if (!empty($this->getDueTo())) { + $query->dueTo($this->getDueTo()); + } + /** This filter define the UNION */ + + // Filter related to the case status like ['DRAFT', 'TO_DO'] + if (!empty($this->getCaseStatuses())) { + $statuses = $this->getCaseStatuses(); + $casesOpen = []; + $casesClosed = []; + foreach ($statuses as $row) { + if ($row === Application::STATUS_DRAFT or $row === Application::STATUS_TODO) { + $casesOpen[] = $row; + } else { + $casesClosed[] = $row; + } + } + if (!empty($casesOpen) && !empty($casesClosed)) { + // Only in this case need to clone the same query for the union + $cloneQuery = clone $query; + // Get the open threads + $query->casesInProgress($casesOpen); + // Get the last thread + $cloneQuery->casesDone($casesClosed); + // Union + $query->union($cloneQuery); + } else { + if (!empty($casesOpen)) { + // Get the open thread + $query->casesInProgress($casesOpen); + } + if (!empty($casesClosed)) { + // Get the last thread + $query->casesDone($casesClosed); + } + } + } + + return $query; + } + /** * Get the data corresponding to advanced search * @@ -47,33 +145,11 @@ class Search extends AbstractCases $query->joinTask(); // Join with users $query->joinUser(); - // Filter by case number - if ($this->getCaseNumber() > 0) { - $query->case($this->getCaseNumber()); - } - // Filter by case number: from and to - if ($this->getFromCaseNumber() > 0 && $this->getToCaseNumber() > 0) { - $query->rangeOfCases($this->getFromCaseNumber(), $this->getToCaseNumber()); - } - - // @todo: Filter by case title, pending from other PRD - - // Filter by priority - if ($this->getPriority() > 0) { - $query->priority($this->getPriority()); - } - // Filter by process - if (!empty($this->getProcessId())) { - $query->processId($this->getProcessId()); - } - // Filter by user - if (!empty($this->getUserId())) { - $query->userId($this->getUserId()); - } - // Filter by task - if (!empty($this->getTaskId())) { - $query->task($this->getTaskId()); - } + // Join with application + $query->joinApplication(); + /** Apply filters */ + $this->filters($query); + /** Apply order and pagination */ // The order by clause $query->orderBy($this->getOrderByColumn(), $this->getOrderDirection()); // The limit by clause diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Supervising.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Supervising.php index 666dfdf31..53b97db2e 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Supervising.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Supervising.php @@ -15,11 +15,12 @@ class Supervising extends AbstractCases 'PROCESS.PRO_TITLE', // Process Name 'TASK.TAS_TITLE', // Pending Task 'APPLICATION.APP_STATUS', // Status - 'APP_DELEGATION.DEL_TASK_DUE_DATE', // Due Date - 'APP_DELEGATION.DEL_DELEGATE_DATE', // Start Date - 'APP_DELEGATION.DEL_FINISH_DATE', // Finish Date + 'APPLICATION.APP_CREATE_DATE', // Start Date + 'APPLICATION.APP_FINISH_DATE', // Finish Date + 'APP_DELEGATION.DEL_TASK_DUE_DATE', // Due Date related to the colors // Additional column for other functionalities - 'APP_DELEGATION.APP_UID', // Case Uid for PMFCaseLink + 'APP_DELEGATION.APP_UID', // Case Uid for Open case + 'APP_DELEGATION.DEL_INDEX', // Del Index for Open case ]; /** @@ -31,6 +32,59 @@ class Supervising extends AbstractCases return $this->columnsView; } + /** + * Scope filters + * + * @param \Illuminate\Database\Eloquent\Builder $query + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function filters($query) + { + // Specific case + if ($this->getCaseNumber()) { + $query->case($this->getCaseNumber()); + } + // Specific case title + if (!empty($this->getCaseTitle())) { + // @todo: Filter by case title, pending from other PRD + } + // Scope to search for an specific process + if ($this->getProcessId()) { + $query->processId($this->getProcessId()); + } + // Specific task + if ($this->getTaskId()) { + $query->task($this->getTaskId()); + } + // Specific status + if ($this->getCaseStatus()) { + $query->status($this->getCaseStatus()); + } + // Specific start case date from + if (!empty($this->getStartCaseFrom())) { + $query->startDateFrom($this->getStartCaseFrom()); + } + // Specific by start case date to + if (!empty($this->getStartCaseTo())) { + $query->startDateTo($this->getStartCaseTo()); + } + // Specific finish case date from + if (!empty($this->getFinishCaseFrom())) { + $query->finishCaseFrom($this->getFinishCaseFrom()); + } + // Filter by finish case date to + if (!empty($this->getFinishCaseTo())) { + $query->finishCaseTo($this->getFinishCaseTo()); + } + // Specific case uid PMFCaseLink + if (!empty($this->getCaseUid())) { + $query->appUid($this->getCaseUid()); + } + + return $query; + } + /** * Gets the data for the Cases list Review * @@ -40,51 +94,53 @@ class Supervising extends AbstractCases { // Get the list of processes of the supervisor $processes = ProcessUser::getProcessesOfSupervisor($this->getUserUid()); - // Start the query for get the cases related to the user - $query = Delegation::query()->select($this->getColumnsView()); - // Join with process - $query->joinProcess(); - // Join with users - $query->joinUser(); - // Join with task and scope that sets the queries for List Inbox - $query->inbox($this->getUserId()); - // Scope the specific array of processes supervising - $query->processInList($processes); - // Join with delegation for get the previous index - $query->joinPreviousIndex(); - // Join with delegation for get the previous user - $query->joinPreviousUser(); - // Scope to search for an specific case - if (!empty($this->getCaseNumber())) { - $query->case($this->getCaseNumber()); - } - // Scope to search for an specific process - if (!empty($this->getProcessId())) { - $query->processId($this->getProcessId()); - } - //The order by clause - $query->orderBy($this->getOrderByColumn(), $this->getOrderDirection()); - //The limit clause - $query->offset($this->getOffset())->limit($this->getLimit()); - //Execute the query - $results = $query->get(); - // Prepare the result - $results->transform(function ($item, $key) { - // Get task color label - $item['TAS_COLOR'] = $this->getTaskColor($item['DEL_TASK_DUE_DATE']); - $item['TAS_COLOR_LABEL'] = self::TASK_COLORS[$item['TAS_COLOR']]; - // Apply the date format defined in environment - $item['DEL_DELEGATE_DATE_LABEL'] = applyMaskDateEnvironment($item['DEL_DELEGATE_DATE']); - $item['DEL_FINISH_DATE_LABEL'] = !empty($item['DEL_FINISH_DATE']) ? applyMaskDateEnvironment($item['DEL_FINISH_DATE']): null; - // Calculate duration - $startDate = $item['DEL_DELEGATE_DATE']; - $endDate = !empty($item['DEL_FINISH_DATE']) ? $item['DEL_FINISH_DATE'] : date("Y-m-d H:i:s"); - $item['DURATION'] = getDiffBetweenDates($startDate, $endDate); + // We will prepare the queries if the user is supervisor + if (!empty($processes)) { + // Start the query for get the cases related to the user + $query = Delegation::query()->select($this->getColumnsView()); + // Join with process + $query->joinProcess(); + // Join with task + $query->joinTask(); + // Join with users + $query->joinUser(); + // Join with application + $query->joinApplication(); + // Only cases in progress + $query->caseInProgress(); + // Scope that return the results for an specific user + $query->userId($this->getUserId()); + // Scope the specific array of processes supervising + $query->processInList($processes); + /** Apply filters */ + $this->filters($query); + /** Apply order and pagination */ + //The order by clause + $query->orderBy($this->getOrderByColumn(), $this->getOrderDirection()); + //The limit clause + $query->offset($this->getOffset())->limit($this->getLimit()); + //Execute the query + $results = $query->get(); + // Prepare the result + $results->transform(function ($item, $key) { + // Get task color label + $item['TAS_COLOR'] = $this->getTaskColor($item['DEL_TASK_DUE_DATE']); + $item['TAS_COLOR_LABEL'] = self::TASK_COLORS[$item['TAS_COLOR']]; + // Apply the date format defined in environment + $item['APP_CREATE_DATE_LABEL'] = !empty($item['APP_CREATE_DATE']) ? applyMaskDateEnvironment($item['APP_CREATE_DATE']): null; + $item['APP_FINISH_DATE_LABEL'] = !empty($item['APP_FINISH_DATE']) ? applyMaskDateEnvironment($item['APP_FINISH_DATE']): null; + // Calculate duration + $startDate = (string)$item['APP_CREATE_DATE']; + $endDate = !empty($item['APP_FINISH_DATE']) ? $item['APP_FINISH_DATE'] : date("Y-m-d H:i:s"); + $item['DURATION'] = getDiffBetweenDates($startDate, $endDate); - return $item; - }); + return $item; + }); - return $results->values()->toArray(); + return $results->values()->toArray(); + } else { + return []; + } } /** diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Unassigned.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Unassigned.php index 26858f63c..64e6a5a2b 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Unassigned.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Unassigned.php @@ -22,7 +22,8 @@ class Unassigned extends AbstractCases 'APP_DELEGATION.DEL_DELEGATE_DATE', // Delegate Date 'APP_DELEGATION.DEL_PRIORITY', // Priority // Additional column for other functionalities - 'APP_DELEGATION.APP_UID', // Case Uid for PMFCaseLink + 'APP_DELEGATION.APP_UID', // Case Uid for Open case + 'APP_DELEGATION.DEL_INDEX', // Del Index for Open case ]; /** @@ -34,6 +35,39 @@ class Unassigned extends AbstractCases return $this->columnsView; } + /** + * Scope filters + * + * @param \Illuminate\Database\Eloquent\Builder $query + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function filters($query) + { + // Specific case + if ($this->getCaseNumber()) { + $query->case($this->getCaseNumber()); + } + // Specific case title + if ($this->getCaseTitle()) { + // @todo: Filter by case title, pending from other PRD + } + // Specific process + if ($this->getProcessId()) { + $query->processId($this->getProcessId()); + } + // Specific task + if ($this->getTaskId()) { + $query->task($this->getTaskId()); + } + // Specific case uid PMFCaseLink + if (!empty($this->getCaseUid())) { + $query->appUid($this->getCaseUid()); + } + + return $query; + } + /** * Get data self-services cases by user * @@ -47,28 +81,15 @@ class Unassigned extends AbstractCases // Join with users $query->joinUser(); // Join with application for add the initial scope for unassigned cases - $query->selfService($this->getUserUid()); + if (!empty($this->getUserUid())) { + $query->selfService($this->getUserUid()); + } // Add join for application, for get the case title when the case status is TO_DO - $query->appStatusId(Application::STATUS_TODO); - // Specific process - if ($this->getProcessId()) { - $query->processId($this->getProcessId()); - } - // Date range filter, this is used from mobile GET /light/unassigned - if ($this->getNewestThan()) { - $query->delegateDateFrom($this->getNewestThan()); - } - if ($this->getOldestThan()) { - $query->delegateDateTo($this->getOldestThan()); - } - // Specific case uid - if (!empty($this->getCaseUid())) { - $query->appUid($this->getCaseUid()); - } - // Specific cases - if (!empty($this->getCasesUids())) { - $query->specificCasesByUid($this->getCasesUids()); - } + $query->joinApplication(); + $query->status(Application::STATUS_TODO); + /** Apply filters */ + $this->filters($query); + /** Apply order and pagination */ // Add any sort if needed if ($this->getOrderByColumn()) { $query->orderBy($this->getOrderByColumn(), $this->getOrderDirection()); diff --git a/workflow/engine/src/ProcessMaker/Model/Delegation.php b/workflow/engine/src/ProcessMaker/Model/Delegation.php index 1423f2335..ddbcfcc8f 100644 --- a/workflow/engine/src/ProcessMaker/Model/Delegation.php +++ b/workflow/engine/src/ProcessMaker/Model/Delegation.php @@ -66,6 +66,18 @@ class Delegation extends Model return $query->where('DEL_PRIORITY', $priority); } + /** + * Scope a query to only include specific priorities + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param array $priorities + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopePriorities($query, array $priorities) + { + return $query->whereIn('DEL_PRIORITY', $priorities); + } + /** * Scope a query to only include open threads * @@ -77,6 +89,34 @@ class Delegation extends Model return $query->where('APP_DELEGATION.DEL_THREAD_STATUS', '=', 'OPEN'); } + /** + * Scope to use when the case is IN_PROGRESS like DRAFT or TO_DO + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param array $ids + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeCasesInProgress($query, array $ids) + { + $query->isThreadOpen()->statusIds($ids); + + return $query; + } + + /** + * Scope to use when the case is DONE like COMPLETED or CANCELED + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param array $ids + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeCasesDone($query, array $ids) + { + $query->lastThread()->statusIds($ids); + + return $query; + } + /** * Scope a query to only include a specific index * @@ -111,7 +151,7 @@ class Delegation extends Model */ public function scopeCaseInProgress($query) { - return $query->appStatusId(2); + return $query->where('APPLICATION.APP_STATUS_ID', 2); } /** @@ -123,7 +163,85 @@ class Delegation extends Model */ public function scopeCaseCompleted($query) { - return $query->appStatusId(3); + return $query->where('APPLICATION.APP_STATUS_ID', 3); + } + + /** + * Scope a query to get specific status + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param int $statusId + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeStatus($query, int $statusId) + { + return $query->where('APPLICATION.APP_STATUS_ID', $statusId); + } + + /** + * Scope a more status + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param array $statuses + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeStatusIds($query, array $statuses) + { + return $query->whereIn('APPLICATION.APP_STATUS_ID', $statuses); + } + + /** + * Scope a query to only include a specific start date + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param string $from + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeStartDateFrom($query, string $from) + { + return $query->where('APPLICATION.APP_CREATE_DATE', '>=', $from); + } + + /** + * Scope a query to only include a specific start date + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param string $to + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeStartDateTo($query, string $to) + { + return $query->where('APPLICATION.APP_CREATE_DATE', '<=', $to); + } + + /** + * Scope a query to only include a specific finish date + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param string $from + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeFinishCaseFrom($query, string $from) + { + return $query->where('APPLICATION.APP_FINISH_DATE', '>=', $from); + } + + /** + * Scope a query to only include a specific finish date + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param string $to + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeFinishCaseTo($query, string $to) + { + return $query->where('APPLICATION.APP_FINISH_DATE', '<=', $to); } /** @@ -134,7 +252,7 @@ class Delegation extends Model * * @return \Illuminate\Database\Eloquent\Builder */ - public function scopeDelegateDateFrom($query, $from) + public function scopeDelegateDateFrom($query, string $from) { return $query->where('DEL_DELEGATE_DATE', '>=', $from); } @@ -147,11 +265,63 @@ class Delegation extends Model * * @return \Illuminate\Database\Eloquent\Builder */ - public function scopeDelegateDateTo($query, $to) + public function scopeDelegateDateTo($query, string $to) { return $query->where('DEL_DELEGATE_DATE', '<=', $to); } + /** + * Scope a query to only include a specific finish date + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param string $from + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeFinishDateFrom($query, $from) + { + return $query->where('DEL_FINISH_DATE', '>=', $from); + } + + /** + * Scope a query to only include a specific finish date + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param string $to + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeFinishDateTo($query, $to) + { + return $query->where('DEL_FINISH_DATE', '<=', $to); + } + + /** + * Scope a query to only include a specific due date + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param string $from + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeDueFrom($query, $from) + { + return $query->where('DEL_TASK_DUE_DATE', '>=', $from); + } + + /** + * Scope a query to only include a specific due date + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param string $to + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeDueTo($query, $to) + { + return $query->where('DEL_TASK_DUE_DATE', '<=', $to); + } + /** * Scope a query to get only the date on time * @@ -201,21 +371,6 @@ class Delegation extends Model return $query->where('APP_DELEGATION.APP_NUMBER', '=', $appNumber); } - /** - * Scope a query to only include cases from a range - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param int $from - * @param int $to - * - * @return \Illuminate\Database\Eloquent\Builder - */ - public function scopeRangeOfCases($query, int $from, int $to) - { - return $query->where('APP_DELEGATION.APP_NUMBER', '>=', $from) - ->where('APP_DELEGATION.APP_NUMBER', '<=', $to); - } - /** * Scope a query to only include specific cases * @@ -229,6 +384,57 @@ class Delegation extends Model return $query->whereIn('APP_DELEGATION.APP_NUMBER', $cases); } + /** + * Scope a query to only include cases from a range + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param int $from + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeCasesFrom($query, int $from) + { + return $query->where('APP_DELEGATION.APP_NUMBER', '>=', $from); + } + + /** + * Scope a query to only include cases from a range + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param int $to + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeCasesTo($query, int $to) + { + return $query->where('APP_DELEGATION.APP_NUMBER', '<=', $to); + + } + + /** + * Scope more than one range of cases + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param array $rangeCases + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeRangeOfCases($query, array $rangeCases) + { + foreach ($rangeCases as $fromTo) { + $fromTo = explode("-", $fromTo); + if (count($fromTo) === 2) { + $from = $fromTo[0]; + $to = $fromTo[1]; + if ($to > $from) { + $query->orWhere(function ($query) use ($from, $to) { + $query->casesFrom($from)->casesTo($to); + }); + } + } + } + } + /** * Scope a query to get the delegations from a case by APP_UID * @@ -469,7 +675,8 @@ class Delegation extends Model public function scopeInbox($query, $userId) { // This scope is for the join with the APP_DELEGATION table - $query->appStatusId(2); + $query->joinApplication(); + $query->status(Application::STATUS_TODO); // Scope for the restriction of the task that must not be searched for $query->excludeTaskTypes(Task::DUMMY_TASKS); @@ -493,7 +700,8 @@ class Delegation extends Model public function scopeInboxWithoutUser($query) { // This scope is for the join with the APP_DELEGATION table - $query->appStatusId(2); + $query->joinApplication(); + $query->status(Application::STATUS_TODO); // Scope for the restriction of the task that must not be searched for $query->excludeTaskTypes(Task::DUMMY_TASKS); @@ -535,7 +743,8 @@ class Delegation extends Model public function scopeDraft($query, $user) { // Add join for application, for get the case title when the case status is DRAFT - $query->appStatusId(Application::STATUS_DRAFT); + $query->joinApplication(); + $query->status(Application::STATUS_TODO); // Case assigned to the user $query->userId($user); @@ -554,8 +763,6 @@ class Delegation extends Model { // Scope to set the user $query->userId($user); - // Scope to set the last thread - $query->lastThread(); return $query; } @@ -720,15 +927,12 @@ class Delegation extends Model * * @return \Illuminate\Database\Eloquent\Builder */ - public function scopePaused($query, int $userId, int $taskId, int $caseNumber) + public function scopePaused($query, int $userId, int $taskId) { $query->joinAppDelay('PAUSE'); $query->joinAppDelayUsers($userId); $query->joinApplication(); - // Specific case number - if (!empty($caseNumber)) { - $query->case($caseNumber); - } + // Exclude some specific task $query->excludeTaskTypes(Task::DUMMY_TASKS); // Specific task if (!empty($taskId)) { @@ -1401,13 +1605,13 @@ class Delegation extends Model /** * This function get the current user related to the specific case and index * - * @param integer $appNumber, Case number - * @param integer $index, Index to review + * @param int $appNumber, Case number + * @param int $index, Index to review * @param string $status, The status of the thread * * @return string */ - public static function getCurrentUser($appNumber, $index, $status = 'OPEN') + public static function getCurrentUser(int $appNumber, int $index, $status = 'OPEN') { $query = Delegation::query()->select('USR_UID'); $query->where('APP_NUMBER', $appNumber); @@ -1427,12 +1631,12 @@ class Delegation extends Model /** * Return the open thread related to the task * - * @param integer $appNumber, Case number + * @param int $appNumber, Case number * @param string $tasUid, The task uid * * @return array */ - public static function getOpenThreads($appNumber, $tasUid) + public static function getOpenThreads(int $appNumber, string $tasUid) { $query = Delegation::query()->select(); $query->where('DEL_THREAD_STATUS', 'OPEN'); @@ -1457,7 +1661,7 @@ class Delegation extends Model * * @return boolean */ - public static function participation($appUid, $userUid) + public static function participation(string $appUid, string $userUid) { $query = Delegation::query()->select(); $query->where('APP_UID', $appUid); @@ -1515,4 +1719,31 @@ class Delegation extends Model return $thread; } + + + /** + * Return the open thread related to the task + * + * @param int $appNumber + * + * @return array + */ + public static function getPendingThreads(int $appNumber) + { + $query = Delegation::query()->select([ + 'TASK.TAS_TITLE', + 'APP_DELEGATION.USR_ID', + 'APP_DELEGATION.DEL_TASK_DUE_DATE' + ]); + // Join with task + $query->joinTask(); + // Get the open threads + $query->threadOpen(); + // Related to the specific case number + $query->case($appNumber); + // Get the results + $results = $query->get()->values()->toArray(); + + return $results; + } } diff --git a/workflow/engine/src/ProcessMaker/Model/ProcessUser.php b/workflow/engine/src/ProcessMaker/Model/ProcessUser.php index 7f9f3b79f..5b741242b 100644 --- a/workflow/engine/src/ProcessMaker/Model/ProcessUser.php +++ b/workflow/engine/src/ProcessMaker/Model/ProcessUser.php @@ -64,41 +64,29 @@ class ProcessUser extends Model return $query; } - /** - * It returns a list of processes ids as an array - * - * @param array $processes - * @return array - */ - public static function getListOfProcessUid($processes) - { - $res = (array_map(function ($x) { - if (array_key_exists('PRO_ID', $x)) { - return $x['PRO_ID']; - } - }, $processes)); - - return array_filter($res); - } - /** * It returns a list of processes of the supervisor * * @param string $userUid * @return array */ - public static function getProcessesOfSupervisor($userUid) + public static function getProcessesOfSupervisor(string $userUid) { - $query1 = ProcessUser::query()->select(['PRO_ID']); - $query1->processSupervisor($userUid); - $processes = $query1->get()->values()->toArray(); - - $query2 = ProcessUser::query()->select(['PRO_ID']); - $query2->processGroupSupervisor($userUid); - - array_push($processes, $query2->get()->values()->toArray()); - - $processes = ProcessUser::getListOfProcessUid($processes); + // Get the list of process when the user is supervisor + $query = ProcessUser::query()->select(['PRO_ID']); + $query->processSupervisor($userUid); + $results = $query->get(); + $processes = []; + $results->each(function ($item, $key) use (&$processes) { + $processes[] = $item->PRO_ID; + }); + // Get the list of process when the group related to the user is supervisor + $query = ProcessUser::query()->select(['PRO_ID']); + $query->processGroupSupervisor($userUid); + $results = $query->get(); + $results->each(function ($item, $key) use (&$processes) { + $processes[] = $item->PRO_ID; + }); return $processes; } diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Home.php b/workflow/engine/src/ProcessMaker/Services/Api/Home.php new file mode 100644 index 000000000..c1543d20c --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Services/Api/Home.php @@ -0,0 +1,463 @@ +sSystem = 'PROCESSMAKER'; + $RBAC->initRBAC(); + $RBAC->loadUserRolePermission($RBAC->sSystem, $this->getUserId()); + } + } + + /** + * Get the draft cases + * + * @url GET /draft + * + * @param int $caseNumber + * @param int $process + * @param int $task + * @param string $caseTitle + * @param string $paged + * @param string $sort + * + * @return array + * + * @throws Exception + * + * @access protected + * @class AccessControl {@permission PM_CASES} + */ + public function doGetDraftCases( + int $caseNumber = 0, + int $process = 0, + int $task = 0, + string $caseTitle = '', + string $paged = '0,15', + string $sort ='APP_NUMBER,ASC' + ){ + try { + $list = new Draft(); + // Define the filters to apply + $properties = []; + $properties['caseNumber'] = $caseNumber; + $properties['caseTitle'] = $caseTitle; + $properties['process'] = $process; + $properties['task'] = $task; + // Get the user that access to the API + $usrUid = $this->getUserId(); + $properties['user'] = User::find($usrUid)->first()->USR_ID; + // Set the pagination parameters + $paged = explode(',', $paged); + $sort = explode(',', $sort); + $properties['start'] = $paged[0]; + $properties['limit'] = $paged[1]; + $properties['sort'] = $sort[0]; + $properties['dir'] = $sort[1]; + $list->setProperties($properties); + $result = []; + $result['data'] = $list->getData(); + $result['total'] = $list->getCounter(); + return $result; + } catch (Exception $e) { + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + } + + /** + * Get the inbox cases + * + * @url GET /todo + * + * @param int $caseNumber + * @param int $process + * @param int $task + * @param string $caseTitle + * @param string $paged + * @param string $sort + * + * @return array + * + * @throws Exception + * + * @access protected + * @class AccessControl {@permission PM_CASES} + */ + public function doGetTodoCases( + int $caseNumber = 0, + int $process = 0, + int $task = 0, + string $caseTitle = '', + string $paged = '0,15', + string $sort ='APP_NUMBER,ASC' + ){ + try { + $list = new Inbox(); + // Define the filters to apply + $properties = []; + $properties['caseNumber'] = $caseNumber; + $properties['caseTitle'] = $caseTitle; + $properties['process'] = $process; + $properties['task'] = $task; + // Get the user that access to the API + $usrUid = $this->getUserId(); + $properties['user'] = User::find($usrUid)->first()->USR_ID; + // Set the pagination parameters + $paged = explode(',', $paged); + $sort = explode(',', $sort); + $properties['start'] = $paged[0]; + $properties['limit'] = $paged[1]; + $properties['sort'] = $sort[0]; + $properties['dir'] = $sort[1]; + $list->setProperties($properties); + $result = []; + $result['data'] = $list->getData(); + $result['total'] = $list->getCounter(); + return $result; + } catch (Exception $e) { + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + } + + /** + * Get the unassigned cases + * + * @url GET /unassigned + * + * @param int $caseNumber + * @param int $process + * @param int $task + * @param string $caseTitle + * @param string $paged + * @param string $sort + * + * @return array + * + * @throws Exception + * + * @access protected + * @class AccessControl {@permission PM_CASES} + */ + public function doGetUnassignedCases( + int $caseNumber = 0, + int $process = 0, + int $task = 0, + string $caseTitle = '', + string $paged = '0,15', + string $sort ='APP_NUMBER,ASC' + ){ + try { + $list = new Unassigned(); + // Define the filters to apply + $properties = []; + $properties['caseNumber'] = $caseNumber; + $properties['caseTitle'] = $caseTitle; + $properties['process'] = $process; + $properties['task'] = $task; + // Get the user that access to the API + $usrUid = $this->getUserId(); + $properties['user'] = User::find($usrUid)->first()->USR_ID; + // Set the pagination parameters + $paged = explode(',', $paged); + $sort = explode(',', $sort); + $properties['start'] = $paged[0]; + $properties['limit'] = $paged[1]; + $properties['sort'] = $sort[0]; + $properties['dir'] = $sort[1]; + // todo: some queries related to the unassigned are using the USR_UID + $list->setUserUid($usrUid); + $list->setProperties($properties); + $result = []; + $result['data'] = $list->getData(); + $result['total'] = $list->getCounter(); + return $result; + } catch (Exception $e) { + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + } + + /** + * Get the paused cases + * + * @url GET /paused + * + * @param int $caseNumber + * @param int $process + * @param int $task + * @param string $caseTitle + * @param string $paged + * @param string $sort + * + * @return array + * + * @throws Exception + * + * @access protected + * @class AccessControl {@permission PM_CASES} + */ + public function doGetPausedCases( + int $caseNumber = 0, + int $process = 0, + int $task = 0, + string $caseTitle = '', + string $paged = '0,15', + string $sort ='APP_NUMBER,ASC' + ){ + try { + $list = new Paused(); + // Define the filters to apply + $properties = []; + $properties['caseNumber'] = $caseNumber; + $properties['caseTitle'] = $caseTitle; + $properties['process'] = $process; + $properties['task'] = $task; + // Get the user that access to the API + $usrUid = $this->getUserId(); + $properties['user'] = User::find($usrUid)->first()->USR_ID; + // Set the pagination parameters + $paged = explode(',', $paged); + $sort = explode(',', $sort); + $properties['start'] = $paged[0]; + $properties['limit'] = $paged[1]; + $properties['sort'] = $sort[0]; + $properties['dir'] = $sort[1]; + $list->setProperties($properties); + $result = []; + $result['data'] = $list->getData(); + $result['total'] = $list->getCounter(); + return $result; + } catch (Exception $e) { + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + } + + /** + * Get the my cases + * + * @url GET /mycases + * + * @param int $caseNumber + * @param int $process + * @param int $task + * @param string $caseTitle + * @param string $startCaseFrom + * @param string $startCaseTo + * @param string $finishCaseFrom + * @param string $finishCaseTo + * @param string $filter + * @param string $paged + * @param string $sort + * + * @return array + * + * @throws Exception + * + * @access protected + * @class AccessControl {@permission PM_CASES} + */ + public function doGetMyCases( + int $caseNumber = 0, + int $process = 0, + int $task = 0, + string $caseTitle = '', + string $filter = 'IN_PROGRESS', + string $startCaseFrom = '', + string $startCaseTo = '', + string $finishCaseFrom = '', + string $finishCaseTo = '', + string $paged = '0,15', + string $sort ='APP_NUMBER,ASC' + ){ + // Define the filters to apply + $properties = []; + $properties['caseNumber'] = $caseNumber; + $properties['caseTitle'] = $caseTitle; + $properties['process'] = $process; + $properties['task'] = $task; + // Get the user that access to the API + $usrUid = $this->getUserId(); + $properties['user'] = User::find($usrUid)->first()->USR_ID; + $properties['filter'] = $filter; + $properties['startCaseFrom'] = $startCaseFrom; + $properties['startCaseTo'] = $startCaseTo; + $properties['finishCaseFrom'] = $finishCaseFrom; + $properties['finishCaseTo'] = $finishCaseTo; + // Set the pagination parameters + $paged = explode(',', $paged); + $sort = explode(',', $sort); + $properties['start'] = $paged[0]; + $properties['limit'] = $paged[1]; + $properties['sort'] = $sort[0]; + $properties['dir'] = $sort[1]; + $result = []; + try { + if (!empty($filter)) { + switch ($filter) { + case 'STARTED': + case 'IN_PROGRESS': + case 'COMPLETED': + $list = new Participated(); + $list->setParticipatedStatus($filter); + $list->setProperties($properties); + $result['data'] = $list->getData(); + $result['total'] = $list->getCounter(); + break; + case 'SUPERVISING': + // Scope that search for the SUPERVISING cases by specific user + $list = new Supervising(); + $list->setProperties($properties); + $result['data'] = $list->getData(); + $result['total'] = $list->getCounter(); + break; + } + } + + return $result; + } catch (Exception $e) { + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + } + + /** + * Get counters + * + * @url GET /counters + * + * @return array + * + * @throws Exception + * + * @access protected + * @class AccessControl {@permission PM_CASES} + */ + public function doGetCountMyCases() + { + try { + $filters = ['STARTED', 'IN_PROGRESS', 'COMPLETED', 'SUPERVISING']; + $result = []; + foreach ($filters as $row) { + switch ($row) { + case 'STARTED': + case 'IN_PROGRESS': + case 'COMPLETED': + $list = new Participated(); + $list->setParticipatedStatus($row); + $list->setUserId($this->getUserId()); + $result[strtolower($row)] = $list->getCounter(); + break; + case 'SUPERVISING': + // Scope that search for the SUPERVISING cases by specific user + $list = new Supervising(); + $list->setUserId($this->getUserId()); + $result[strtolower($row)] = $list->getCounter(); + break; + default: + $result[strtolower($row)] = 0; + } + } + + return $result; + } catch (Exception $e) { + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + } + + /** + * Get the search cases + * + * @url GET /search + * + * @param int $caseNumber + * @param int $process + * @param int $task + * @param int $user + * @param string $caseTitle + * @param string $priorities + * @param string $caseStatuses + * @param string $filterCases + * @param string $dueDateFrom + * @param string $dueDateTo + * @param string $delegationDateFrom + * @param string $delegationDateTo + * @param string $paged + * @param string $sort + * + * @return array + * + * @throws Exception + * + * @access protected + * @class AccessControl {@permission PM_ALLCASES} + */ + public function doGetSearchCases( + int $caseNumber = 0, + int $process = 0, + int $task = 0, + int $user = 0, + string $caseTitle = '', + string $priorities = '', + string $caseStatuses = '', + string $filterCases = '', + string $dueDateFrom = '', + string $dueDateTo = '', + string $delegationDateFrom = '', + string $delegationDateTo = '', + string $paged = '0,15', + string $sort ='APP_NUMBER,ASC' + ){ + try { + $list = new Search(); + // Define the filters to apply + $properties = []; + $properties['caseNumber'] = $caseNumber; + $properties['caseTitle'] = $caseTitle; + $properties['process'] = $process; + $properties['task'] = $task; + $properties['user'] = $user; + $properties['priorities'] = explode(',', $priorities); + $properties['caseStatuses'] = explode(',', $caseStatuses); + $properties['filterCases'] = $filterCases; + $properties['dueDateFrom'] = $dueDateFrom; + $properties['dueDateTo'] = $dueDateTo; + $properties['delegationDateFrom'] = $delegationDateFrom; + $properties['delegationDateTo'] = $delegationDateTo; + // Set the pagination parameters + $paged = explode(',', $paged); + $sort = explode(',', $sort); + $properties['start'] = $paged[0]; + $properties['limit'] = $paged[1]; + $properties['sort'] = $sort[0]; + $properties['dir'] = $sort[1]; + $list->setProperties($properties); + $result = []; + $result['data'] = $list->getData(); + $result['total'] = $list->getCounter(); + return $result; + } catch (Exception $e) { + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + } +}