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