Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
98.92% covered (success)
98.92%
92 / 93
90.00% covered (success)
90.00%
9 / 10
CRAP
0.00% covered (danger)
0.00%
0 / 1
Provider
98.92% covered (success)
98.92%
92 / 93
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.15% covered (success)
96.15%
25 / 26
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            'display_name' => $additionalData && isset($additionalData['displayName'])
72                ? $additionalData['displayName']
73                : $entity->getName(),
74            'contact__city' => $contact->getProperty('city'),
75            'contact__country' => $contact->getProperty('country'),
76            'contact__lat' => $contact->getProperty('lat', 0),
77            'contact__lon' => $contact->getProperty('lon', 0),
78            'contact__postalCode' => intval($contact->getProperty('postalCode')),
79            'contact__region' => $contact->getProperty('region'),
80            'contact__street' => $contact->getProperty('street'),
81            'contact__streetNumber' => $contact->getProperty('streetNumber', '-'),
82            'link' =>  ($entity->getLink()) ? $entity->getLink() : '',
83            'data' => ($entity->getAdditionalData()) ? json_encode($entity->getAdditionalData()) : '{}'
84        ]);
85        $this->writeItem($query);
86        return $this->readEntity($entity->getSource(), $entity->getId());
87    }
88
89    public function writeListBySource(\BO\Zmsentities\Source $source)
90    {
91        $this->writeDeleteListBySource($source->getSource());
92        foreach ($source->getProviderList() as $provider) {
93            $this->writeEntity($provider);
94        }
95        return $this->readListBySource($source->getSource());
96    }
97
98    public function writeImportList($providerList, $source = 'dldb')
99    {
100        foreach ($providerList as $provider) {
101            $this->writeImportEntity($provider, $source);
102        }
103        return $this->readListBySource($source, 1);
104    }
105
106    public function writeImportEntity($provider, $source = 'dldb')
107    {
108        if ($provider['address']['postal_code']) {
109            $query = new Query\Provider(Query\Base::REPLACE);
110            $query->addValues([
111                'source' => $source,
112                'id' => $provider['id'],
113                'name' => $provider['name'],
114                'display_name' => $provider['displayName'] ?? $provider['name'],
115                'contact__city' => $provider['address']['city'],
116                'contact__country' => $provider['address']['city'],
117                'contact__lat' => $provider['geo']['lat'],
118                'contact__lon' => $provider['geo']['lon'],
119                'contact__postalCode' => intval($provider['address']['postal_code']),
120                'contact__region' => $provider['address']['city'],
121                'contact__street' => $provider['address']['street'],
122                'contact__streetNumber' => $provider['address']['house_number'],
123                'link' => ('dldb' == $source)
124                    ? 'https://service.berlin.de/standort/' . $provider['id'] . '/'
125                    : ((isset($provider['link'])) ? $provider['link'] : ''),
126                'data' => json_encode($provider)
127            ]);
128            $this->writeItem($query);
129            $provider = $this->readEntity($source, $provider['id']);
130        }
131        return $provider;
132    }
133
134    public function writeDeleteEntity($providerId, $source)
135    {
136        $query = new Query\Provider(Query\Base::DELETE);
137        $query->addConditionProviderId($providerId);
138        $query->addConditionProviderSource($source);
139        return $this->deleteItem($query);
140    }
141
142    public function writeDeleteListBySource($source)
143    {
144        $query = new Query\Provider(Query\Base::DELETE);
145        $query->addConditionProviderSource($source);
146        return $this->deleteItem($query);
147    }
148
149    protected function testSource($source)
150    {
151        if (! (new Source())->readEntity($source)) {
152            throw new Exception\Source\UnknownDataSource();
153        }
154    }
155}