diff --git a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/CasesTest.php b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/CasesTest.php index 88c9294a9..e0f9fbb1e 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/CasesTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/CasesTest.php @@ -4,13 +4,13 @@ namespace ProcessMaker\BusinessModel; use Exception; use G; -use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Support\Facades\DB; -use ProcessMaker\BusinessModel\Cases; use ProcessMaker\Model\Application; use ProcessMaker\Model\Delegation; use ProcessMaker\Model\Documents; use ProcessMaker\Model\ListUnassigned; +use ProcessMaker\Model\Process; +use ProcessMaker\Model\Step; use ProcessMaker\Model\Task; use ProcessMaker\Model\Triggers; use ProcessMaker\Model\User; @@ -18,7 +18,7 @@ use RBAC; use Tests\TestCase; /** - * Class DelegationTest + * Class CasesTest * * @coversDefaultClass \ProcessMaker\BusinessModel\Cases */ @@ -315,4 +315,66 @@ class CasesTest extends TestCase $casesExecuted = Cases::executeSelfServiceTimeout(); $this->assertTrue(is_array($casesExecuted)); } + + /** + * It test get assigned DynaForms as steps by application Uid + * + * @covers \ProcessMaker\BusinessModel\Cases::dynaFormsByApplication() + * @test + */ + public function it_should_test_get_dynaforms_by_application() + { + // Create a process + $process = factory(Process::class)->create(); + + // Create a task related to the process + $task1 = factory(Task::class)->create([ + 'PRO_UID' => $process->PRO_UID + ]); + + // Created another task related to the process + $task2 = factory(Task::class)->create([ + 'PRO_UID' => $process->PRO_UID + ]); + + // Created a step related to the first task + factory(Step::class)->create([ + 'PRO_UID' => $process->PRO_UID, + 'TAS_UID' => $task1->TAS_UID, + 'STEP_TYPE_OBJ' => 'DYNAFORM', + 'STEP_UID_OBJ' => G::generateUniqueID(), + 'STEP_POSITION' => 1 + ]); + + // Created a step related to the second task and with a specific DynaForm Uid + $dynUid = G::generateUniqueID(); + factory(Step::class)->create([ + 'PRO_UID' => $process->PRO_UID, + 'TAS_UID' => $task2->TAS_UID, + 'STEP_TYPE_OBJ' => 'DYNAFORM', + 'STEP_UID_OBJ' => $dynUid, + 'STEP_POSITION' => 1 + ]); + + // Create an application related to the process in draft status + $application = factory(Application::class)->create([ + 'PRO_UID' => $process->PRO_UID, + 'APP_STATUS' => 'DRAFT' + ]); + + // Get all DynaForms assigned as steps + self::assertCount(2, Cases::dynaFormsByApplication($application->APP_UID)); + + // Get DynaForms assigned as steps for the first task + self::assertCount(1, Cases::dynaFormsByApplication($application->APP_UID, $task1->TAS_UID)); + + // Get DynaForms assigned as steps sending a specific DynaForm Uid + self::assertCount(1, Cases::dynaFormsByApplication($application->APP_UID, '', $dynUid)); + + // Get DynaForms assigned as steps for the second task when the application status is DRAFT + self::assertCount(1, Cases::dynaFormsByApplication($application->APP_UID, $task2->TAS_UID, '', 'TO_DO')); + + // Get DynaForms assigned as steps for the second task when the application status is COMPLETED + self::assertCount(2, Cases::dynaFormsByApplication($application->APP_UID, $task2->TAS_UID, '', 'COMPLETED')); + } } diff --git a/workflow/engine/classes/Cases.php b/workflow/engine/classes/Cases.php index fbfd201f4..4795ee6bc 100644 --- a/workflow/engine/classes/Cases.php +++ b/workflow/engine/classes/Cases.php @@ -1,6 +1,7 @@ objectPermissionByDynaform( + $listDynaform = BusinessModelCases::dynaFormsByApplication( $appUid, $opTaskSource, $opObjUid, @@ -6153,7 +6154,7 @@ class Cases $resultMessages = array_merge($resultMessages, $listMessage); break; case 'DYNAFORM': - $listDynaform = $objectPermission->objectPermissionByDynaform( + $listDynaform = BusinessModelCases::dynaFormsByApplication( $appUid, $opTaskSource, $opObjUid, diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php index c90ec590e..487b0b1f4 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php @@ -33,6 +33,7 @@ use Exception; use G; use Groups; use GroupUserPeer; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use InputDocument; use InvalidIndexSearchTextException; @@ -4235,4 +4236,48 @@ class Cases throw $e; } } + + /** + * Get DynaForms Uids assigned as steps in the related process by application Uid + * + * @param string $appUid + * @param int $sourceTask + * @param string $dynUid + * @param string $caseStatus + * @return array + */ + public static function dynaFormsByApplication($appUid, $sourceTask = 0, $dynUid = '', $caseStatus = '') + { + // Select distinct DYN_UID + $query = ModelApplication::query()->select('STEP.STEP_UID_OBJ AS DYN_UID')->distinct(); + + // Join with STEP table + $query->join('STEP', function ($join) { + $join->on('APPLICATION.PRO_UID', '=', 'STEP.PRO_UID'); + $join->on('STEP.STEP_TYPE_OBJ', '=', DB::raw("'DYNAFORM'")); + }); + + // Filter by application Uid + $query->where('APPLICATION.APP_UID', '=', $appUid); + + // Filter by source task + if ($caseStatus != 'COMPLETED' && $sourceTask != '' && (int)$sourceTask != 0) { + $query->where('STEP.TAS_UID', '=', $sourceTask); + } + + // Filter by DynaForm Uid + if ($dynUid != '' && $dynUid != '0') { + $query->where('STEP.STEP_UID_OBJ', '=', $dynUid); + } + + // Get results + $dynaForms = []; + $items = $query->get(); + $items->each(function ($item) use (&$dynaForms) { + $dynaForms[] = $item->DYN_UID; + }); + + // Return results + return $dynaForms; + } }