Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
84.27% covered (warning)
84.27%
75 / 89
81.82% covered (warning)
81.82%
9 / 11
CRAP
0.00% covered (danger)
0.00%
0 / 1
Index
84.27% covered (warning)
84.27%
75 / 89
81.82% covered (warning)
81.82%
9 / 11
32.27
0.00% covered (danger)
0.00%
0 / 1
 readResponse
100.00% covered (success)
100.00%
44 / 44
100.00% covered (success)
100.00%
1 / 1
3
 getDefaultTemplate
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 getLanguageConfig
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 getCurrentLanguage
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
2
 getQueryStringWithLang
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 getTranslations
18.75% covered (danger)
18.75%
3 / 16
0.00% covered (danger)
0.00%
0 / 1
42.33
 getAvailableLanguages
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 getDepartment
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 shouldRedirectToScope
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
 hasDisabledButton
75.00% covered (warning)
75.00%
3 / 4
0.00% covered (danger)
0.00%
0 / 1
4.25
 getQueryString
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
4
1<?php
2
3/**
4 *
5 * @package Zmsticketprinter
6 * @copyright BerlinOnline Stadtportal GmbH & Co. KG
7 *
8 */
9
10namespace BO\Zmsticketprinter;
11
12use BO\Mellon\Unvalidated;
13use BO\Mellon\Valid;
14use BO\Mellon\Validator;
15use BO\Slim\Render;
16use Psr\Http\Message\RequestInterface;
17use Psr\Http\Message\ResponseInterface;
18
19class Index extends BaseController
20{
21    /**
22     * @SuppressWarnings(UnusedFormalParameter)
23     * @return ResponseInterface
24     */
25    #[\Override]
26    public function readResponse(RequestInterface $request, ResponseInterface $response, array $args)
27    {
28        Helper\HomeUrl::create($request);
29
30        $validator = $request->getAttribute('validator');
31        $defaultTemplate = $this->getDefaultTemplate($validator);
32        $languageConfig = $this->getLanguageConfig($validator);
33
34        $currentLang = $this->getCurrentLanguage($validator, $languageConfig);
35        $queryString = $this->getQueryStringWithLang();
36
37        $translations = $this->getTranslations($languageConfig, $currentLang);
38        $defaultLanguage = $languageConfig['defaultLanguage'] ?? 'de';
39        $languages = $this->getAvailableLanguages($languageConfig);
40
41        $ticketprinterHelper = new Helper\Ticketprinter($args, $request);
42        $ticketprinter = $ticketprinterHelper->getEntity();
43
44        $ticketprinter->testValid();
45        $scope = $ticketprinter->getScopeList()->getFirst();
46        $department = $this->getDepartment($scope);
47        $organisation = $ticketprinterHelper->getOrganisation();
48
49        if ($this->shouldRedirectToScope($ticketprinter)) {
50            return Render::redirect(
51                'TicketprinterByScope',
52                ['scopeId' => $ticketprinter->buttons[0]['scope']['id']],
53                $this->getQueryString($validator, $ticketprinter, $defaultTemplate)
54            );
55        }
56
57        $template = (new Helper\TemplateFinder($defaultTemplate->getValue()))
58            ->setCustomizedTemplate($ticketprinter, $organisation);
59
60        return Render::withHtml(
61            $response,
62            $template->getTemplate(),
63            [
64                'debug' => \App::DEBUG,
65                'refreshInSeconds' => 30,
66                'urlQueryString' => $queryString,
67                'currentLang' => $currentLang,
68                'enabled' => $ticketprinter->isEnabled()
69                    || !$organisation->getPreference('ticketPrinterActivation'),
70                'title' => 'Wartennumer ziehen',
71                'ticketprinter' => $ticketprinter,
72                'organisation' => $organisation,
73                'department' => $department,
74                'buttonDisplay' => $template->getButtonTemplateType($ticketprinter),
75                'defaultLanguage' => $defaultLanguage,
76                'languages' => $languages,
77                'translations' => $translations,
78                'hasDisabledButton' => $this->hasDisabledButton($ticketprinter)
79            ]
80        );
81    }
82
83    private function getDefaultTemplate($validator)
84    {
85        return $validator->getParameter("template")
86            ->isPath()
87            ->setDefault('default');
88    }
89
90    private function getLanguageConfig($validator)
91    {
92        $config = $validator->getParameter("config")
93            ->isString()
94            ->getValue();
95
96        $decoded = base64_decode(str_replace(' ', '+', $config ?? ''));
97
98        return json_decode($decoded, true);
99    }
100
101    private function getCurrentLanguage($validator, $languageConfig)
102    {
103        $lang = $validator->getParameter("lang")->isString()->getValue();
104
105        return $lang ?: ($languageConfig['defaultLanguage'] ?? 'de');
106    }
107
108    private function getQueryStringWithLang(): string
109    {
110        $queryString = $_SERVER['QUERY_STRING'] ?? '';
111        if (!strpos($queryString, 'lang=')) {
112            $queryString .= '&lang=de';
113        }
114        return str_replace('/&', '', $queryString);
115    }
116
117    /**
118     * @return ((mixed|null|string)[]|mixed|string)[]
119     *
120     */
121    private function getTranslations($languageConfig, $currentLang): array
122    {
123        $translations = ['printText' => ''];
124
125        if (!$languageConfig || empty($languageConfig['languages'])) {
126            return $translations;
127        }
128
129        foreach ($languageConfig['languages'] as $language) {
130            if (($language['language'] ?? null) !== $currentLang) {
131                continue;
132            }
133
134            if (!empty($language['services'])) {
135                foreach ($language['services'] as $requestId => $serviceData) {
136                    $translations[$requestId] = [
137                        'label' => $serviceData['label'] ?? null,
138                        'customText1' => $serviceData['customText1'] ?? '',
139                        'customText2' => $serviceData['customText2'] ?? '',
140                    ];
141                }
142            }
143        }
144
145        if ($currentLang === 'de') {
146            $translations['printText'] = $languageConfig['defaultPrintText'] ?? '';
147        }
148
149        return $translations;
150    }
151
152    private function getAvailableLanguages($languageConfig): array
153    {
154        return array_values(array_unique(
155            array_column($languageConfig['languages'] ?? [], 'language')
156        ));
157    }
158
159    private function getDepartment($scope)
160    {
161        return \App::$http->readGetResult('/scope/' . $scope->id . '/department/')->getEntity();
162    }
163
164    private function shouldRedirectToScope(\BO\Zmsentities\Ticketprinter $ticketprinter): bool
165    {
166        return count($ticketprinter->buttons) === 1 && $ticketprinter->buttons[0]['type'] === 'scope';
167    }
168
169    private function hasDisabledButton(\BO\Zmsentities\Ticketprinter $ticketprinter): bool
170    {
171        foreach ($ticketprinter->buttons as $button) {
172            if (!isset($button['enabled']) || $button['enabled'] != 1) {
173                return true;
174            }
175        }
176        return false;
177    }
178
179    protected function getQueryString($validator, \BO\Zmsentities\Ticketprinter $ticketprinter, $defaultTemplate): array
180    {
181        $query = ($defaultTemplate->getValue() === 'default') ? [] : ['template' => $defaultTemplate->getValue()];
182        if (isset($ticketprinter['home'])) {
183            $homeUrl = $validator::value($ticketprinter['home'])->isUrl()->getValue();
184            if ($homeUrl) {
185                $query['ticketprinter[home]'] = $homeUrl;
186            }
187        }
188        return $query;
189    }
190}