Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
98.94% covered (success)
98.94%
93 / 94
90.00% covered (success)
90.00%
9 / 10
CRAP
0.00% covered (danger)
0.00%
0 / 1
Provider
98.94% covered (success)
98.94%
93 / 94
90.00% covered (success)
90.00%
9 / 10
25
0.00% covered (danger)
0.00%
0 / 1
 readEntity
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
1
 readCollection
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
2
 readListBySource
100.00% covered (success)
100.00%
12 / 12
100.00% covered (success)
100.00%
1 / 1
4
 writeEntity
96.30% covered (success)
96.30%
26 / 27
0.00% covered (danger)
0.00%
0 / 1
6
 writeListBySource
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 writeImportList
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
 writeImportEntity
100.00% covered (success)
100.00%
23 / 23
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\Provider as Entity;
6use BO\Zmsentities\Collection\ProviderList as Collection;
7
8class Provider extends Base
9{
10    public function readEntity($source, $providerId, $resolveReferences = 0)
11    {
12        $this->testSource($source);
13        $query = new Query\Provider(Query\Base::SELECT);
14        $query
15            ->setResolveLevel($resolveReferences)
16            ->addEntityMapping()
17            ->addResolvedReferences($resolveReferences)
18            ->addConditionProviderSource($source)
19            ->addConditionProviderId($providerId);
20        $provider = $this->fetchOne($query, new Entity());
21        return $provider;
22    }
23
24    /**
25     * @SuppressWarnings(Param)
26     *
27     */
28    protected function readCollection($query)
29    {
30        $providerList = new Collection();
31        $statement = $this->fetchStatement($query);
32        while ($providerData = $statement->fetch(\PDO::FETCH_ASSOC)) {
33            $entity = new Entity($query->postProcessJoins($providerData));
34            $providerList->addEntity($entity);
35        }
36        return $providerList;
37    }
38
39    public function readListBySource($source, $resolveReferences = 0, $isAssigned = null, $requestIdCsv = null)
40    {
41        $this->testSource($source);
42        $query = new Query\Provider(Query\Base::SELECT);
43        $query->setDistinctSelect();
44        $query->setResolveLevel($resolveReferences);
45        $query->addEntityMapping();
46        $query->addConditionProviderSource($source);
47        if (null !== $isAssigned) {
48            $query->addConditionIsAssigned($isAssigned);
49        }
50        if (null !== $requestIdCsv) {
51            $query->addConditionRequestCsv($requestIdCsv, $source);
52        }
53        $providerList = $this->readCollection($query);
54        return ($providerList->count()) ? $providerList->sortById() : $providerList;
55    }
56
57    public function writeEntity(Entity $entity)
58    {
59        $this->writeDeleteEntity($entity->getId(), $entity->getSource());
60        $contact =  $entity->getContact();
61        if (! $contact->count()) {
62            throw new Exception\Provider\ProviderContactMissed();
63        }
64        $query = new Query\Provider(Query\Base::INSERT);
65        $additionalData = $entity->getAdditionalData() ?? [];
66
67        $query->addValues([
68            'source' => $entity->getSource(),
69            'id' => $entity->getId(),
70            'name' => $entity->getName(),
71            'parent_id' => $entity->getParentId(),
72            'display_name' => $additionalData && isset($additionalData['displayName'])
73                ? $additionalData['displayName']
74                : $entity->getName(),
75            'contact__city' => $contact->getProperty('city'),
76            'contact__country' => $contact->getProperty('country'),
77            'contact__lat' => $contact->getProperty('lat', 0),
78            'contact__lon' => $contact->getProperty('lon', 0),
79            'contact__postalCode' => intval($contact->getProperty('postalCode')),
80            'contact__region' => $contact->getProperty('region'),
81            'contact__street' => $contact->getProperty('street'),
82            'contact__streetNumber' => $contact->getProperty('streetNumber', '-'),
83            'link' =>  ($entity->getLink()) ? $entity->getLink() : '',
84            'data' => ($entity->getAdditionalData()) ? json_encode($entity->getAdditionalData()) : '{}'
85        ]);
86        $this->writeItem($query);
87        return $this->readEntity($entity->getSource(), $entity->getId());
88    }
89
90    public function writeListBySource(\BO\Zmsentities\Source $source)
91    {
92        $this->writeDeleteListBySource($source->getSource());
93        foreach ($source->getProviderList() as $provider) {
94            $this->writeEntity($provider);
95        }
96        return $this->readListBySource($source->getSource());
97    }
98
99    public function writeImportList($providerList, $source = 'dldb')
100    {
101        foreach ($providerList as $provider) {
102            $this->writeImportEntity($provider, $source);
103        }
104        return $this->readListBySource($source, 1);
105    }
106
107    public function writeImportEntity($provider, $source = 'dldb')
108    {
109        if ($provider['address']['postal_code']) {
110            $query = new Query\Provider(Query\Base::REPLACE);
111            $query->addValues([
112                'source' => $source,
113                'id' => $provider['id'],
114                'name' => $provider['name'],
115                'display_name' => $provider['displayName'] ?? $provider['name'],
116                'contact__city' => $provider['address']['city'],
117                'contact__country' => $provider['address']['city'],
118                'contact__lat' => $provider['geo']['lat'],
119                'contact__lon' => $provider['geo']['lon'],
120                'contact__postalCode' => intval($provider['address']['postal_code']),
121                'contact__region' => $provider['address']['city'],
122                'contact__street' => $provider['address']['street'],
123                'contact__streetNumber' => $provider['address']['house_number'],
124                'link' => ('dldb' == $source)
125                    ? 'https://service.berlin.de/standort/' . $provider['id'] . '/'
126                    : ((isset($provider['link'])) ? $provider['link'] : ''),
127                'data' => json_encode($provider)
128            ]);
129            $this->writeItem($query);
130            $provider = $this->readEntity($source, $provider['id']);
131        }
132        return $provider;
133    }
134
135    public function writeDeleteEntity($providerId, $source)
136    {
137        $query = new Query\Provider(Query\Base::DELETE);
138        $query->addConditionProviderId($providerId);
139        $query->addConditionProviderSource($source);
140        return $this->deleteItem($query);
141    }
142
143    public function writeDeleteListBySource($source)
144    {
145        $query = new Query\Provider(Query\Base::DELETE);
146        $query->addConditionProviderSource($source);
147        return $this->deleteItem($query);
148    }
149
150    protected function testSource($source)
151    {
152        if (! (new Source())->readEntity($source)) {
153            throw new Exception\Source\UnknownDataSource();
154        }
155    }
156}