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
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()
109    {
110        $queryString = $_SERVER['QUERY_STRING'] ?? '';
111        if (!strpos($queryString, 'lang=')) {
112            $queryString .= '&lang=de';
113        }
114        return str_replace('/&', '', $queryString ?? '');
115    }
116
117    private function getTranslations($languageConfig, $currentLang)
118    {
119        $translations = ['printText' => ''];
120
121        if (!$languageConfig || empty($languageConfig['languages'])) {
122            return $translations;
123        }
124
125        foreach ($languageConfig['languages'] as $language) {
126            if (($language['language'] ?? null) !== $currentLang) {
127                continue;
128            }
129
130            if (!empty($language['services'])) {
131                foreach ($language['services'] as $requestId => $serviceData) {
132                    $translations[$requestId] = [
133                        'label' => $serviceData['label'] ?? null,
134                        'customText1' => $serviceData['customText1'] ?? '',
135                        'customText2' => $serviceData['customText2'] ?? '',
136                    ];
137                }
138            }
139        }
140
141        if ($currentLang === 'de') {
142            $translations['printText'] = $languageConfig['defaultPrintText'] ?? '';
143        }
144
145        return $translations;
146    }
147
148    private function getAvailableLanguages($languageConfig)
149    {
150        return array_values(array_unique(
151            array_column($languageConfig['languages'] ?? [], 'language')
152        ));
153    }
154
155    private function getDepartment($scope)
156    {
157        return \App::$http->readGetResult('/scope/' . $scope->id . '/department/')->getEntity();
158    }
159
160    private function shouldRedirectToScope($ticketprinter)
161    {
162        return count($ticketprinter->buttons) === 1 && $ticketprinter->buttons[0]['type'] === 'scope';
163    }
164
165    private function hasDisabledButton($ticketprinter)
166    {
167        foreach ($ticketprinter->buttons as $button) {
168            if (!isset($button['enabled']) || $button['enabled'] != 1) {
169                return true;
170            }
171        }
172        return false;
173    }
174
175    /**
176     * @param Validator $validator
177     * @param Ticketprinter $ticketprinter
178     * @param Unvalidated|Valid $defaultTemplate
179     * @return array
180     */
181    protected function getQueryString($validator, $ticketprinter, $defaultTemplate)
182    {
183        $query = ($defaultTemplate->getValue() === 'default') ? [] : ['template' => $defaultTemplate->getValue()];
184        if (isset($ticketprinter['home'])) {
185            $homeUrl = $validator::value($ticketprinter['home'])->isUrl()->getValue();
186            if ($homeUrl) {
187                $query['ticketprinter[home]'] = $homeUrl;
188            }
189        }
190        return $query;
191    }
192}