Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
94.27% |
181 / 192 |
|
80.00% |
12 / 15 |
CRAP | |
0.00% |
0 / 1 |
Department | |
94.27% |
181 / 192 |
|
80.00% |
12 / 15 |
62.72 | |
0.00% |
0 / 1 |
readEntity | |
100.00% |
14 / 14 |
|
100.00% |
1 / 1 |
5 | |||
readResolvedReferences | |
100.00% |
8 / 8 |
|
100.00% |
1 / 1 |
2 | |||
readList | |
100.00% |
11 / 11 |
|
100.00% |
1 / 1 |
4 | |||
readByScopeId | |
100.00% |
7 / 7 |
|
100.00% |
1 / 1 |
3 | |||
readByOrganisationId | |
100.00% |
13 / 13 |
|
100.00% |
1 / 1 |
4 | |||
deleteEntity | |
100.00% |
16 / 16 |
|
100.00% |
1 / 1 |
8 | |||
writeEntity | |
100.00% |
23 / 23 |
|
100.00% |
1 / 1 |
5 | |||
updateEntity | |
100.00% |
19 / 19 |
|
100.00% |
1 / 1 |
4 | |||
writeDepartmentDayoffs | |
94.12% |
16 / 17 |
|
0.00% |
0 / 1 |
5.01 | |||
writeDepartmentLinks | |
90.91% |
10 / 11 |
|
0.00% |
0 / 1 |
5.02 | |||
writeDepartmentMail | |
100.00% |
8 / 8 |
|
100.00% |
1 / 1 |
1 | |||
writeDepartmentNotifications | |
100.00% |
12 / 12 |
|
100.00% |
1 / 1 |
7 | |||
updateDepartmentMail | |
100.00% |
8 / 8 |
|
100.00% |
1 / 1 |
1 | |||
updateDepartmentNotifications | |
100.00% |
16 / 16 |
|
100.00% |
1 / 1 |
5 | |||
readQueueList | |
0.00% |
0 / 9 |
|
0.00% |
0 / 1 |
12 |
1 | <?php |
2 | |
3 | namespace BO\Zmsdb; |
4 | |
5 | use BO\Zmsentities\Department as Entity; |
6 | use BO\Zmsentities\Collection\DepartmentList as Collection; |
7 | |
8 | /** |
9 | * @SuppressWarnings(Coupling) |
10 | * @SuppressWarnings(Complexity) |
11 | * |
12 | */ |
13 | class Department extends Base |
14 | { |
15 | /** |
16 | * |
17 | * @var Array \BO\Zmsentities\Department |
18 | */ |
19 | public static $departmentCache = array(); |
20 | |
21 | public function readEntity($departmentId, $resolveReferences = 0, $disableCache = false) |
22 | { |
23 | $cacheKey = "$departmentId-$resolveReferences"; |
24 | if (! $disableCache && array_key_exists($cacheKey, self::$departmentCache)) { |
25 | return clone self::$departmentCache[$cacheKey]; |
26 | } |
27 | $query = new Query\Department(Query\Base::SELECT); |
28 | $query->addEntityMapping() |
29 | ->addResolvedReferences($resolveReferences) |
30 | ->addConditionDepartmentId($departmentId); |
31 | $department = $this->fetchOne($query, new Entity()); |
32 | if (isset($department['id']) && $department['id']) { |
33 | $department = $this->readResolvedReferences($department, $resolveReferences); |
34 | $department = $department->withOutClusterDuplicates(); |
35 | self::$departmentCache[$cacheKey] = $department; |
36 | return clone self::$departmentCache[$cacheKey]; |
37 | } |
38 | return null; |
39 | } |
40 | |
41 | public function readResolvedReferences(\BO\Zmsentities\Schema\Entity $entity, $resolveReferences) |
42 | { |
43 | $entity['links'] = (new Link())->readByDepartmentId($entity->id); |
44 | $entity['scopes'] = (new Scope()) |
45 | ->readByDepartmentId($entity->id, $resolveReferences - 1) |
46 | ->sortByContactName(); |
47 | if (0 < $resolveReferences) { |
48 | $entity['clusters'] = (new Cluster())->readByDepartmentId($entity->id, $resolveReferences - 1); |
49 | $entity['dayoff'] = (new DayOff())->readOnlyByDepartmentId($entity->id); |
50 | } |
51 | return $entity; |
52 | } |
53 | |
54 | public function readList($resolveReferences = 0) |
55 | { |
56 | $departmentList = new Collection(); |
57 | $query = new Query\Department(Query\Base::SELECT); |
58 | $query->addEntityMapping(); |
59 | $query->addResolvedReferences($resolveReferences); |
60 | $result = $this->fetchList($query, new Entity()); |
61 | if (count($result)) { |
62 | foreach ($result as $department) { |
63 | $department = $this->readResolvedReferences($department, $resolveReferences); |
64 | if ($department instanceof Entity) { |
65 | $departmentList->addEntity($department->withOutClusterDuplicates()); |
66 | } |
67 | } |
68 | } |
69 | return $departmentList; |
70 | } |
71 | |
72 | public function readByScopeId($scopeId, $resolveReferences = 0) |
73 | { |
74 | $query = new Query\Department(Query\Base::SELECT); |
75 | $query->addEntityMapping() |
76 | ->addResolvedReferences($resolveReferences) |
77 | ->addConditionScopeId($scopeId); |
78 | $department = $this->fetchOne($query, new Entity()); |
79 | $department = $this->readResolvedReferences($department, $resolveReferences); |
80 | return (isset($department['id']) && $department['id']) ? $department->withOutClusterDuplicates() : null; |
81 | } |
82 | |
83 | public function readByOrganisationId($organisationId, $resolveReferences = 0) |
84 | { |
85 | $departmentList = new Collection(); |
86 | $query = new Query\Department(Query\Base::SELECT); |
87 | $query |
88 | ->addEntityMapping() |
89 | ->addResolvedReferences($resolveReferences) |
90 | ->addConditionOrganisationId($organisationId); |
91 | $result = $this->fetchList($query, new Entity()); |
92 | if (count($result)) { |
93 | foreach ($result as $department) { |
94 | if ($department instanceof Entity) { |
95 | $department = $this->readResolvedReferences($department, $resolveReferences); |
96 | $departmentList->addEntity($department->withOutClusterDuplicates()); |
97 | } |
98 | } |
99 | } |
100 | return $departmentList; |
101 | } |
102 | |
103 | /** |
104 | * remove a department |
105 | * |
106 | * @param |
107 | * departmentId |
108 | * |
109 | * @return Resource Status |
110 | */ |
111 | public function deleteEntity($departmentId) |
112 | { |
113 | $entity = $this->readEntity($departmentId, 1); |
114 | if ($entity) { |
115 | if ( |
116 | 0 < $entity->toProperty()->scopes->get()->count() |
117 | || 0 < $entity->toProperty()->clusters->get()->count() |
118 | ) { |
119 | throw new Exception\Department\ScopeListNotEmpty(); |
120 | } |
121 | |
122 | self::$departmentCache = []; |
123 | $query = new Query\Department(Query\Base::DELETE); |
124 | $query->addConditionDepartmentId($departmentId); |
125 | $entityDelete = $this->deleteItem($query); |
126 | $emailDelete = $this->perform(Query\Department::QUERY_MAIL_DELETE, array( |
127 | $departmentId |
128 | )); |
129 | $notificationsDelete = $this->perform(Query\Department::QUERY_NOTIFICATIONS_DELETE, array( |
130 | $departmentId |
131 | )); |
132 | } |
133 | return ($entity && $entityDelete && $emailDelete && $notificationsDelete) ? $entity : null; |
134 | } |
135 | |
136 | /** |
137 | * write a department |
138 | * |
139 | * @param Department $entity |
140 | * |
141 | * @return Entity |
142 | */ |
143 | public function writeEntity(\BO\Zmsentities\Department $entity, $parentId) |
144 | { |
145 | self::$departmentCache = []; |
146 | $query = new Query\Department(Query\Base::INSERT); |
147 | $values = $query->reverseEntityMapping($entity, $parentId); |
148 | // get owner by organisation |
149 | $owner = (new Owner())->readByOrganisationId($parentId); |
150 | $values['KundenID'] = $owner->id; |
151 | $query->addValues($values); |
152 | $this->writeItem($query); |
153 | $lastInsertId = $this->getWriter() |
154 | ->lastInsertId(); |
155 | if ($entity->toProperty()->links->isAvailable()) { |
156 | $this->writeDepartmentLinks($lastInsertId, $entity->links); |
157 | } |
158 | if ($entity->toProperty()->dayoff->isAvailable()) { |
159 | $this->writeDepartmentDayoffs($lastInsertId, $entity->dayoff); |
160 | } |
161 | if ($entity->toProperty()->email->isAvailable()) { |
162 | $this->writeDepartmentMail( |
163 | $lastInsertId, |
164 | $entity->email, |
165 | $entity->sendEmailReminderEnabled, |
166 | $entity->sendEmailReminderMinutesBefore |
167 | ); |
168 | } |
169 | if ($entity->getNotificationPreferences()) { |
170 | $this->writeDepartmentNotifications($lastInsertId, $entity->getNotificationPreferences()); |
171 | } |
172 | return $this->readEntity($lastInsertId); |
173 | } |
174 | |
175 | /** |
176 | * update a department |
177 | * |
178 | * @param |
179 | * departmentId |
180 | * |
181 | * @return Entity |
182 | */ |
183 | public function updateEntity($departmentId, \BO\Zmsentities\Department $entity) |
184 | { |
185 | self::$departmentCache = []; |
186 | $query = new Query\Department(Query\Base::UPDATE); |
187 | $query->addConditionDepartmentId($departmentId); |
188 | $values = $query->reverseEntityMapping($entity); |
189 | $query->addValues($values); |
190 | $this->writeItem($query); |
191 | if ($entity->toProperty()->links->isAvailable()) { |
192 | $this->writeDepartmentLinks($departmentId, $entity->links); |
193 | } |
194 | if ($entity->toProperty()->dayoff->isAvailable()) { |
195 | $this->writeDepartmentDayoffs($departmentId, $entity->dayoff); |
196 | } |
197 | if ($entity->toProperty()->email->isAvailable()) { |
198 | $this->updateDepartmentMail( |
199 | $departmentId, |
200 | $entity->email, |
201 | $entity->sendEmailReminderEnabled, |
202 | $entity->sendEmailReminderMinutesBefore |
203 | ); |
204 | } |
205 | $this->updateDepartmentNotifications($departmentId, $entity->getNotificationPreferences()); |
206 | return $this->readEntity($departmentId); |
207 | } |
208 | |
209 | /** |
210 | * create dayoff preferences of a department |
211 | * |
212 | * @param |
213 | * departmentId, |
214 | * dayoffs |
215 | * |
216 | * @return Boolean |
217 | */ |
218 | protected function writeDepartmentDayoffs($departmentId, $dayoffList) |
219 | { |
220 | if (!$departmentId) { |
221 | throw new Exception\Department\InvalidId(); |
222 | } |
223 | $existingDayoffs = (new DayOff())->readOnlyByDepartmentId($departmentId); |
224 | if ($existingDayoffs->count()) { |
225 | foreach ($existingDayoffs as $item) { |
226 | $query = new DayOff(); |
227 | $query->deleteEntity($item->getId()); |
228 | } |
229 | } |
230 | |
231 | foreach ($dayoffList as $dayoff) { |
232 | $query = new Query\DayOff(Query\Base::INSERT); |
233 | $query->addValues( |
234 | [ |
235 | 'behoerdenid' => $departmentId, |
236 | 'Feiertag' => $dayoff['name'], |
237 | 'Datum' => (new \DateTimeImmutable('@' . $dayoff['date']))->format('Y-m-d') |
238 | ] |
239 | ); |
240 | $this->writeItem($query); |
241 | } |
242 | } |
243 | |
244 | /** |
245 | * create links preferences of a department |
246 | * |
247 | * @param |
248 | * departmentId, |
249 | * links |
250 | * |
251 | * @return Boolean |
252 | */ |
253 | protected function writeDepartmentLinks($departmentId, $links) |
254 | { |
255 | if (!$departmentId) { |
256 | throw new Exception\Department\InvalidId(); |
257 | } |
258 | $existingLinks = (new Link())->readByDepartmentId($departmentId); |
259 | if ($existingLinks->count()) { |
260 | foreach ($existingLinks as $item) { |
261 | $query = new Link(); |
262 | $query->deleteEntity($item->getId()); |
263 | } |
264 | } |
265 | |
266 | foreach ($links as $link) { |
267 | $link = new \BO\Zmsentities\Link($link); |
268 | $query = new Link(); |
269 | $query->writeEntity($link, $departmentId); |
270 | } |
271 | } |
272 | |
273 | /** |
274 | * create mail preferences of a department |
275 | * |
276 | * @param |
277 | * departmentId, |
278 | |
279 | * |
280 | * @return Boolean |
281 | */ |
282 | protected function writeDepartmentMail( |
283 | $departmentId, |
284 | $email, |
285 | $sendEmailReminderEnabled, |
286 | $sendEmailReminderMinutesBefore |
287 | ) { |
288 | self::$departmentCache = []; |
289 | $result = $this->perform(Query\Department::QUERY_MAIL_INSERT, array( |
290 | $departmentId, |
291 | $email, |
292 | $sendEmailReminderEnabled, |
293 | $sendEmailReminderMinutesBefore |
294 | )); |
295 | return $result; |
296 | } |
297 | |
298 | /** |
299 | * create notification preferences of a department |
300 | * |
301 | * @param |
302 | * departmentId, |
303 | * preferences |
304 | * |
305 | * @return Boolean |
306 | */ |
307 | protected function writeDepartmentNotifications($departmentId, $preferences) |
308 | { |
309 | self::$departmentCache = []; |
310 | |
311 | $result = $this->perform( |
312 | Query\Department::QUERY_NOTIFICATIONS_INSERT, |
313 | array( |
314 | $departmentId, |
315 | (isset($preferences['enabled']) && $preferences['enabled']) ? 1 : 0, |
316 | $preferences['identification'], |
317 | (isset($preferences['sendConfirmationEnabled']) && $preferences['sendConfirmationEnabled']) ? 1 : 0, |
318 | (isset($preferences['sendReminderEnabled']) && $preferences['sendReminderEnabled']) ? 1 : 0 |
319 | ) |
320 | ); |
321 | return $result; |
322 | } |
323 | |
324 | /** |
325 | * update mail preferences of a department |
326 | * |
327 | * @param |
328 | * departmentId, |
329 | |
330 | * |
331 | * @return Boolean |
332 | */ |
333 | protected function updateDepartmentMail( |
334 | $departmentId, |
335 | $email, |
336 | $sendEmailReminderEnabled, |
337 | $sendEmailReminderMinutesBefore |
338 | ) { |
339 | self::$departmentCache = []; |
340 | $query = Query\Department::QUERY_MAIL_UPDATE; |
341 | return $this->fetchAffected($query, array( |
342 | 'email' => $email, |
343 | 'departmentId' => $departmentId, |
344 | 'sendEmailReminderEnabled' => $sendEmailReminderEnabled, |
345 | 'sendEmailReminderMinutesBefore' => $sendEmailReminderMinutesBefore |
346 | )); |
347 | } |
348 | |
349 | /** |
350 | * update notification preferences of a department |
351 | * |
352 | * @param |
353 | * departmentId, |
354 | * preferences |
355 | * |
356 | * @return Boolean |
357 | */ |
358 | protected function updateDepartmentNotifications($departmentId, $preferences) |
359 | { |
360 | self::$departmentCache = []; |
361 | $query = Query\Department::QUERY_NOTIFICATIONS_UPDATE; |
362 | return $this->fetchAffected( |
363 | $query, |
364 | array( |
365 | 'enabled' => |
366 | (isset($preferences['enabled'])) ? $preferences['enabled'] : 0, |
367 | 'identification' => |
368 | (isset($preferences['identification'])) ? $preferences['identification'] : 0, |
369 | 'sendConfirmationEnabled' => |
370 | (isset($preferences['sendConfirmationEnabled'])) ? $preferences['sendConfirmationEnabled'] : 0, |
371 | 'sendReminderEnabled' => |
372 | (isset($preferences['sendReminderEnabled'])) ? $preferences['sendReminderEnabled'] : 0, |
373 | 'departmentId' => $departmentId |
374 | ) |
375 | ); |
376 | } |
377 | |
378 | public function readQueueList( |
379 | $departmentId, |
380 | \DateTimeInterface $dateTime, |
381 | $resolveReferences = 0 |
382 | ) { |
383 | $queueList = new \BO\Zmsentities\Collection\QueueList(); |
384 | $department = $this->readEntity($departmentId, 2); |
385 | |
386 | foreach ($department->getScopeList() as $scope) { |
387 | $scope = (new Scope())->readWithWorkstationCount($scope->id, $dateTime); |
388 | $scopeQueueList = (new Scope()) |
389 | ->readQueueListWithWaitingTime($scope, $dateTime, $resolveReferences); |
390 | if (0 < $scopeQueueList->count()) { |
391 | $queueList->addList($scopeQueueList); |
392 | } |
393 | } |
394 | return $queueList; |
395 | } |
396 | } |