Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
61.64% covered (warning)
61.64%
98 / 159
70.00% covered (warning)
70.00%
14 / 20
CRAP
0.00% covered (danger)
0.00%
0 / 1
Useraccount
61.64% covered (warning)
61.64%
98 / 159
70.00% covered (warning)
70.00%
14 / 20
178.10
0.00% covered (danger)
0.00%
0 / 1
 readIsUserExisting
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
3
 readEntity
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
1
 readResolvedReferences
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
3
 readList
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
3
 readListStatement
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
6
 readAssignedDepartmentList
100.00% covered (success)
100.00%
12 / 12
100.00% covered (success)
100.00%
1 / 1
4
 readEntityByAuthKey
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
2
 readEntityByUserId
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
2
 readCollectionByDepartmentId
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
3
 readCollectionByDepartmentIds
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
30
 writeEntity
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
2
 writeUpdatedEntity
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
1
 deleteEntity
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 updateAssignedDepartments
100.00% covered (success)
100.00%
12 / 12
100.00% covered (success)
100.00%
1 / 1
3
 readEntityIdByLoginName
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 deleteAssignedDepartments
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 readSearch
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
12
 readSearchByDepartmentId
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
12
 readListRole
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
6
 readListByRoleAndDepartment
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2
3namespace BO\Zmsdb;
4
5use BO\Zmsentities\Useraccount as Entity;
6use BO\Zmsentities\Collection\UseraccountList as Collection;
7
8/**
9 * @SuppressWarnings(Public)
10 *
11 */
12class Useraccount extends Base
13{
14    public function readIsUserExisting($loginName, $password = false)
15    {
16        $query = new Query\Useraccount(Query\Base::SELECT);
17        $query->addEntityMapping()
18            ->setResolveLevel(0)
19            ->addConditionLoginName($loginName);
20        if ($password) {
21            $query->addConditionPassword($password);
22        }
23        $useraccount = $this->fetchOne($query, new Entity());
24        return ($useraccount->hasId()) ? true : false;
25    }
26
27    public function readEntity($loginname, $resolveReferences = 1)
28    {
29        $query = new Query\Useraccount(Query\Base::SELECT);
30        $query->addEntityMapping()
31            ->addResolvedReferences($resolveReferences)
32            ->addConditionLoginName($loginname);
33        $useraccount = $this->fetchOne($query, new Entity());
34        return $this->readResolvedReferences($useraccount, $resolveReferences);
35    }
36
37    public function readResolvedReferences(\BO\Zmsentities\Schema\Entity $useraccount, $resolveReferences)
38    {
39        if (0 < $resolveReferences && $useraccount->toProperty()->id->get()) {
40            $useraccount->departments = $this->readAssignedDepartmentList($useraccount, $resolveReferences);
41        }
42        return $useraccount;
43    }
44
45    /**
46     * read list of useraccounts
47     *
48     * @param
49     *            resolveReferences
50     *
51     * @return Resource Collection
52     */
53    public function readList($resolveReferences = 0)
54    {
55        $collection = new Collection();
56        $query = new Query\Useraccount(Query\Base::SELECT);
57        $query->addResolvedReferences($resolveReferences)
58            ->addEntityMapping();
59        $result = $this->fetchList($query, new Entity());
60        if (count($result)) {
61            foreach ($result as $entity) {
62                $collection->addEntity($this->readResolvedReferences($entity, $resolveReferences));
63            }
64        }
65        return $collection;
66    }
67
68    protected function readListStatement($statement, $resolveReferences)
69    {
70        $query = new Query\Useraccount(Query\Base::SELECT);
71        $collection = new Collection();
72        while ($userAccountData = $statement->fetch(\PDO::FETCH_ASSOC)) {
73            $entity = new Entity($query->postProcessJoins($userAccountData));
74            $entity = $this->readResolvedReferences($entity, $resolveReferences);
75            $collection->addEntity($entity);
76        }
77        return $collection;
78    }
79
80    /**
81     * read list assigned departments
82     *
83     * @param
84     *            resolveReferences
85     *
86     * @return Resource Collection
87     */
88    public function readAssignedDepartmentList($useraccount, $resolveReferences = 0)
89    {
90        if ($useraccount->isSuperUser()) {
91            $query = Query\Useraccount::QUERY_READ_SUPERUSER_DEPARTMENTS;
92            $departmentIds = $this->getReader()->fetchAll($query);
93        } else {
94            $query = Query\Useraccount::QUERY_READ_ASSIGNED_DEPARTMENTS;
95            $departmentIds = $this->getReader()->fetchAll($query, ['useraccountName' => $useraccount->id]);
96        }
97        $departmentList = new \BO\Zmsentities\Collection\DepartmentList();
98        foreach ($departmentIds as $item) {
99            $department = (new \BO\Zmsdb\Department())->readEntity($item['id'], $resolveReferences);
100            if ($department instanceof \BO\Zmsentities\Department) {
101                $department->name = $item['organisation__name'] . ' -> ' . $department->name;
102                $departmentList->addEntity($department);
103            }
104        }
105        return $departmentList;
106    }
107
108    public function readEntityByAuthKey($xAuthKey, $resolveReferences = 0)
109    {
110        $hashedAuthKey = hash('sha256', $xAuthKey);
111        $query = new Query\Useraccount(Query\Base::SELECT);
112        $query->addEntityMapping()
113            ->addResolvedReferences($resolveReferences)
114            ->addConditionXauthKey($hashedAuthKey);
115        $entity = ($hashedAuthKey) ? $this->fetchOne($query, new Entity()) : new Entity();
116        return $this->readResolvedReferences($entity, $resolveReferences);
117    }
118
119    public function readEntityByUserId($userId, $resolveReferences = 0)
120    {
121        $query = new Query\Useraccount(Query\Base::SELECT);
122        $query->addEntityMapping()
123            ->addResolvedReferences($resolveReferences)
124            ->addConditionUserId($userId);
125        $entity = ($userId) ? $this->fetchOne($query, new Entity()) : new Entity();
126        return $this->readResolvedReferences($entity, $resolveReferences);
127    }
128
129    public function readCollectionByDepartmentId($departmentId, $resolveReferences = 0)
130    {
131        $collection = new Collection();
132        $query = new Query\Useraccount(Query\Base::SELECT);
133        $query->addResolvedReferences($resolveReferences)
134            ->addConditionDepartmentId($departmentId)
135            ->addEntityMapping();
136        $result = $this->fetchList($query, new Entity());
137        if (count($result)) {
138            foreach ($result as $entity) {
139                $collection->addEntity($this->readResolvedReferences($entity, $resolveReferences));
140            }
141        }
142        return $collection;
143    }
144
145    public function readCollectionByDepartmentIds($departmentIds, $resolveReferences = 0)
146    {
147        $collection = new Collection();
148        $query = new Query\Useraccount(Query\Base::SELECT);
149        $query->addResolvedReferences($resolveReferences)
150            ->addConditionDepartmentIds($departmentIds)
151            ->addEntityMapping();
152        $result = $this->fetchList($query, new Entity());
153        if (count($result)) {
154            foreach ($result as $entity) {
155                if (0 < $resolveReferences && $entity->toProperty()->id->get()) {
156                    $entity->departments = $this->readAssignedDepartmentList(
157                        $entity,
158                        $resolveReferences - 1
159                    );
160                }
161                $collection->addEntity($entity);
162            }
163        }
164        return $collection;
165    }
166
167    /**
168     * write an useraccount
169     *
170     * @param
171     *            entity
172     *
173     * @return Entity
174     */
175    public function writeEntity(\BO\Zmsentities\Useraccount $entity, $resolveReferences = 0)
176    {
177        if ($this->readIsUserExisting($entity->id)) {
178            throw new Exception\Useraccount\DuplicateEntry();
179        }
180        $query = new Query\Useraccount(Query\Base::INSERT);
181        $values = $query->reverseEntityMapping($entity);
182        $query->addValues($values);
183        $this->writeItem($query);
184        $this->updateAssignedDepartments($entity);
185        return $this->readEntity($entity->getId(), $resolveReferences);
186    }
187
188    /**
189     * update a useraccount
190     *
191     * @param
192     *            useraccountId
193     *
194     * @return Entity
195     */
196    public function writeUpdatedEntity($loginName, \BO\Zmsentities\Useraccount $entity, $resolveReferences = 0)
197    {
198        $query = new Query\Useraccount(Query\Base::UPDATE);
199        $query->addConditionLoginName($loginName);
200        $values = $query->reverseEntityMapping($entity);
201        $query->addValues($values);
202        $this->writeItem($query);
203        $this->updateAssignedDepartments($entity);
204        return $this->readEntity($entity->getId(), $resolveReferences);
205    }
206
207    /**
208     * remove an user
209     *
210     * @param
211     *            itemId
212     *
213     * @return Resource Status
214     */
215    public function deleteEntity($loginName)
216    {
217        $query = new Query\Useraccount(Query\Base::DELETE);
218        $query->addConditionLoginName($loginName);
219        $this->deleteAssignedDepartments($loginName);
220        return $this->deleteItem($query);
221    }
222
223    protected function updateAssignedDepartments($entity)
224    {
225        $loginName = $entity->id;
226        if (!$entity->isSuperUser()) {
227            $this->deleteAssignedDepartments($loginName);
228            $userId = $this->readEntityIdByLoginName($loginName);
229            foreach ($entity->departments as $department) {
230                $this->perform(
231                    Query\Useraccount::QUERY_WRITE_ASSIGNED_DEPARTMENTS,
232                    array(
233                        $userId,
234                        $department['id']
235                    )
236                );
237            }
238        }
239    }
240
241    protected function readEntityIdByLoginName($loginName)
242    {
243        $query = Query\Useraccount::QUERY_READ_ID_BY_USERNAME;
244        $result = $this->getReader()->fetchOne($query, [$loginName]);
245        return $result['id'];
246    }
247
248    protected function deleteAssignedDepartments($loginName)
249    {
250        $query = Query\Useraccount::QUERY_DELETE_ASSIGNED_DEPARTMENTS;
251        $userId = $this->readEntityIdByLoginName($loginName);
252        return $this->perform($query, [$userId]);
253    }
254
255    public function readSearch(array $parameter, $resolveReferences = 0)
256    {
257        $query = new Query\Useraccount(Query\Base::SELECT);
258        $query
259            ->addResolvedReferences($resolveReferences)
260            ->addEntityMapping();
261
262        if (isset($parameter['query'])) {
263            if (preg_match('#^\d+$#', $parameter['query'])) {
264                $query->addConditionUserId($parameter['query']);
265                $query->addConditionSearch($parameter['query'], true);
266            } else {
267                $query->addConditionSearch($parameter['query']);
268            }
269            unset($parameter['query']);
270        }
271
272        $statement = $this->fetchStatement($query);
273        return $this->readListStatement($statement, $resolveReferences);
274    }
275
276    public function readSearchByDepartmentId($departmentId, array $parameter, $resolveReferences = 0)
277    {
278        $query = new Query\Useraccount(Query\Base::SELECT);
279        $query->addResolvedReferences($resolveReferences)
280            ->addEntityMapping();
281
282        if (isset($parameter['query'])) {
283            if (preg_match('#^\d+$#', $parameter['query'])) {
284                $query->addConditionUserId($parameter['query']);
285                $query->addConditionDepartmentAndSearch($departmentId, $parameter['query'], true);
286            } else {
287                $query->addConditionDepartmentAndSearch($departmentId, $parameter['query']);
288            }
289            unset($parameter['query']);
290        } else {
291            $query->addConditionDepartmentId($departmentId);
292        }
293
294        $statement = $this->fetchStatement($query);
295        return $this->readListStatement($statement, $resolveReferences);
296    }
297
298    public function readListRole($roleLevel, $resolveReferences = 0)
299    {
300        $query = new Query\Useraccount(Query\Base::SELECT);
301        $query->addResolvedReferences($resolveReferences)
302            ->addEntityMapping();
303
304        if (isset($roleLevel)) {
305            $query->addConditionRoleLevel($roleLevel);
306        }
307
308        $statement = $this->fetchStatement($query);
309        return $this->readListStatement($statement, $resolveReferences);
310    }
311
312    public function readListByRoleAndDepartment($roleLevel, $departmentId, $resolveReferences = 0)
313    {
314        $query = new Query\Useraccount(Query\Base::SELECT);
315        $query->addResolvedReferences($resolveReferences)
316              ->addEntityMapping();
317
318        if (isset($roleLevel) && isset($departmentId)) {
319            $query->addConditionRoleLevel($roleLevel);
320            $query->addConditionDepartmentId($departmentId);
321        }
322
323        $statement = $this->fetchStatement($query);
324        return $this->readListStatement($statement, $resolveReferences);
325    }
326}