Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
111 / 111
100.00% covered (success)
100.00%
14 / 14
CRAP
100.00% covered (success)
100.00%
1 / 1
Request
100.00% covered (success)
100.00%
111 / 111
100.00% covered (success)
100.00%
14 / 14
30
100.00% covered (success)
100.00%
1 / 1
 readEntity
100.00% covered (success)
100.00%
12 / 12
100.00% covered (success)
100.00%
1 / 1
2
 readCollection
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
2
 readRequestByProcessId
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
2
 readRequestsByIds
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 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%
13 / 13
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
 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
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        return $request;
29    }
30
31    /**
32     * @SuppressWarnings(Param)
33     *
34     */
35    protected function readCollection($query)
36    {
37        $requestList = new Collection();
38        $statement = $this->fetchStatement($query);
39        while ($requestData = $statement->fetch(\PDO::FETCH_ASSOC)) {
40            $request = new Entity($query->postProcessJoins($requestData));
41            $requestList->addEntity($request);
42        }
43        return $requestList;
44    }
45
46    public function readRequestByProcessId($processId, $resolveReferences = 0)
47    {
48        $collection = new Collection();
49        if ($processId) {
50            $query = new Query\Request(Query\Base::SELECT);
51            $query->setResolveLevel($resolveReferences);
52            $query->addConditionProcessId($processId);
53            $query->addEntityMapping();
54            $collection = $this->readCollection($query);
55        }
56        return $collection;
57    }
58
59    public function readRequestsByIds($ids, $resolveReferences = 0)
60    {
61        $query = new Query\Request(Query\Base::SELECT);
62        $query->setResolveLevel($resolveReferences);
63        $query->addConditionIds($ids);
64        $query->addEntityMapping();
65
66        return $this->readCollection($query);
67    }
68
69    public function readRequestByArchiveId($archiveId, $resolveReferences = 0)
70    {
71        $collection = new Collection();
72        if ($archiveId) {
73            $query = new Query\Request(Query\Base::SELECT);
74            $query->setResolveLevel($resolveReferences);
75            $query->addConditionArchiveId($archiveId);
76            $query->addEntityMapping();
77            $collection = $this->readCollection($query);
78        }
79        return $collection;
80    }
81
82    public function readListByProvider($source, $providerId, $resolveReferences = 0)
83    {
84        $this->testSource($source);
85        $query = new Query\Request(Query\Base::SELECT);
86        $requestRelationQuery = new RequestRelation();
87        $query->setResolveLevel($resolveReferences);
88        $query->addConditionProvider($providerId, $source);
89        $query->addConditionRequestSource($source);
90        $query->addEntityMapping();
91        $requestList = $this->readCollection($query);
92        foreach ($requestList as $request) {
93            $requestRelation = $requestRelationQuery->readEntity($request->getId(), $providerId);
94            $request['timeSlotCount'] = $requestRelation->getSlotCount();
95        }
96        return $requestList;
97    }
98
99    public function readListBySource($source, $resolveReferences = 0)
100    {
101        $this->testSource($source);
102        $query = new Query\Request(Query\Base::SELECT);
103        $query->setResolveLevel($resolveReferences);
104        $query->addConditionRequestSource($source);
105        $query->addEntityMapping();
106        $requestList = $this->readCollection($query);
107        return ($requestList->count()) ? $requestList->sortByCustomKey('id') : $requestList;
108    }
109
110    public function readListByCluster(\BO\Zmsentities\Cluster $cluster, $resolveReferences = 0)
111    {
112        $intersectList = array();
113        if ($cluster->scopes->count()) {
114            foreach ($cluster->scopes as $scope) {
115                $requestsByProvider = $this
116                    ->readListByProvider(
117                        $scope->provider['source'],
118                        $scope->getProviderId(),
119                        $resolveReferences - 1
120                    )->getArrayCopy();
121                if (count($requestsByProvider)) {
122                    $intersectList = (count($intersectList)) ?
123                        array_values(array_intersect($intersectList, $requestsByProvider)) : $requestsByProvider;
124                }
125            }
126        }
127        $requestList = new Collection($intersectList);
128        return $requestList;
129    }
130
131    public function writeEntity(Entity $entity)
132    {
133        $additionalData = ($entity->getAdditionalData()) ? json_encode($entity->getAdditionalData()) : '{}';
134        $this->writeDeleteEntity($entity->getId(), $entity->getSource());
135        $query = new Query\Request(Query\Base::INSERT);
136        $query->addValues([
137            'source' => $entity->getSource(),
138            'id' => $entity->getId(),
139            'name' => $entity->getName(),
140            'group' => $entity->getGroup(),
141            'link' =>  $entity->getLink(),
142            'data' => $additionalData
143        ]);
144        $this->writeItem($query);
145        return $this->readEntity($entity->getSource(), $entity->getId());
146    }
147
148    public function writeListBySource(\BO\Zmsentities\Source $source)
149    {
150        $this->writeDeleteListBySource($source->getSource());
151        foreach ($source->getRequestList() as $request) {
152            $this->writeEntity($request);
153        }
154        return $this->readListBySource($source->getSource());
155    }
156
157    public function writeImportEntity($request, $source = 'dldb')
158    {
159        $query = new Query\Request(Query\Base::REPLACE);
160        $query->addValues([
161            'source' => $source,
162            'id' => $request['id'],
163            'name' => $request['name'],
164            'group' => (isset($request['group'])) ? $request['group'] : 'Sonstiges',
165            'link' => ('dldb' == $source)
166                ? 'https://service.berlin.de/dienstleistung/' . $request['id'] . '/'
167                : ((isset($request['link'])) ? $request['link'] : ''),
168            'data' => json_encode($request)
169        ]);
170        $this->writeItem($query);
171        return $this->readEntity($source, $request['id']);
172    }
173
174    public function writeDeleteEntity($requestId, $source)
175    {
176        $query = new Query\Request(Query\Base::DELETE);
177        $query->addConditionRequestId($requestId);
178        $query->addConditionRequestSource($source);
179        return $this->deleteItem($query);
180    }
181
182    public function writeDeleteListBySource($source)
183    {
184        $query = new Query\Request(Query\Base::DELETE);
185        $query->addConditionRequestSource($source);
186        return $this->deleteItem($query);
187    }
188
189    protected function testSource($source)
190    {
191        if (! (new Source())->readEntity($source)) {
192            throw new Exception\Source\UnknownDataSource();
193        }
194    }
195}