Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
67.83% covered (warning)
67.83%
97 / 143
73.68% covered (warning)
73.68%
14 / 19
CRAP
0.00% covered (danger)
0.00%
0 / 1
Useraccount
67.83% covered (warning)
67.83%
97 / 143
73.68% covered (warning)
73.68%
14 / 19
104.55
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%
6 / 6
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
 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            // TODO subtract -1 from resolveReference, but check calling functions!
41            $useraccount->departments = $this->readAssignedDepartmentList($useraccount, $resolveReferences);
42        }
43        return $useraccount;
44    }
45
46    /**
47     * read list of useraccounts
48     *
49     * @param
50     *            resolveReferences
51     *
52     * @return Resource Collection
53     */
54    public function readList($resolveReferences = 0)
55    {
56        $collection = new Collection();
57        $query = new Query\Useraccount(Query\Base::SELECT);
58        $query->addResolvedReferences($resolveReferences)
59            ->addEntityMapping();
60        $result = $this->fetchList($query, new Entity());
61        if (count($result)) {
62            foreach ($result as $entity) {
63                $collection->addEntity($this->readResolvedReferences($entity, $resolveReferences));
64            }
65        }
66        return $collection;
67    }
68
69    protected function readListStatement($statement, $resolveReferences)
70    {
71        $query = new Query\Useraccount(Query\Base::SELECT);
72        $collection = new Collection();
73        while ($userAccountData = $statement->fetch(\PDO::FETCH_ASSOC)) {
74            $entity = new Entity($query->postProcessJoins($userAccountData));
75            $entity = $this->readResolvedReferences($entity, $resolveReferences);
76            $collection->addEntity($entity);
77        }
78        return $collection;
79    }
80
81    /**
82     * read list assigned departments
83     *
84     * @param
85     *            resolveReferences
86     *
87     * @return Resource Collection
88     */
89    public function readAssignedDepartmentList($useraccount, $resolveReferences = 0)
90    {
91        if ($useraccount->isSuperUser()) {
92            $query = Query\Useraccount::QUERY_READ_SUPERUSER_DEPARTMENTS;
93            $departmentIds = $this->getReader()->fetchAll($query);
94        } else {
95            $query = Query\Useraccount::QUERY_READ_ASSIGNED_DEPARTMENTS;
96            $departmentIds = $this->getReader()->fetchAll($query, ['useraccountName' => $useraccount->id]);
97        }
98        $departmentList = new \BO\Zmsentities\Collection\DepartmentList();
99        foreach ($departmentIds as $item) {
100            $department = (new \BO\Zmsdb\Department())->readEntity($item['id'], $resolveReferences);
101            if ($department instanceof \BO\Zmsentities\Department) {
102                $department->name = $item['organisation__name'] . ' -> ' . $department->name;
103                $departmentList->addEntity($department);
104            }
105        }
106        return $departmentList;
107    }
108
109    public function readEntityByAuthKey($xAuthKey, $resolveReferences = 0)
110    {
111        $query = new Query\Useraccount(Query\Base::SELECT);
112        $query->addEntityMapping()
113            ->addResolvedReferences($resolveReferences)
114            ->addConditionXauthKey($xAuthKey);
115        $entity = ($xAuthKey) ? $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    /**
146     * write an useraccount
147     *
148     * @param
149     *            entity
150     *
151     * @return Entity
152     */
153    public function writeEntity(\BO\Zmsentities\Useraccount $entity, $resolveReferences = 0)
154    {
155        if ($this->readIsUserExisting($entity->id)) {
156            throw new Exception\Useraccount\DuplicateEntry();
157        }
158        $query = new Query\Useraccount(Query\Base::INSERT);
159        $values = $query->reverseEntityMapping($entity);
160        $query->addValues($values);
161        $this->writeItem($query);
162        $this->updateAssignedDepartments($entity);
163        return $this->readEntity($entity->getId(), $resolveReferences);
164    }
165
166    /**
167     * update a useraccount
168     *
169     * @param
170     *            useraccountId
171     *
172     * @return Entity
173     */
174    public function writeUpdatedEntity($loginName, \BO\Zmsentities\Useraccount $entity, $resolveReferences = 0)
175    {
176        $query = new Query\Useraccount(Query\Base::UPDATE);
177        $query->addConditionLoginName($loginName);
178        $values = $query->reverseEntityMapping($entity);
179        $query->addValues($values);
180        $this->writeItem($query);
181        $this->updateAssignedDepartments($entity);
182        return $this->readEntity($entity->getId(), $resolveReferences);
183    }
184
185    /**
186     * remove an user
187     *
188     * @param
189     *            itemId
190     *
191     * @return Resource Status
192     */
193    public function deleteEntity($loginName)
194    {
195        $query = new Query\Useraccount(Query\Base::DELETE);
196        $query->addConditionLoginName($loginName);
197        $this->deleteAssignedDepartments($loginName);
198        return $this->deleteItem($query);
199    }
200
201    protected function updateAssignedDepartments($entity)
202    {
203        $loginName = $entity->id;
204        if (!$entity->isSuperUser()) {
205            $this->deleteAssignedDepartments($loginName);
206            $userId = $this->readEntityIdByLoginName($loginName);
207            foreach ($entity->departments as $department) {
208                $this->perform(
209                    Query\Useraccount::QUERY_WRITE_ASSIGNED_DEPARTMENTS,
210                    array(
211                        $userId,
212                        $department['id']
213                    )
214                );
215            }
216        }
217    }
218
219    protected function readEntityIdByLoginName($loginName)
220    {
221        $query = Query\Useraccount::QUERY_READ_ID_BY_USERNAME;
222        $result = $this->getReader()->fetchOne($query, [$loginName]);
223        return $result['id'];
224    }
225
226    protected function deleteAssignedDepartments($loginName)
227    {
228        $query = Query\Useraccount::QUERY_DELETE_ASSIGNED_DEPARTMENTS;
229        $userId = $this->readEntityIdByLoginName($loginName);
230        return $this->perform($query, [$userId]);
231    }
232
233    public function readSearch(array $parameter, $resolveReferences = 0)
234    {
235        $query = new Query\Useraccount(Query\Base::SELECT);
236        $query
237            ->addResolvedReferences($resolveReferences)
238            ->addEntityMapping();
239
240        if (isset($parameter['query'])) {
241            if (preg_match('#^\d+$#', $parameter['query'])) {
242                $query->addConditionUserId($parameter['query']);
243                $query->addConditionSearch($parameter['query'], true);
244            } else {
245                $query->addConditionSearch($parameter['query']);
246            }
247            unset($parameter['query']);
248        }
249
250        $statement = $this->fetchStatement($query);
251        return $this->readListStatement($statement, $resolveReferences);
252    }
253
254    public function readSearchByDepartmentId($departmentId, array $parameter, $resolveReferences = 0)
255    {
256        $query = new Query\Useraccount(Query\Base::SELECT);
257        $query->addResolvedReferences($resolveReferences)
258            ->addEntityMapping();
259
260        if (isset($parameter['query'])) {
261            if (preg_match('#^\d+$#', $parameter['query'])) {
262                $query->addConditionUserId($parameter['query']);
263                $query->addConditionDepartmentAndSearch($departmentId, $parameter['query'], true);
264            } else {
265                $query->addConditionDepartmentAndSearch($departmentId, $parameter['query']);
266            }
267            unset($parameter['query']);
268        } else {
269            $query->addConditionDepartmentId($departmentId);
270        }
271
272        $statement = $this->fetchStatement($query);
273        return $this->readListStatement($statement, $resolveReferences);
274    }
275
276    public function readListRole($roleLevel, $resolveReferences = 0)
277    {
278        $query = new Query\Useraccount(Query\Base::SELECT);
279        $query->addResolvedReferences($resolveReferences)
280            ->addEntityMapping();
281
282        if (isset($roleLevel)) {
283            $query->addConditionRoleLevel($roleLevel);
284        }
285
286        $statement = $this->fetchStatement($query);
287        return $this->readListStatement($statement, $resolveReferences);
288    }
289
290    public function readListByRoleAndDepartment($roleLevel, $departmentId, $resolveReferences = 0)
291    {
292        $query = new Query\Useraccount(Query\Base::SELECT);
293        $query->addResolvedReferences($resolveReferences)
294              ->addEntityMapping();
295
296        if (isset($roleLevel) && isset($departmentId)) {
297            $query->addConditionRoleLevel($roleLevel);
298            $query->addConditionDepartmentId($departmentId);
299        }
300
301        $statement = $this->fetchStatement($query);
302        return $this->readListStatement($statement, $resolveReferences);
303    }
304}