Skip to content

Commit bcff927

Browse files
committed
FOUR-24577: Threads of cases in parallel are reloaded automatically into a parent case
1 parent 4667293 commit bcff927

3 files changed

Lines changed: 103 additions & 3 deletions

File tree

‎ProcessMaker/Events/ProcessUpdated.php‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ class ProcessUpdated implements ShouldBroadcastNow
2424

2525
private $processRequest;
2626

27+
public $activeTokens;
28+
2729
/**
2830
* Create a new event instance.
2931
*
@@ -35,7 +37,7 @@ public function __construct(ProcessRequest $processRequest, $event, TokenInterfa
3537
$this->event = $event;
3638

3739
$this->processRequest = $processRequest;
38-
40+
$this->activeTokens = $this->processRequest->getActiveTokens($this->processRequest);
3941
if ($token) {
4042
$this->tokenId = $token->getId();
4143
$this->elementType = $token->element_type;
@@ -65,7 +67,7 @@ public function broadcastOn()
6567
/**
6668
* Return the process request.
6769
*
68-
* @return \ProcessMaker\Models\ProcessRequest
70+
* @return ProcessRequest
6971
*/
7072
public function getProcessRequest()
7173
{

‎ProcessMaker/Models/ProcessRequest.php‎

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1141,9 +1141,19 @@ public function scopeFilterByCaseNumber($query, $request)
11411141
*/
11421142
public static function getActiveTokens(self $processRequest)
11431143
{
1144-
return $processRequest->tokens()
1144+
return ProcessRequestToken::query()
11451145
->select('id')
11461146
->where('status', 'ACTIVE')
1147+
// where if collaborationId is not null
1148+
->where(function ($query) use ($processRequest) {
1149+
if ($processRequest->process_collaboration_id) {
1150+
$query->whereIn('process_request_id', function ($query) use ($processRequest) {
1151+
$query->select('id')->from('process_requests')->where('process_collaboration_id', $processRequest->process_collaboration_id);
1152+
});
1153+
} else {
1154+
$query->where('process_request_id', $processRequest->id);
1155+
}
1156+
})
11471157
->pluck('id')
11481158
->toArray();
11491159
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
<?php
2+
3+
namespace Tests\Unit\ProcessMaker\Models;
4+
5+
use ProcessMaker\Models\Process;
6+
use ProcessMaker\Models\ProcessRequest;
7+
use ProcessMaker\Models\ProcessRequestToken;
8+
use ProcessMaker\Models\User;
9+
use Tests\TestCase;
10+
11+
class ProcessRequestTest extends TestCase
12+
{
13+
/**
14+
* Test that getActiveTokens correctly returns active tokens for a process request
15+
* with and without process_collaboration_id
16+
*/
17+
public function testGetActiveTokens()
18+
{
19+
// Test scenario 1: Process request without collaboration ID
20+
$process = Process::factory()->create();
21+
$request = ProcessRequest::factory()->create([
22+
'process_id' => $process->id,
23+
'status' => 'ACTIVE',
24+
'process_collaboration_id' => null,
25+
]);
26+
27+
// Create tokens for the request (2 active, 1 completed)
28+
$activeToken1 = ProcessRequestToken::factory()->create([
29+
'process_request_id' => $request->id,
30+
'status' => 'ACTIVE',
31+
]);
32+
33+
$activeToken2 = ProcessRequestToken::factory()->create([
34+
'process_request_id' => $request->id,
35+
'status' => 'ACTIVE',
36+
]);
37+
38+
$completedToken = ProcessRequestToken::factory()->create([
39+
'process_request_id' => $request->id,
40+
'status' => 'CLOSED',
41+
]);
42+
43+
// Test getActiveTokens for request without collaboration
44+
$activeTokens = ProcessRequest::getActiveTokens($request);
45+
$this->assertCount(2, $activeTokens);
46+
$this->assertContains($activeToken1->id, $activeTokens);
47+
$this->assertContains($activeToken2->id, $activeTokens);
48+
$this->assertNotContains($completedToken->id, $activeTokens);
49+
50+
// Test scenario 2: Process requests with collaboration ID
51+
$collaborationId = 123456; // Using an integer instead of a string
52+
53+
// Update the existing request with collaboration ID
54+
$request->process_collaboration_id = $collaborationId;
55+
$request->save();
56+
57+
// Create a second request with the same collaboration ID
58+
$request2 = ProcessRequest::factory()->create([
59+
'process_id' => $process->id,
60+
'status' => 'ACTIVE',
61+
'process_collaboration_id' => $collaborationId,
62+
]);
63+
64+
// Create tokens for the second request (1 active, 1 completed)
65+
$activeToken3 = ProcessRequestToken::factory()->create([
66+
'process_request_id' => $request2->id,
67+
'status' => 'ACTIVE',
68+
]);
69+
70+
$completedToken2 = ProcessRequestToken::factory()->create([
71+
'process_request_id' => $request2->id,
72+
'status' => 'CLOSED',
73+
]);
74+
75+
// Test getActiveTokens for request with collaboration
76+
$collaborationActiveTokens = ProcessRequest::getActiveTokens($request);
77+
$this->assertCount(3, $collaborationActiveTokens);
78+
79+
// Should contain all active tokens from both requests with the same collaboration ID
80+
$this->assertContains($activeToken1->id, $collaborationActiveTokens);
81+
$this->assertContains($activeToken2->id, $collaborationActiveTokens);
82+
$this->assertContains($activeToken3->id, $collaborationActiveTokens);
83+
84+
// Should not contain any completed tokens
85+
$this->assertNotContains($completedToken->id, $collaborationActiveTokens);
86+
$this->assertNotContains($completedToken2->id, $collaborationActiveTokens);
87+
}
88+
}

0 commit comments

Comments
 (0)