Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
94.27% covered (success)
94.27%
181 / 192
80.00% covered (warning)
80.00%
12 / 15
CRAP
0.00% covered (danger)
0.00%
0 / 1
Department
94.27% covered (success)
94.27%
181 / 192
80.00% covered (warning)
80.00%
12 / 15
62.72
0.00% covered (danger)
0.00%
0 / 1
 readEntity
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
1 / 1
5
 readResolvedReferences
100.00% covered (success)
100.00%
8 / 8
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%
16 / 16
100.00% covered (success)
100.00%
1 / 1
8
 writeEntity
100.00% covered (success)
100.00%
23 / 23
100.00% covered (success)
100.00%
1 / 1
5
 updateEntity
100.00% covered (success)
100.00%
19 / 19
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
1<?php
2
3namespace BO\Zmsdb;
4
5use BO\Zmsentities\Department as Entity;
6use BO\Zmsentities\Collection\DepartmentList as Collection;
7
8/**
9 * @SuppressWarnings(Coupling)
10 * @SuppressWarnings(Complexity)
11 *
12 */
13class 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     *            email
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     *            email
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}