Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
82 / 82
100.00% covered (success)
100.00%
9 / 9
CRAP
100.00% covered (success)
100.00%
1 / 1
RequestRelation
100.00% covered (success)
100.00%
82 / 82
100.00% covered (success)
100.00%
9 / 9
19
100.00% covered (success)
100.00%
1 / 1
 readEntity
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
1
 readListBySource
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
1
 readListByRequestId
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
1
 readListByProviderId
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
1
 writeListBySource
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
1 / 1
6
 writeEntity
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
1
 writeImportList
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
5
 readList
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
2
 writeDeleteListBySource
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace BO\Zmsdb;
4
5use BO\Zmsentities\RequestRelation as Entity;
6use BO\Zmsentities\Collection\RequestRelationList as Collection;
7
8class RequestRelation extends Base
9{
10    public function readEntity($requestId, $providerId, $resolveReferences = 0)
11    {
12        $query = new Query\RequestRelation(Query\Base::SELECT);
13        $query
14            ->setResolveLevel(0)
15            ->addEntityMapping()
16            ->addResolvedReferences($resolveReferences)
17            ->addConditionBookable()
18            ->addConditionProviderId($providerId)
19            ->addConditionRequestId($requestId);
20        return $this->fetchOne($query, new Entity());
21    }
22
23    public function readListBySource($source, $resolveReferences = 0)
24    {
25        $query = new Query\RequestRelation(Query\Base::SELECT);
26        $query
27            ->setResolveLevel(0)
28            ->addEntityMapping()
29            ->addResolvedReferences($resolveReferences)
30            ->addConditionBookable()
31            ->addConditionSource($source);
32        $statement = $this->fetchStatement($query);
33        return $this->readList($statement);
34    }
35
36    public function readListByRequestId($requestId, $source, $resolveReferences = 0)
37    {
38        $query = new Query\RequestRelation(Query\Base::SELECT);
39        $query
40            ->setResolveLevel(0)
41            ->addEntityMapping()
42            ->addResolvedReferences($resolveReferences)
43            ->addConditionRequestId($requestId)
44            ->addConditionBookable()
45            ->addConditionSource($source);
46        $statement = $this->fetchStatement($query);
47        return $this->readList($statement);
48    }
49
50    public function readListByProviderId($providerId, $source, $resolveReferences = 0)
51    {
52        $query = new Query\RequestRelation(Query\Base::SELECT);
53        $query
54            ->setResolveLevel(0)
55            ->addEntityMapping()
56            ->addResolvedReferences($resolveReferences)
57            ->addConditionProviderId($providerId)
58            ->addConditionBookable()
59            ->addConditionSource($source);
60        $statement = $this->fetchStatement($query);
61        return $this->readList($statement);
62    }
63
64    public function writeListBySource(\BO\Zmsentities\Source $source)
65    {
66        if ($source->getRequestRelationList()->count()) {
67            foreach ($source->getRequestRelationList() as $entity) {
68                $this->writeEntity($entity);
69            }
70        } elseif ($source->isCompleteAndEditable()) {
71            foreach ($source->getProviderList() as $provider) {
72                foreach ($source->getRequestList() as $request) {
73                    $entity = new Entity([
74                        'source' => $source->getSource(),
75                        'provider' => $provider,
76                        'request' => $request,
77                        'slots' => 1
78                    ]);
79                    $this->writeEntity($entity);
80                }
81            }
82        }
83
84        return $this->readListBySource($source->getSource());
85    }
86
87    public function writeEntity(Entity $entity)
88    {
89        $query = new Query\RequestRelation(Query\Base::REPLACE);
90        $query->addValues([
91            'source' => $entity->getSource(),
92            'provider__id' => $entity->getProvider()->getId(),
93            'request__id' => $entity->getRequest()->getId(),
94            'slots' => $entity->getSlotCount()
95        ]);
96        $this->writeItem($query);
97        return $this->readEntity($entity->getRequest()->getId(), $entity->getProvider()->getId());
98    }
99
100    public function writeImportList($providerList, $source = 'dldb')
101    {
102        foreach ($providerList as $provider) {
103            // Do not import locations without address
104            if ($provider['address']['postal_code']) {
105                foreach ($provider['services'] as $reference) {
106                    $query = new Query\RequestRelation(Query\Base::REPLACE);
107                    $query->addValues([
108                        'source' => $source,
109                        'provider__id' => $provider['id'],
110                        'request__id' => $reference['service'],
111                        'slots' => $reference['appointment']['slots'],
112                        'bookable' => ($reference['appointment']['allowed'] ? 1 : 0)
113                    ]);
114                    $this->writeItem($query);
115                }
116            }
117        }
118        return $this->readListBySource($source);
119    }
120
121    protected function readList($statement)
122    {
123        $collection = new Collection();
124        while ($requestRelationData = $statement->fetch(\PDO::FETCH_ASSOC)) {
125            $entity = new Entity($requestRelationData);
126            $collection->addEntity($entity);
127        }
128        return $collection;
129    }
130
131    public function writeDeleteListBySource($source)
132    {
133        $query = new Query\RequestRelation(Query\Base::DELETE);
134        $query->addConditionSource($source);
135        return $this->deleteItem($query);
136    }
137}