Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
99.20% covered (success)
99.20%
124 / 125
90.00% covered (success)
90.00%
9 / 10
CRAP
0.00% covered (danger)
0.00%
0 / 1
DayOff
99.20% covered (success)
99.20%
124 / 125
90.00% covered (success)
90.00%
9 / 10
48
0.00% covered (danger)
0.00%
0 / 1
 readByDepartmentId
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
4
 readOnlyByDepartmentId
100.00% covered (success)
100.00%
17 / 17
100.00% covered (success)
100.00%
1 / 1
8
 readCommon
100.00% covered (success)
100.00%
17 / 17
100.00% covered (success)
100.00%
1 / 1
8
 readByScopeId
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
1 / 1
8
 readByYear
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
4
 readCommonByYear
100.00% covered (success)
100.00%
12 / 12
100.00% covered (success)
100.00%
1 / 1
4
 writeCommonDayoffsByYear
100.00% covered (success)
100.00%
19 / 19
100.00% covered (success)
100.00%
1 / 1
5
 deleteByTimeInterval
100.00% covered (success)
100.00%
16 / 16
100.00% covered (success)
100.00%
1 / 1
3
 deleteEntity
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 removeCache
75.00% covered (warning)
75.00%
3 / 4
0.00% covered (danger)
0.00%
0 / 1
3.14
1<?php
2
3namespace BO\Zmsdb;
4
5use BO\Zmsdb\Application as App;
6use BO\Zmsentities\Dayoff as Entity;
7use BO\Zmsentities\Collection\DayoffList as Collection;
8
9class DayOff extends Base
10{
11    /**
12     * common DayOff like Xmas...
13     *
14     */
15    public static $commonList = null;
16
17    public function readByDepartmentId($departmentId = 0)
18    {
19        $dayOffList = $this->readCommon();
20        $departmentDayoffList = $this->readOnlyByDepartmentId($departmentId);
21        if (count($departmentDayoffList)) {
22            foreach ($departmentDayoffList as $entity) {
23                if ($entity instanceof Entity) {
24                    $dayOffList->addEntity($entity);
25                }
26            }
27        }
28        return $dayOffList;
29    }
30
31    public function readOnlyByDepartmentId($departmentId = 0, $disableCache = false)
32    {
33        $cacheKey = "dayOffsReadOnlyByDepartmentId-$departmentId";
34
35        if (!$disableCache && App::$cache) {
36            $data = App::$cache->get($cacheKey);
37            if (!empty($data)) {
38                return $data;
39            }
40        }
41
42        $dayOffList = new Collection();
43        $query = new Query\DayOff(Query\Base::SELECT);
44        $query->addEntityMapping()
45            ->addConditionDepartmentId($departmentId);
46        $result = $this->fetchList($query, new Entity());
47        if (count($result)) {
48            foreach ($result as $entity) {
49                if ($entity instanceof Entity) {
50                    $dayOffList->addEntity($entity);
51                }
52            }
53        }
54
55        if (App::$cache) {
56            App::$cache->set($cacheKey, $dayOffList);
57        }
58
59        return $dayOffList;
60    }
61
62    public function readCommon($disableCache = false)
63    {
64        $cacheKey = "dayOffs";
65
66        if (!$disableCache && App::$cache) {
67            $data = App::$cache->get($cacheKey);
68            if (!empty($data)) {
69                return $data;
70            }
71        }
72
73        $dayOffList = new Collection();
74        $query = new Query\DayOff(Query\Base::SELECT);
75        $query->addEntityMapping()
76            ->addConditionCommon();
77        $result = $this->fetchList($query, new Entity());
78        if (count($result)) {
79            foreach ($result as $entity) {
80                if ($entity instanceof Entity) {
81                    $dayOffList->addEntity($entity);
82                }
83            }
84        }
85
86        if (App::$cache) {
87            App::$cache->set($cacheKey, $dayOffList);
88        }
89
90        return $dayOffList;
91    }
92
93    public function readByScopeId($scopeId = 0, $disableCache = false)
94    {
95        $cacheKey = "dayOffsByScope-$scopeId";
96
97        $dayOffListCommon = $this->readCommon();
98
99        if (!$disableCache && App::$cache) {
100            $data = App::$cache->get($cacheKey);
101            if (!empty($data)) {
102                return $dayOffListCommon->addList($data);
103            }
104        }
105
106        $dayOffList = new Collection();
107        $query = new Query\DayOff(Query\Base::SELECT);
108        $query->addEntityMapping()
109            ->addConditionScopeId($scopeId);
110        $result = $this->fetchList($query, new Entity());
111        if (count($result)) {
112            foreach ($result as $entity) {
113                if ($entity instanceof Entity) {
114                    $dayOffList->addEntity($entity);
115                }
116            }
117        }
118
119        if (App::$cache) {
120            App::$cache->set($cacheKey, $dayOffList);
121        }
122
123        return $dayOffListCommon->addList($dayOffList);
124    }
125
126    public function readByYear($year)
127    {
128        $dayOffList = new Collection();
129        $query = new Query\DayOff(Query\Base::SELECT);
130        $query
131            ->addEntityMapping()
132            ->addConditionYear($year);
133        $result = $this->fetchList($query, new Entity());
134        if (count($result)) {
135            foreach ($result as $entity) {
136                if ($entity instanceof Entity) {
137                    $dayOffList->addEntity($entity);
138                }
139            }
140        }
141        return $dayOffList;
142    }
143
144    public function readCommonByYear($year)
145    {
146        $dayOffList = new Collection();
147        $query = new Query\DayOff(Query\Base::SELECT);
148        $query
149            ->addEntityMapping()
150            ->addConditionCommon()
151            ->addConditionYear($year);
152        $result = $this->fetchList($query, new Entity());
153        if (count($result)) {
154            foreach ($result as $entity) {
155                if ($entity instanceof Entity) {
156                    $dayOffList->addEntity($entity);
157                }
158            }
159        }
160        return $dayOffList;
161    }
162
163    /**
164     * create dayoff preferences of a department
165     *
166     * @param
167     *            dayoffList,
168     *            year,
169     *            drop
170     *
171     * @return Collection dayoffList
172     */
173    public function writeCommonDayoffsByYear($dayoffList, $year = null, $drop = true)
174    {
175        if ($drop && $year) {
176            static::$commonList = null;
177            $deleteQuery = new Query\DayOff(Query\Base::DELETE);
178            $deleteQuery
179                ->addConditionYear($year)
180                ->addConditionCommon();
181            $this->deleteItem($deleteQuery);
182        }
183        $query = new Query\DayOff(Query\Base::INSERT);
184        foreach ($dayoffList as $dayoff) {
185            $query->addValues(
186                [
187                    'behoerdenid' => 0, //all departments
188                    'Feiertag' => $dayoff['name'],
189                    'Datum' => (new \DateTimeImmutable())->setTimestamp($dayoff['date'])->format('Y-m-d')
190                ]
191            );
192            $this->writeItem($query);
193        }
194
195        $this->removeCache();
196
197        return ($year) ? $this->readCommonByYear($year) : $dayoffList;
198    }
199
200    /**
201     * delete dayoff preferences by time interval
202     *
203     * @param
204     *            deleteInSeconds
205     *
206     * @return boolean
207     */
208    public function deleteByTimeInterval($deleteInSeconds)
209    {
210        $selectQuery = new Query\DayOff(Query\Base::SELECT);
211        $selectQuery
212            ->addEntityMapping()
213            ->addConditionDayoffDeleteInterval($deleteInSeconds);
214        $statement = $this->fetchStatement($selectQuery);
215        while ($dayoffData = $statement->fetch(\PDO::FETCH_ASSOC)) {
216            $dayoffData = (new Query\DayOff(Query\Base::SELECT))->postProcess($dayoffData);
217            $entity = new Entity($dayoffData);
218            if ($entity instanceof Entity) {
219                $deleteQuery = new Query\DayOff(Query\Base::DELETE);
220                $date = (new \DateTimeImmutable())->setTimestamp($entity->date)->format('Y-m-d');
221                $deleteQuery
222                    ->addConditionDate($date)
223                    ->addConditionName($entity->name);
224                $this->deleteItem($deleteQuery);
225            }
226        }
227
228        $this->removeCache();
229    }
230
231    public function deleteEntity($itemId)
232    {
233        $query = new Query\DayOff(Query\Base::DELETE);
234        $query->addConditionDayOffId($itemId);
235
236        $this->removeCache();
237
238        return ($this->deleteItem($query));
239    }
240
241    public function removeCache()
242    {
243        if (!App::$cache) {
244            return;
245        }
246
247        if (App::$cache->has("dayOffs")) {
248            App::$cache->delete("dayOffs");
249        }
250    }
251}