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