Lines
96.99%
129 / 133
Functions and Methods
33.33%
1 / 3
Classes and Traits
0.00%
0 / 1
| Name | Lines | Functions and Methods | CRAP | Classes and Traits | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| ReportCapacityIndex | 96.99% | 129 / 133 | 33.33% | 1 / 3 | 16 | 0.00% | 0 / 1 | |||
| readResponse | 96.51% | 83 / 86 | 0.00% | 0 / 1 | 11 | |||||
| handleDownloadRequest | 95.23% | 20 / 21 | 0.00% | 0 / 1 | 4 | |||||
| renderHtmlResponse | 100.00% | 26 / 26 | 100.00% | 1 / 1 | 1 | |||||
| 1 | <?php | |
| 2 | ||
| 3 | /** | |
| 4 | * @package Zmsstatistic | |
| 5 | * @copyright BerlinOnline Stadtportal GmbH & Co. KG | |
| 6 | **/ | |
| 7 | ||
| 8 | namespace BO\Zmsstatistic; | |
| 9 | ||
| 10 | use BO\Slim\Render; | |
| 11 | use BO\Zmsentities\Exchange; | |
| 12 | use BO\Zmsstatistic\Helper\ReportHelper; | |
| 13 | use BO\Zmsstatistic\Service\ReportCapacityService; | |
| 14 | use Psr\Http\Message\RequestInterface; | |
| 15 | use Psr\Http\Message\ResponseInterface; | |
| 16 | ||
| 17 | class ReportCapacityIndex extends BaseController | |
| 18 | { | |
| 19 | protected int $resolveLevel = 2; | |
| 20 | ||
| 21 | /** | |
| 22 | * @SuppressWarnings(Param) | |
| 23 | * @return ResponseInterface | |
| 24 | */ | |
| 25 | #[\Override] | |
| 26 | public function readResponse( | |
| 27 | RequestInterface $request, | |
| 28 | ResponseInterface $response, | |
| 29 | array $args | |
| 30 | ): mixed { | |
| 31 | $this->workstation->getUseraccount()->testPermissions(['statistic', 'capacityreport']); | |
| 32 | ||
| 33 | /** @var \Psr\Http\Message\ServerRequestInterface $request */ | |
| 34 | $validator = $request->getAttribute('validator'); | |
| 35 | $reportCapacityService = new ReportCapacityService(); | |
| 36 | $reportHelper = new ReportHelper(); | |
| 37 | ||
| 38 | $selectedScopes = $reportHelper->extractSelectedScopes( | |
| 39 | $validator->getParameter('scopes')->isArray()->getValue() ?? [] | |
| 40 | ); | |
| 41 | ||
| 42 | $workstationScopeId = $reportHelper->getWorkstationScopeId($this->workstation); | |
| 43 | $scopeId = $reportHelper->resolveScopeIdParam($selectedScopes, $workstationScopeId); | |
| 44 | ||
| 45 | $capacityPeriod = $workstationScopeId !== null | |
| 46 | ? $reportCapacityService->getCapacityPeriod((string) $workstationScopeId) | |
| 47 | : null; | |
| 48 | $scopeDateBounds = $reportCapacityService->getScopeDateBoundsByScopeId(); | |
| 49 | ||
| 50 | $dateRange = $reportHelper->extractDateRange( | |
| 51 | $validator->getParameter('from')->isString()->getValue(), | |
| 52 | $validator->getParameter('to')->isString()->getValue() | |
| 53 | ); | |
| 54 | ||
| 55 | $fetchedCapacity = $reportCapacityService->getExchangeCapacityData($scopeId, $dateRange, $args); | |
| 56 | $exchangeCapacityDaily = null; | |
| 57 | $exchangeCapacityChartDaily = null; | |
| 58 | $exchangeCapacityChartSparseDaily = null; | |
| 59 | $exchangeCapacityHourly = null; | |
| 60 | $exchangeCapacityChartHourly = null; | |
| 61 | $exchangeCapacityChartSparseHourly = null; | |
| 62 | $displayExchanges = null; | |
| 63 | ||
| 64 | if ($fetchedCapacity instanceof Exchange) { | |
| 65 | $period = $args['period'] ?? null; | |
| 66 | $displayExchanges = $reportCapacityService->buildCapacityDisplayExchanges( | |
| 67 | $fetchedCapacity, | |
| 68 | $dateRange, | |
| 69 | $period | |
| 70 | ); | |
| 71 | $exchangeCapacityDaily = $displayExchanges['dailyTable']; | |
| 72 | $exchangeCapacityChartSparseDaily = $displayExchanges['dailyChartSparse']; | |
| 73 | $exchangeCapacityChartDaily = $displayExchanges['dailyChartFull']; | |
| 74 | $exchangeCapacityHourly = $displayExchanges['hourlyTable']; | |
| 75 | $exchangeCapacityChartSparseHourly = $displayExchanges['hourlyChartSparse']; | |
| 76 | $exchangeCapacityChartHourly = $displayExchanges['hourlyChartFull']; | |
| 77 | } | |
| 78 | ||
| 79 | $type = $validator->getParameter('type')->isString()->getValue(); | |
| 80 | if ($type) { | |
| 81 | $granularity = $validator->getParameter('granularity')->isString()->getValue(); | |
| 82 | $timeline = $validator->getParameter('timeline')->isString()->getValue(); | |
| 83 | $downloadExchange = is_array($displayExchanges) | |
| 84 | ? $reportCapacityService->selectDownloadExchange( | |
| 85 | $displayExchanges, | |
| 86 | $granularity, | |
| 87 | $timeline | |
| 88 | ) | |
| 89 | : null; | |
| 90 | ||
| 91 | return $this->handleDownloadRequest( | |
| 92 | $request, | |
| 93 | $response, | |
| 94 | $args, | |
| 95 | $scopeId, | |
| 96 | $downloadExchange, | |
| 97 | $dateRange, | |
| 98 | $selectedScopes, | |
| 99 | $reportCapacityService | |
| 100 | ); | |
| 101 | } | |
| 102 | ||
| 103 | $displayScopeIds = $selectedScopes; | |
| 104 | if ($displayScopeIds === [] && $workstationScopeId !== null) { | |
| 105 | $displayScopeIds = [(string) $workstationScopeId]; | |
| 106 | } | |
| 107 | $scopeSlotTimes = []; | |
| 108 | $visualization = $fetchedCapacity instanceof Exchange | |
| 109 | ? ($fetchedCapacity['visualization'] ?? null) | |
| 110 | : null; | |
| 111 | if (is_array($visualization) && is_array($visualization['scopeSlotTimes'] ?? null)) { | |
| 112 | $scopeSlotTimes = $visualization['scopeSlotTimes']; | |
| 113 | } | |
| 114 | if ($scopeSlotTimes === []) { | |
| 115 | $scopeSlotTimes = $reportCapacityService->getSelectedScopeSlotTimes($displayScopeIds); | |
| 116 | } | |
| 117 | $scopeSlotTimeHint = $reportCapacityService->formatScopeSlotTimeHint($scopeSlotTimes); | |
| 118 | ||
| 119 | return $this->renderHtmlResponse( | |
| 120 | $response, | |
| 121 | $args, | |
| 122 | $capacityPeriod, | |
| 123 | $dateRange, | |
| 124 | $exchangeCapacityDaily, | |
| 125 | $exchangeCapacityChartDaily, | |
| 126 | $exchangeCapacityChartSparseDaily, | |
| 127 | $selectedScopes, | |
| 128 | $scopeDateBounds, | |
| 129 | $scopeSlotTimeHint, | |
| 130 | $exchangeCapacityHourly, | |
| 131 | $exchangeCapacityChartHourly, | |
| 132 | $exchangeCapacityChartSparseHourly | |
| 133 | ); | |
| 134 | } | |
| 135 | ||
| 136 | private function handleDownloadRequest( | |
| 137 | RequestInterface $request, | |
| 138 | ResponseInterface $response, | |
| 139 | array $args, | |
| 140 | string $scopeId, | |
| 141 | mixed $downloadExchange, | |
| 142 | ?array $dateRange, | |
| 143 | array $selectedScopes = [], | |
| 144 | ?ReportCapacityService $reportCapacityService = null | |
| 145 | ): ResponseInterface { | |
| 146 | if ($reportCapacityService === null) { | |
| 147 | $reportCapacityService = new ReportCapacityService(); | |
| 148 | } | |
| 149 | ||
| 150 | /** @var \Psr\Http\Message\ServerRequestInterface $request */ | |
| 151 | $validator = $request->getAttribute('validator'); | |
| 152 | $valueMode = $validator->getParameter('valueMode')->isString()->getValue(); | |
| 153 | $valueMode = $valueMode === 'minutes' ? 'minutes' : 'slots'; | |
| 154 | $channelMode = $validator->getParameter('channelMode')->isString()->getValue(); | |
| 155 | $channelMode = in_array($channelMode, ['total', 'public', 'intern_only'], true) | |
| 156 | ? $channelMode | |
| 157 | : 'total'; | |
| 158 | ||
| 159 | $args = $reportCapacityService->prepareDownloadArgs( | |
| 160 | $args, | |
| 161 | $scopeId, | |
| 162 | $downloadExchange, | |
| 163 | $dateRange, | |
| 164 | $selectedScopes, | |
| 165 | $valueMode, | |
| 166 | $channelMode | |
| 167 | ); | |
| 168 | ||
| 169 | /** @var mixed $container */ | |
| 170 | $container = \App::$slim->getContainer(); | |
| 171 | return (new Download\CapacityReport($container)) | |
| 172 | ->readResponse($request, $response, $args); | |
| 173 | } | |
| 174 | ||
| 175 | private function renderHtmlResponse( | |
| 176 | ResponseInterface $response, | |
| 177 | array $args, | |
| 178 | mixed $capacityPeriod, | |
| 179 | array|null $dateRange, | |
| 180 | mixed $exchangeCapacityDaily, | |
| 181 | Exchange|null $exchangeCapacityChartDaily, | |
| 182 | Exchange|null $exchangeCapacityChartSparseDaily, | |
| 183 | array $selectedScopes = [], | |
| 184 | array $scopeDateBounds = [], | |
| 185 | ?string $scopeSlotTimeHint = null, | |
| 186 | Exchange|null $exchangeCapacityHourly = null, | |
| 187 | Exchange|null $exchangeCapacityChartHourly = null, | |
| 188 | Exchange|null $exchangeCapacityChartSparseHourly = null | |
| 189 | ): ResponseInterface { | |
| 190 | return Render::withHtml( | |
| 191 | $response, | |
| 192 | 'page/reportCapacityIndex.twig', | |
| 193 | [ | |
| 194 | 'title' => 'Terminkapazität Standort', | |
| 195 | 'activeScope' => 'active', | |
| 196 | 'menuActive' => 'capacity', | |
| 197 | 'department' => $this->department, | |
| 198 | 'organisation' => $this->organisation, | |
| 199 | 'capacityPeriod' => $capacityPeriod, | |
| 200 | 'scopeDateBounds' => $scopeDateBounds, | |
| 201 | 'showAll' => 1, | |
| 202 | 'period' => $args['period'] ?? null, | |
| 203 | 'dateRange' => $dateRange, | |
| 204 | 'exchangeCapacityDaily' => $exchangeCapacityDaily, | |
| 205 | 'exchangeCapacityChartDaily' => $exchangeCapacityChartDaily, | |
| 206 | 'exchangeCapacityChartSparseDaily' => $exchangeCapacityChartSparseDaily, | |
| 207 | 'exchangeCapacityHourly' => $exchangeCapacityHourly, | |
| 208 | 'exchangeCapacityChartHourly' => $exchangeCapacityChartHourly, | |
| 209 | 'exchangeCapacityChartSparseHourly' => $exchangeCapacityChartSparseHourly, | |
| 210 | 'source' => ['entity' => 'CapacityIndex'], | |
| 211 | 'selectedScopeIds' => $selectedScopes, | |
| 212 | 'scopeSlotTimeHint' => $scopeSlotTimeHint, | |
| 213 | 'workstation' => $this->workstation->getArrayCopy(), | |
| 214 | ] | |
| 215 | ); | |
| 216 | } | |
| 217 | } |