Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
92.25% |
119 / 129 |
|
87.50% |
14 / 16 |
CRAP | |
0.00% |
0 / 1 |
Request | |
92.25% |
119 / 129 |
|
87.50% |
14 / 16 |
36.60 | |
0.00% |
0 / 1 |
readEntity | |
100.00% |
15 / 15 |
|
100.00% |
1 / 1 |
3 | |||
readCollection | |
100.00% |
12 / 12 |
|
100.00% |
1 / 1 |
3 | |||
readRequestByProcessId | |
100.00% |
8 / 8 |
|
100.00% |
1 / 1 |
2 | |||
readRequestsByIds | |
0.00% |
0 / 5 |
|
0.00% |
0 / 1 |
2 | |||
readRequestByArchiveId | |
100.00% |
8 / 8 |
|
100.00% |
1 / 1 |
2 | |||
readListByProvider | |
100.00% |
12 / 12 |
|
100.00% |
1 / 1 |
2 | |||
readListBySource | |
100.00% |
7 / 7 |
|
100.00% |
1 / 1 |
2 | |||
readListByCluster | |
100.00% |
14 / 14 |
|
100.00% |
1 / 1 |
5 | |||
writeEntity | |
100.00% |
15 / 15 |
|
100.00% |
1 / 1 |
2 | |||
writeListBySource | |
100.00% |
4 / 4 |
|
100.00% |
1 / 1 |
2 | |||
writeImportEntity | |
100.00% |
13 / 13 |
|
100.00% |
1 / 1 |
4 | |||
writeDeleteEntity | |
100.00% |
4 / 4 |
|
100.00% |
1 / 1 |
1 | |||
deleteEntitySafe | |
0.00% |
0 / 5 |
|
0.00% |
0 / 1 |
12 | |||
writeDeleteListBySource | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
1 | |||
testSource | |
100.00% |
2 / 2 |
|
100.00% |
1 / 1 |
2 | |||
countInBuergeranliegen | |
100.00% |
2 / 2 |
|
100.00% |
1 / 1 |
1 |
1 | <?php |
2 | |
3 | namespace BO\Zmsdb; |
4 | |
5 | use BO\Zmsentities\Request as Entity; |
6 | use BO\Zmsentities\Collection\RequestList as Collection; |
7 | |
8 | /** |
9 | * |
10 | * @SuppressWarnings(TooManyPublicMethods) |
11 | */ |
12 | class Request extends Base |
13 | { |
14 | public function readEntity($source, $requestId, $resolveReferences = 0) |
15 | { |
16 | $this->testSource($source); |
17 | $query = new Query\Request(Query\Base::SELECT); |
18 | $query |
19 | ->setResolveLevel($resolveReferences) |
20 | ->addEntityMapping() |
21 | ->addResolvedReferences($resolveReferences) |
22 | ->addConditionRequestSource($source) |
23 | ->addConditionRequestId($requestId); |
24 | $request = $this->fetchOne($query, new Entity()); |
25 | if (! $request->hasId()) { |
26 | throw new Exception\Request\RequestNotFound("Could not find request with ID $source/$requestId"); |
27 | } |
28 | $inUseByRel = (new RequestRelation())->countByRequestId($requestId, $source) > 0; |
29 | $inUseByBa = $this->countInBuergeranliegen($requestId) > 0; |
30 | $request['canDelete'] = ! ($inUseByRel || $inUseByBa); |
31 | return $request; |
32 | } |
33 | |
34 | /** |
35 | * @SuppressWarnings(Param) |
36 | * |
37 | */ |
38 | protected function readCollection($query) |
39 | { |
40 | $requestList = new Collection(); |
41 | $statement = $this->fetchStatement($query); |
42 | $requestRelation = new RequestRelation(); |
43 | while ($requestData = $statement->fetch(\PDO::FETCH_ASSOC)) { |
44 | $request = new Entity($query->postProcessJoins($requestData)); |
45 | $source = $request->getSource(); |
46 | $id = $request->getId(); |
47 | $inUseByRel = $requestRelation->countByRequestId($id, $source) > 0; |
48 | $inUseByBa = $this->countInBuergeranliegen($id) > 0; |
49 | $request['canDelete'] = ! ($inUseByRel || $inUseByBa); |
50 | $requestList->addEntity($request); |
51 | } |
52 | return $requestList; |
53 | } |
54 | |
55 | public function readRequestByProcessId($processId, $resolveReferences = 0) |
56 | { |
57 | $collection = new Collection(); |
58 | if ($processId) { |
59 | $query = new Query\Request(Query\Base::SELECT); |
60 | $query->setResolveLevel($resolveReferences); |
61 | $query->addConditionProcessId($processId); |
62 | $query->addEntityMapping(); |
63 | $collection = $this->readCollection($query); |
64 | } |
65 | return $collection; |
66 | } |
67 | |
68 | public function readRequestsByIds($ids, $resolveReferences = 0) |
69 | { |
70 | $query = new Query\Request(Query\Base::SELECT); |
71 | $query->setResolveLevel($resolveReferences); |
72 | $query->addConditionIds($ids); |
73 | $query->addEntityMapping(); |
74 | |
75 | return $this->readCollection($query); |
76 | } |
77 | |
78 | public function readRequestByArchiveId($archiveId, $resolveReferences = 0) |
79 | { |
80 | $collection = new Collection(); |
81 | if ($archiveId) { |
82 | $query = new Query\Request(Query\Base::SELECT); |
83 | $query->setResolveLevel($resolveReferences); |
84 | $query->addConditionArchiveId($archiveId); |
85 | $query->addEntityMapping(); |
86 | $collection = $this->readCollection($query); |
87 | } |
88 | return $collection; |
89 | } |
90 | |
91 | public function readListByProvider($source, $providerId, $resolveReferences = 0) |
92 | { |
93 | $this->testSource($source); |
94 | $query = new Query\Request(Query\Base::SELECT); |
95 | $requestRelationQuery = new RequestRelation(); |
96 | $query->setResolveLevel($resolveReferences); |
97 | $query->addConditionProvider($providerId, $source); |
98 | $query->addConditionRequestSource($source); |
99 | $query->addEntityMapping(); |
100 | $requestList = $this->readCollection($query); |
101 | foreach ($requestList as $request) { |
102 | $requestRelation = $requestRelationQuery->readEntity($request->getId(), $providerId); |
103 | $request['timeSlotCount'] = $requestRelation->getSlotCount(); |
104 | } |
105 | return $requestList; |
106 | } |
107 | |
108 | public function readListBySource($source, $resolveReferences = 0) |
109 | { |
110 | $this->testSource($source); |
111 | $query = new Query\Request(Query\Base::SELECT); |
112 | $query->setResolveLevel($resolveReferences); |
113 | $query->addConditionRequestSource($source); |
114 | $query->addEntityMapping(); |
115 | $requestList = $this->readCollection($query); |
116 | return ($requestList->count()) ? $requestList->sortByCustomKey('id') : $requestList; |
117 | } |
118 | |
119 | public function readListByCluster(\BO\Zmsentities\Cluster $cluster, $resolveReferences = 0) |
120 | { |
121 | $intersectList = array(); |
122 | if ($cluster->scopes->count()) { |
123 | foreach ($cluster->scopes as $scope) { |
124 | $requestsByProvider = $this |
125 | ->readListByProvider( |
126 | $scope->provider['source'], |
127 | $scope->getProviderId(), |
128 | $resolveReferences - 1 |
129 | )->getArrayCopy(); |
130 | if (count($requestsByProvider)) { |
131 | $intersectList = (count($intersectList)) ? |
132 | array_values(array_intersect($intersectList, $requestsByProvider)) : $requestsByProvider; |
133 | } |
134 | } |
135 | } |
136 | $requestList = new Collection($intersectList); |
137 | return $requestList; |
138 | } |
139 | |
140 | public function writeEntity(Entity $entity) |
141 | { |
142 | $additionalData = ($entity->getAdditionalData()) ? json_encode($entity->getAdditionalData()) : '{}'; |
143 | $this->writeDeleteEntity($entity->getId(), $entity->getSource()); |
144 | $query = new Query\Request(Query\Base::INSERT); |
145 | $query->addValues([ |
146 | 'source' => $entity->getSource(), |
147 | 'id' => $entity->getId(), |
148 | 'name' => $entity->getName(), |
149 | 'parent_id' => $entity->getParentId(), |
150 | 'group' => $entity->getGroup(), |
151 | 'link' => $entity->getLink(), |
152 | 'data' => $additionalData, |
153 | 'variant_id' => $entity->getVariantId() |
154 | ]); |
155 | $this->writeItem($query); |
156 | return $this->readEntity($entity->getSource(), $entity->getId()); |
157 | } |
158 | |
159 | public function writeListBySource(\BO\Zmsentities\Source $source) |
160 | { |
161 | $this->writeDeleteListBySource($source->getSource()); |
162 | foreach ($source->getRequestList() as $request) { |
163 | $this->writeEntity($request); |
164 | } |
165 | return $this->readListBySource($source->getSource()); |
166 | } |
167 | |
168 | public function writeImportEntity($request, $source = 'dldb') |
169 | { |
170 | $query = new Query\Request(Query\Base::REPLACE); |
171 | $query->addValues([ |
172 | 'source' => $source, |
173 | 'id' => $request['id'], |
174 | 'name' => $request['name'], |
175 | 'group' => (isset($request['group'])) ? $request['group'] : 'Sonstiges', |
176 | 'link' => ('dldb' == $source) |
177 | ? 'https://service.berlin.de/dienstleistung/' . $request['id'] . '/' |
178 | : ((isset($request['link'])) ? $request['link'] : ''), |
179 | 'data' => json_encode($request) |
180 | ]); |
181 | $this->writeItem($query); |
182 | return $this->readEntity($source, $request['id']); |
183 | } |
184 | |
185 | public function writeDeleteEntity($requestId, $source) |
186 | { |
187 | $query = new Query\Request(Query\Base::DELETE); |
188 | $query->addConditionRequestId($requestId); |
189 | $query->addConditionRequestSource($source); |
190 | return $this->deleteItem($query); |
191 | } |
192 | |
193 | |
194 | public function deleteEntitySafe(string $source, string $requestId): void |
195 | { |
196 | $countInRel = (new \BO\Zmsdb\RequestRelation())->countByRequestId($requestId); |
197 | $countInBa = $this->countInBuergeranliegen($requestId); |
198 | |
199 | if ($countInRel > 0 || $countInBa > 0) { |
200 | throw new Exception\Request\RequestInUse(); |
201 | } |
202 | $this->writeDeleteEntity($requestId, $source); |
203 | } |
204 | |
205 | public function writeDeleteListBySource($source) |
206 | { |
207 | $query = new Query\Request(Query\Base::DELETE); |
208 | $query->addConditionRequestSource($source); |
209 | return $this->deleteItem($query); |
210 | } |
211 | |
212 | protected function testSource($source) |
213 | { |
214 | if (! (new Source())->readEntity($source)) { |
215 | throw new Exception\Source\UnknownDataSource(); |
216 | } |
217 | } |
218 | |
219 | public function countInBuergeranliegen(string $requestId): int |
220 | { |
221 | $sql = (new Query\Request(Query\Base::SELECT))->getQueryCountInBuergeranliegen(); |
222 | return (int) $this->getReader()->fetchValue($sql, ['request_id' => $requestId]); |
223 | } |
224 | } |