forked from ProcessMaker/processmaker
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSignalHelper.php
More file actions
117 lines (97 loc) · 3.27 KB
/
SignalHelper.php
File metadata and controls
117 lines (97 loc) · 3.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<?php
namespace ProcessMaker\ImportExport;
use Illuminate\Support\Collection;
use ProcessMaker\Managers\SignalManager;
use ProcessMaker\Models\Process;
class SignalHelper
{
const THROW_TYPES = [
'endEvent',
'intermediateThrowEvent',
];
public $allSignals;
public function getGlobalSignals() : Collection
{
$globalSignalProcess = SignalManager::getGlobalSignalProcess();
return SignalManager::getAllSignals(true, [$globalSignalProcess])
->mapWithKeys(fn ($s) => [$s['id'] => $s['name']]);
}
public function getGlobalSignalIds()
{
return $this->getGlobalSignal()->keys();
}
public function globalSignalsInProcess(Process $process)
{
$globalSignals = $this->getGlobalSignals();
$signalsInProcess = $this->signalsInProcess($process)
->filter(fn ($signalInfo) => $globalSignals->has($signalInfo['id']))
->map(function ($signalInfo) {
return [
'id' => $signalInfo['id'],
'name' => $signalInfo['name'],
'detail' => $signalInfo['detail'],
];
});
return $signalsInProcess;
}
public function processessReferencedByThrowSignals(Process $sourceProcess)
{
$id = $sourceProcess->id;
$signalIdsInProcess = $this->throwSignalsInProcess($sourceProcess);
$processes = [];
foreach ($this->getAllSignals() as $signalInfo) {
if (!in_array($signalInfo['id'], $signalIdsInProcess)) {
continue;
}
foreach ($signalInfo['processes'] as $processInfo) {
if ($processInfo['id'] === $id) {
// Do not include the source process
continue;
}
foreach ($processInfo['catches'] as $catchInfo) {
$processes[] = [
Process::findOrFail($processInfo['id']),
$signalInfo['id'],
$signalInfo['name'],
];
}
}
}
return $processes;
}
public function throwSignalsInProcess(Process $sourceProcess)
{
$signals = [];
foreach ($this->signalsInProcess($sourceProcess) as $signalInfo) {
$processInfo = $signalInfo['processes'];
foreach ($processInfo['catches'] as $catchInfo) {
if (in_array($catchInfo['type'], self::THROW_TYPES)) {
$signals[] = $signalInfo;
break;
}
}
}
return $signals;
}
public function signalsInProcess(Process $sourceProcess)
{
$id = $sourceProcess->id;
$signals = [];
foreach ($this->getAllSignals() as $signalInfo) {
foreach ($signalInfo['processes'] as $processInfo) {
if ($processInfo['id'] === $id) {
$signals[] = $signalInfo;
break;
}
}
}
return collect($signals);
}
public function getAllSignals()
{
if (!$this->allSignals) {
$this->allSignals = SignalManager::getAllSignals(false);
}
return $this->allSignals;
}
}