Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
100.00% |
69 / 69 |
|
100.00% |
5 / 5 |
CRAP | |
100.00% |
1 / 1 |
WaitingReport | |
100.00% |
69 / 69 |
|
100.00% |
5 / 5 |
20 | |
100.00% |
1 / 1 |
readResponse | |
100.00% |
8 / 8 |
|
100.00% |
1 / 1 |
3 | |||
writeWaitingReport | |
100.00% |
6 / 6 |
|
100.00% |
1 / 1 |
2 | |||
writeHeader | |
100.00% |
9 / 9 |
|
100.00% |
1 / 1 |
3 | |||
writeTotals | |
100.00% |
24 / 24 |
|
100.00% |
1 / 1 |
3 | |||
writeReportPart | |
100.00% |
22 / 22 |
|
100.00% |
1 / 1 |
9 |
1 | <?php |
2 | |
3 | /** |
4 | * @package zmsstatistic |
5 | * @copyright BerlinOnline Stadtportal GmbH & Co. KG |
6 | **/ |
7 | |
8 | namespace BO\Zmsstatistic\Download; |
9 | |
10 | use BO\Zmsentities\Exchange as ReportEntity; |
11 | use BO\Zmsstatistic\Helper\Download; |
12 | use BO\Zmsstatistic\Helper\ReportHelper; |
13 | use PhpOffice\PhpSpreadsheet\Spreadsheet; |
14 | use Psr\Http\Message\RequestInterface; |
15 | use Psr\Http\Message\ResponseInterface; |
16 | |
17 | class WaitingReport extends Base |
18 | { |
19 | protected $reportParts = [ |
20 | 'waitingcount' => 'Wartende Spontankunden', |
21 | 'waitingtime' => 'Durchschnittliche Wartezeit in Min. (Spontankunden)', |
22 | 'waitingcount_termin' => 'Wartende Terminkunden', |
23 | 'waitingtime_termin' => 'Durchschnittliche Wartezeit in Min. (Terminkunden)', |
24 | 'waytime' => 'Durchschnittliche Wegezeit in Min. (Spontankunden)', |
25 | 'waytime_termin' => 'Durchschnittliche Wegezeit in Min. (Terminkunden)', |
26 | ]; |
27 | |
28 | /** |
29 | * @SuppressWarnings(Param) |
30 | * @return ResponseInterface |
31 | */ |
32 | public function readResponse( |
33 | RequestInterface $request, |
34 | ResponseInterface $response, |
35 | array $args |
36 | ) { |
37 | $title = 'waitingstatistic_' . $args['period']; |
38 | $download = (new Download($request))->setSpreadSheet($title); |
39 | |
40 | $this->writeInfoHeader($args, $download->getSpreadSheet()); |
41 | foreach ($args['reports'] as $report) { |
42 | if ('month' == $report->period) { |
43 | $this->writeWaitingReport($report, $download->getSpreadSheet(), 'yyyy', 'MMMM'); |
44 | } else { |
45 | $this->writeWaitingReport($report, $download->getSpreadSheet()); |
46 | } |
47 | } |
48 | |
49 | return $download->writeDownload($response); |
50 | } |
51 | |
52 | public function writeWaitingReport( |
53 | ReportEntity $report, |
54 | Spreadsheet $spreadsheet, |
55 | $datePatternCol1 = 'MMMM', |
56 | $datePatternCol2 = 'dd (ccc)' |
57 | ) { |
58 | $sheet = $spreadsheet->getActiveSheet(); |
59 | $this->writeHeader($report, $sheet, $datePatternCol1, $datePatternCol2); |
60 | $this->writeTotals($report, $sheet); |
61 | foreach ($this->reportParts as $partName => $headline) { |
62 | $this->writeReportPart($report, $sheet, $partName, $headline); |
63 | } |
64 | |
65 | return $spreadsheet; |
66 | } |
67 | |
68 | public function writeHeader(ReportEntity $report, $sheet, $datePatternCol1, $datePatternCol2) |
69 | { |
70 | $dateString = $report->firstDay->year . '-' . $report->firstDay->month . '-' . $report->firstDay->day; |
71 | $reportHeader = []; |
72 | $reportHeader[] = null; |
73 | $reportHeader[] = $this->getFormatedDates($this->setDateTime($dateString), $datePatternCol1); |
74 | foreach (array_keys($report->data) as $date) { |
75 | if (! in_array($date, static::$ignoreColumns)) { |
76 | $date = $this->getFormatedDates($this->setDateTime($date), $datePatternCol2); |
77 | $reportHeader[] = $date; |
78 | } |
79 | } |
80 | $sheet->fromArray($reportHeader, null, 'A' . ($sheet->getHighestRow() + 2)); |
81 | } |
82 | |
83 | public function writeTotals(ReportEntity $report, $sheet) |
84 | { |
85 | $entity = clone $report; |
86 | $totals = array_pop($entity->data); |
87 | $reportTotal['max'][] = 'Tagesmaximum der Wartezeit in Min. (Spontankunden)'; |
88 | $reportTotal['average'][] = 'Tagesdurchschnitt der Wartezeit in Min. (Spontankunden)'; |
89 | $reportTotal['average_waytime'][] = 'Tagesdurchschnitt der Wegezeit in Min. (Spontankunden)'; |
90 | $reportTotal['max'][] = ReportHelper::formatTimeValue($totals['max_waitingtime']); |
91 | $reportTotal['average'][] = ReportHelper::formatTimeValue($totals['average_waitingtime']); |
92 | $reportTotal['average_waytime'][] = ReportHelper::formatTimeValue($totals['average_waytime']); |
93 | foreach ($entity->data as $entry) { |
94 | $reportTotal['max'][] = ReportHelper::formatTimeValue($entry['max_waitingtime']); |
95 | $reportTotal['average'][] = ReportHelper::formatTimeValue($entry['average_waitingtime']); |
96 | $reportTotal['average_waytime'][] = ReportHelper::formatTimeValue($entry['average_waytime']); |
97 | } |
98 | $sheet->fromArray($reportTotal, null, 'A' . ($sheet->getHighestRow() + 1)); |
99 | |
100 | $reportTotal2['max'][] = 'Tagesmaximum der Wartezeit in Min. (Terminkunden)'; |
101 | $reportTotal2['average'][] = 'Tagesdurchschnitt der Wartezeit in Min. (Terminkunden)'; |
102 | $reportTotal2['average_waytime'][] = 'Tagesdurchschnitt der Wegezeit in Min. (Terminkunden)'; |
103 | $reportTotal2['max'][] = ReportHelper::formatTimeValue($totals['max_waitingtime_termin']); |
104 | $reportTotal2['average'][] = ReportHelper::formatTimeValue($totals['average_waitingtime_termin']); |
105 | $reportTotal2['average_waytime'][] = ReportHelper::formatTimeValue($totals['average_waytime_termin']); |
106 | foreach ($entity->data as $entry) { |
107 | $reportTotal2['max'][] = ReportHelper::formatTimeValue($entry['max_waitingtime_termin']); |
108 | $reportTotal2['average'][] = ReportHelper::formatTimeValue($entry['average_waitingtime_termin']); |
109 | $reportTotal2['average_waytime'][] = ReportHelper::formatTimeValue($entry['average_waytime_termin']); |
110 | } |
111 | $sheet->fromArray($reportTotal2, null, 'A' . ($sheet->getHighestRow() + 1)); |
112 | } |
113 | |
114 | public function writeReportPart(ReportEntity $report, $sheet, $rangeName, $headline) |
115 | { |
116 | $entity = clone $report; |
117 | $totals = $entity->data['max']; |
118 | unset($entity->data['max']); |
119 | $reportData['headline'] = ['Zeitabschnitte',$headline]; |
120 | $formatAsTime = strpos($rangeName, 'waitingcount') === false; |
121 | foreach ($entity->data as $entry) { |
122 | foreach ($entry as $hour => $item) { |
123 | if (5 < $hour && 22 > $hour) { |
124 | if (! isset($reportData[$hour])) { |
125 | $reportData[$hour] = []; |
126 | } |
127 | $range = $hour . '-' . ($hour + 1) . ' Uhr'; |
128 | if (! in_array($range, $reportData[$hour])) { |
129 | $reportData[$hour][] = $range; |
130 | $totalValue = $totals[$hour][$rangeName]; |
131 | $reportData[$hour][] = $formatAsTime |
132 | ? ReportHelper::formatTimeValue($totalValue) |
133 | : $totalValue; |
134 | } |
135 | $value = $item[$rangeName] ?? '-'; |
136 | $reportData[$hour][] = $formatAsTime |
137 | ? ReportHelper::formatTimeValue($value) |
138 | : $value; |
139 | } |
140 | } |
141 | } |
142 | $sheet->fromArray($reportData, null, 'A' . ($sheet->getHighestRow() + 2)); |
143 | } |
144 | } |