Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
90.00% covered (success)
90.00%
72 / 80
81.82% covered (warning)
81.82%
9 / 11
CRAP
0.00% covered (danger)
0.00%
0 / 1
Index
90.00% covered (success)
90.00%
72 / 80
81.82% covered (warning)
81.82%
9 / 11
27.73
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%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getQueryStringWithLang
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 getTranslations
30.00% covered (danger)
30.00%
3 / 10
0.00% covered (danger)
0.00%
0 / 1
23.81
 getAvailableLanguages
100.00% covered (success)
100.00%
1 / 1
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);
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('ticketPrinterProtectionEnabled'),
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    // TODO: Remove unused config request - https://github.com/it-at-m/eappointment/issues/1807
87    /*private function getConfig()
88    {
89        return \App::$http->readGetResult('/config/', [], \App::SECURE_TOKEN)->getEntity();
90    }*/
91
92    private function getDefaultTemplate($validator)
93    {
94        return $validator->getParameter("template")
95            ->isPath()
96            ->setDefault('default');
97    }
98
99    private function getLanguageConfig($validator)
100    {
101        $config = $validator->getParameter("config")
102            ->isString()
103            ->getValue();
104
105        $decoded = base64_decode(str_replace(' ', '+', $config ?? ''));
106
107        return json_decode($decoded, true);
108    }
109
110    private function getCurrentLanguage($validator)
111    {
112        return $validator->getParameter("lang")->isString()->getValue();
113    }
114
115    private function getQueryStringWithLang()
116    {
117        $queryString = $_SERVER['QUERY_STRING'] ?? '';
118        if (!strpos($queryString, 'lang=')) {
119            $queryString .= '&lang=de';
120        }
121        return str_replace('/&', '', $queryString ?? '');
122    }
123
124    private function getTranslations($languageConfig, $currentLang)
125    {
126        $translations = ['printText' => ''];
127        if ($languageConfig) {
128            foreach ($languageConfig['languages'] as $language) {
129                if ($language['language'] !== $currentLang) {
130                    continue;
131                }
132                foreach ($language['translations'] as $requestId => $translation) {
133                    $translations[$requestId] = $translation;
134                }
135            }
136            if (empty($currentLang) || $currentLang === 'de') {
137                $translations['printText'] = $languageConfig['defaultPrintText'] ?? '';
138            }
139        }
140        return $translations;
141    }
142
143    private function getAvailableLanguages($languageConfig)
144    {
145        return array_column($languageConfig['languages'] ?? [], 'language');
146    }
147
148    private function getDepartment($scope)
149    {
150        return \App::$http->readGetResult('/scope/' . $scope->id . '/department/')->getEntity();
151    }
152
153    private function shouldRedirectToScope($ticketprinter)
154    {
155        return count($ticketprinter->buttons) === 1 && $ticketprinter->buttons[0]['type'] === 'scope';
156    }
157
158    private function hasDisabledButton($ticketprinter)
159    {
160        foreach ($ticketprinter->buttons as $button) {
161            if (!isset($button['enabled']) || $button['enabled'] != 1) {
162                return true;
163            }
164        }
165        return false;
166    }
167
168    /**
169     * @param Validator $validator
170     * @param Ticketprinter $ticketprinter
171     * @param Unvalidated|Valid $defaultTemplate
172     * @return array
173     */
174    protected function getQueryString($validator, $ticketprinter, $defaultTemplate)
175    {
176        $query = ($defaultTemplate->getValue() === 'default') ? [] : ['template' => $defaultTemplate->getValue()];
177        if (isset($ticketprinter['home'])) {
178            $homeUrl = $validator::value($ticketprinter['home'])->isUrl()->getValue();
179            if ($homeUrl) {
180                $query['ticketprinter[home]'] = $homeUrl;
181            }
182        }
183        return $query;
184    }
185}