Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
64.79% covered (warning)
64.79%
46 / 71
55.56% covered (warning)
55.56%
5 / 9
CRAP
0.00% covered (danger)
0.00%
0 / 1
Service
64.79% covered (warning)
64.79%
46 / 71
55.56% covered (warning)
55.56%
5 / 9
62.23
0.00% covered (danger)
0.00%
0 / 1
 parseData
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
3
 searchAll
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
30
 fetchList
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
2
 fetchListRelated
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
12
 fetchCombinations
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 fetchLocationCsv
85.71% covered (warning)
85.71%
6 / 7
0.00% covered (danger)
0.00%
0 / 1
2.01
 fetchFromCsv
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
4
 fetchListFromTopic
93.75% covered (success)
93.75%
15 / 16
0.00% covered (danger)
0.00%
0 / 1
7.01
 readSearchResultList
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3/**
4 * @package 115Mandant
5 * @copyright BerlinOnline Stadtportal GmbH & Co. KG
6 **/
7
8namespace BO\Zmsdldb\File;
9
10use BO\Zmsdldb\Entity\Service as Entity;
11use BO\Zmsdldb\Collection\Services as Collection;
12
13/**
14 * Common methods shared by access classes
15 */
16class Service extends Base
17{
18    /**
19     * @return Collection
20     */
21    #[\Override]
22    protected function parseData($data)
23    {
24        $itemList = new Collection();
25        foreach ($data['data'] as $item) {
26            $service = new Entity($item);
27            if ($service->isLocale($this->locale)) {
28                $itemList[$item['id']] = $service;
29            }
30        }
31        return $itemList;
32    }
33
34    /**
35     *
36     * @SuppressWarnings(Param)
37     * @return Collection
38     * @psalm-api
39     */
40    public function searchAll($querystring, $service_csv = false, $location_csv = false)
41    {
42        $serviceList = $this->fetchList($location_csv);
43        if ($querystring) {
44            $serviceList = new Collection(array_filter((array) $serviceList, function ($item) use ($querystring) {
45                $length = (3 < strlen($querystring)) ? strlen($querystring) : 3;
46                $nameMatch = preg_match('/[' . $querystring . ']{' . $length . ',}/i', $item['name']);
47                $keywordMatch = preg_match('/[' . $querystring . ']{' . $length . ',}/i', $item['meta']['keywords']);
48                return ($nameMatch || $keywordMatch);
49            }));
50        }
51        $serviceList = $serviceList->sortByName();
52        return ($location_csv) ? $serviceList->containsLocation($location_csv) : $serviceList;
53    }
54
55    /**
56     * @return Collection
57     *
58     * @param false|string $location_csv
59     */
60    public function fetchList(string|false $location_csv = false)
61    {
62        #echo '<pre>' . print_r($this,1) . '</pre>';exit;
63        $servicelist = $this->getItemList();
64        if ($location_csv) {
65            $servicelist = new Collection(array_filter((array) $servicelist, function ($item) use ($location_csv) {
66                $service = new Entity($item);
67                return $service->containsLocation($location_csv);
68            }));
69        }
70        return $servicelist;
71    }
72
73    /**
74     *
75     * @return Collection
76     * @psalm-api
77     */
78    public function fetchListRelated($service_id)
79    {
80        $service = $this->fetchId($service_id);
81        $serviceList = $this->getItemList();
82
83        $relatedList = new Collection(
84            array_filter(
85                (array) $serviceList,
86                function ($item) use ($service) {
87                    $leikaIdentItem = substr(strval($item['leika']), 0, 11);
88                    $leikaIdentService = substr(strval($service['leika']), 0, 11);
89                    return ($leikaIdentItem == $leikaIdentService && $item['id'] != $service['id']);
90                }
91            )
92        );
93        return ($relatedList) ? $relatedList : new Collection();
94    }
95
96    /**
97     *
98     * @return Collection
99     */
100    public function fetchCombinations($service_csv)
101    {
102        return $this->fetchList($this->fetchLocationCsv($service_csv));
103    }
104
105    /**
106     *
107     * @return string
108     */
109    protected function fetchLocationCsv($service_csv)
110    {
111        $locationlist = $this->access()
112            ->fromLocation()
113            ->fetchList($service_csv);
114        $locationIdList = array();
115        foreach ($locationlist as $location) {
116            $locationIdList[] = $location['id'];
117        }
118        return implode(',', $locationIdList);
119    }
120
121    /**
122     *
123     * @return Collection
124     */
125    public function fetchFromCsv(string $service_csv)
126    {
127        $servicelist = new Collection();
128        foreach (explode(',', $service_csv) as $service_id) {
129            $service = $this->fetchId($service_id);
130            if ($service && $service->isLocale($this->locale)) {
131                $servicelist[$service_id] = $service;
132            }
133        }
134        return $servicelist;
135    }
136
137    /**
138     * Return services by topic
139     * If topic is root, include sub-services
140     * root_topic in realations not usable because of multiple roots for one service
141     *
142     * @return Collection
143     * @psalm-api
144     */
145    public function fetchListFromTopic(\BO\Zmsdldb\Entity\Topic $topic)
146    {
147        $itemlist = new Collection();
148        $serviceIds = array();
149        if ($topic) {
150            $serviceIds = $topic->getServiceIds();
151            if ($topic['relation']['navi'] && isset($topic['relation']['childs'])) {
152                foreach ($topic['relation']['childs'] as $child) {
153                    $childtopic = $this->access()
154                        ->fromTopic()
155                        ->fetchPath($child['path']);
156                    if ($childtopic) {
157                        $serviceIds = array_merge($serviceIds, $childtopic->getServiceIds());
158                    }
159                }
160            }
161        }
162        if (count($serviceIds)) {
163            $servicelistCSV = implode(',', $serviceIds);
164            $servicelist = $this->fetchFromCsv($servicelistCSV);
165            return $servicelist;
166        }
167        return $itemlist->sortByName();
168    }
169
170    /**
171     *
172     * @return Collection
173     * @psalm-api
174     */
175    public function readSearchResultList($query, $service_csv = '')
176    {
177        $servicelist = $this->fetchCombinations($service_csv);
178        $servicelist = new Collection(array_filter((array) $servicelist, function ($item) use ($query) {
179            return false !== strpos($item['name'], $query);
180        }));
181        return $servicelist;
182    }
183}