Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
92.25% covered (success)
92.25%
119 / 129
87.50% covered (warning)
87.50%
14 / 16
CRAP
0.00% covered (danger)
0.00%
0 / 1
Request
92.25% covered (success)
92.25%
119 / 129
87.50% covered (warning)
87.50%
14 / 16
36.60
0.00% covered (danger)
0.00%
0 / 1
 readEntity
100.00% covered (success)
100.00%
15 / 15
100.00% covered (success)
100.00%
1 / 1
3
 readCollection
100.00% covered (success)
100.00%
12 / 12
100.00% covered (success)
100.00%
1 / 1
3
 readRequestByProcessId
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
2
 readRequestsByIds
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 readRequestByArchiveId
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
2
 readListByProvider
100.00% covered (success)
100.00%
12 / 12
100.00% covered (success)
100.00%
1 / 1
2
 readListBySource
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
2
 readListByCluster
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
1 / 1
5
 writeEntity
100.00% covered (success)
100.00%
15 / 15
100.00% covered (success)
100.00%
1 / 1
2
 writeListBySource
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 writeImportEntity
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
4
 writeDeleteEntity
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 deleteEntitySafe
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
12
 writeDeleteListBySource
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 testSource
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
2
 countInBuergeranliegen
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace BO\Zmsdb;
4
5use BO\Zmsentities\Request as Entity;
6use BO\Zmsentities\Collection\RequestList as Collection;
7
8/**
9 *
10 * @SuppressWarnings(TooManyPublicMethods)
11 */
12class 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}