Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
82.29% covered (warning)
82.29%
79 / 96
94.12% covered (success)
94.12%
32 / 34
CRAP
0.00% covered (danger)
0.00%
0 / 1
Session
82.29% covered (warning)
82.29%
79 / 96
94.12% covered (success)
94.12%
32 / 34
97.21
0.00% covered (danger)
0.00%
0 / 1
 getDefaults
100.00% covered (success)
100.00%
34 / 34
100.00% covered (success)
100.00%
1 / 1
1
 getContent
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getBasket
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getHuman
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getRequests
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getProviders
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getProcess
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getSource
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getScope
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getAuthKey
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getLastStep
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
3
 getStatus
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 removeLastStep
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
3
 getSelectedDate
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getEntryData
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 isEmpty
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
4
 isInChange
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
 isStalled
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
 isReserved
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
 isConfirmed
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
 isPreconfirmed
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
6
 isFinished
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
 isProcessDeleted
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 hasStatus
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
 hasProcess
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
 hasAuthKey
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
 hasChangedProcess
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
 hasPreviousAppointmentSearch
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
 hasRequests
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
 hasProvider
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
 hasScope
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
 hasDate
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
 hasDifferentEntry
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
8
 withOidcDataOnly
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
72
1<?php
2
3namespace BO\Zmsentities;
4
5/**
6 * Extension for Twig and Slim
7 *
8 * Schema-backed entity (ArrayObject::ARRAY_AS_PROPS); document dynamic keys for Psalm.
9 *
10 * @property string $id
11 * @property string $name
12 * @property array $content
13 *
14 * @SuppressWarnings(PublicMethod)
15 * @SuppressWarnings(TooManyMethods)
16 * @SuppressWarnings(Complexity)
17 */
18class Session extends Schema\Entity
19{
20    public const string PRIMARY = 'id';
21
22    public static $schema = "session.json";
23
24    /**
25     * @return ((int|int[]|string)[]|string)[][]
26     *
27     */
28    #[\Override]
29    public function getDefaults()
30    {
31        return [
32            'content' => array(
33                'basket' => [
34                    'requests' => '',
35                    'providers' => '',
36                    'scope' => '0',
37                    'process' => '0',
38                    'date' => '0',
39                    'familyName' => '',
40                    'email' => '',
41                    'telephone' => '',
42                    'amendment' => '',
43                    'authKey' => ''
44                ],
45                'human' => [
46                    'captcha_text' => '',
47                    'client' => 0,
48                    'ts' => 0,
49                    'origin' => '',
50                    'remoteAddress' => '',
51                    'referer' => '',
52                    'step' => array(
53                      'dayselect' => 0,
54                      'timeselect' => 0,
55                      'register' => 0,
56                      'summary' => 0
57                    )
58                ],
59                'source' => 'dldb',
60                'status' => 'start',
61                'X-Authkey' => '',
62                'error' => ''
63            )
64        ];
65    }
66
67    public function getContent(): mixed
68    {
69        return $this->toProperty()->content->get();
70    }
71
72    public function getBasket(): mixed
73    {
74        return $this->toProperty()->content->basket->get();
75    }
76
77    public function getHuman(): mixed
78    {
79        return $this->toProperty()->content->human->get();
80    }
81
82    public function getRequests(): string
83    {
84        return Helper\Sorter::toSortedCsv($this->toProperty()->content->basket->requests->get());
85    }
86
87    public function getProviders(): string
88    {
89        return Helper\Sorter::toSortedCsv($this->toProperty()->content->basket->providers->get());
90    }
91
92    public function getProcess(): mixed
93    {
94        return $this->toProperty()->content->basket->process->get();
95    }
96
97    public function getSource(): mixed
98    {
99        return $this->toProperty()->content->source->get();
100    }
101
102    public function getScope(): mixed
103    {
104        return $this->toProperty()->content->basket->scope->get();
105    }
106
107    public function getAuthKey(): mixed
108    {
109        return $this->toProperty()->content->basket->authKey->get();
110    }
111
112    /**
113     * @return (int|string)|false|null
114     *
115     */
116    public function getLastStep()
117    {
118        $steps = $this->toProperty()->content->human->step->get();
119        $steps = (is_array($steps)) ? array_keys($steps) : null;
120        return (null !== $steps) ? end($steps) : $steps;
121    }
122
123    public function getStatus(): mixed
124    {
125        return $this->toProperty()->content->status->get();
126    }
127
128    public function removeLastStep(): static
129    {
130        $lastStep = $this->getLastStep();
131        if ($lastStep !== null && $lastStep !== false) {
132            unset($this->content['human']['step'][$lastStep]);
133        }
134        return $this;
135    }
136
137    /**
138     *
139     * Get selected date
140     *
141     * @return integer
142     */
143    public function getSelectedDate()
144    {
145        return $this->toProperty()->content->basket->date->get();
146    }
147
148    /**
149     *
150     * Get entry data
151     *
152     * @return array
153     */
154    public function getEntryData()
155    {
156        return $this->toProperty()->content->entry->get();
157    }
158
159    public function isEmpty(): bool
160    {
161        return (! $this->hasProvider() && ! $this->hasRequests() && ! $this->hasScope()) ? true : false;
162    }
163
164    public function isInChange(): bool
165    {
166        return ('inChange' == $this->getStatus()) ? true : false;
167    }
168
169    public function isStalled(): bool
170    {
171        return ('stalled' == $this->getStatus()) ? true : false;
172    }
173
174    public function isReserved(): bool
175    {
176        return ('reserved' == $this->getStatus()) ? true : false;
177    }
178
179    public function isConfirmed(): bool
180    {
181        return ('confirmed' == $this->getStatus()) ? true : false;
182    }
183
184    public function isPreconfirmed(): bool
185    {
186        return ('preconfirmed' == $this->getStatus()) ? true : false;
187    }
188
189    public function isFinished(): bool
190    {
191        return ('finished' == $this->getStatus()) ? true : false;
192    }
193
194    public function isProcessDeleted(): bool
195    {
196        return ! $this->hasProcess();
197    }
198
199    public function hasStatus(): bool
200    {
201        return (null === $this->getStatus()) ? false : true;
202    }
203
204    public function hasProcess(): bool
205    {
206        return (null === $this->getProcess()) ? false : true;
207    }
208
209    public function hasAuthKey(): bool
210    {
211        return (null === $this->getAuthKey()) ? false : true;
212    }
213
214    public function hasChangedProcess(): bool
215    {
216        return ('inChange' == $this->getStatus()) ? true : false;
217    }
218
219    public function hasPreviousAppointmentSearch(): bool
220    {
221        return ('inProgress' == $this->getStatus()) ? true : false;
222    }
223
224    /**
225     * Check if requests exists
226     *
227     * @return boolean
228     */
229    public function hasRequests()
230    {
231        return ($this->getRequests()) ? true : false;
232    }
233
234    /**
235     *
236     * Check if provider exists
237     *
238     * @return boolean
239     */
240    public function hasProvider()
241    {
242        return ($this->getProviders()) ? true : false;
243    }
244
245    /**
246     *
247     * Check if scope exists
248     *
249     * @return boolean
250     */
251    public function hasScope()
252    {
253        return ($this->getScope()) ? true : false;
254    }
255
256    /**
257     *
258     * Check if date exists
259     *
260     * @return boolean
261     */
262    public function hasDate()
263    {
264        return ($this->getSelectedDate()) ? true : false;
265    }
266
267    /**
268     *
269     * Check if entry parameter are different
270     *
271     * @return boolean
272     */
273    public function hasDifferentEntry(mixed $newEntryData)
274    {
275        return (
276            ($this->getProviders() || $this->getScope()) &&
277            $this->getRequests() &&
278            $this->getEntryData() &&
279            (
280                !($this->getProviders() == Helper\Sorter::toSortedCsv($newEntryData['providers'])) ||
281                !($this->getRequests() == Helper\Sorter::toSortedCsv($newEntryData['requests'])) ||
282                !($this->getScope() == $newEntryData['scope'])
283            )
284         ) ? true : false;
285    }
286
287    public function withOidcDataOnly(): static
288    {
289        $entity = clone $this;
290        if ($entity->toProperty()->content->basket->isAvailable()) {
291            unset($entity->content['basket']);
292        }
293        if ($entity->toProperty()->content->human->isAvailable()) {
294            unset($entity->content['human']);
295        }
296        if ($entity->toProperty()->content->entry->isAvailable()) {
297            unset($entity->content['entry']);
298        }
299        if ($entity->toProperty()->content->source->isAvailable()) {
300            unset($entity->content['source']);
301        }
302        if ($entity->toProperty()->content->status->isAvailable()) {
303            unset($entity->content['status']);
304        }
305        if ($entity->toProperty()->content['X-Authkey']->isAvailable()) {
306            unset($entity->content['X-Authkey']);
307        }
308        if ($entity->toProperty()->content->error->isAvailable()) {
309            unset($entity->content['error']);
310        }
311        return $entity;
312    }
313}