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