Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
69 / 69
100.00% covered (success)
100.00%
5 / 5
CRAP
100.00% covered (success)
100.00%
1 / 1
WaitingReport
100.00% covered (success)
100.00%
69 / 69
100.00% covered (success)
100.00%
5 / 5
20
100.00% covered (success)
100.00%
1 / 1
 readResponse
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
3
 writeWaitingReport
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
2
 writeHeader
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
3
 writeTotals
100.00% covered (success)
100.00%
24 / 24
100.00% covered (success)
100.00%
1 / 1
3
 writeReportPart
100.00% covered (success)
100.00%
22 / 22
100.00% covered (success)
100.00%
1 / 1
9
1<?php
2
3/**
4 * @package zmsstatistic
5 * @copyright BerlinOnline Stadtportal GmbH & Co. KG
6 **/
7
8namespace BO\Zmsstatistic\Download;
9
10use BO\Zmsentities\Exchange as ReportEntity;
11use BO\Zmsstatistic\Helper\Download;
12use BO\Zmsstatistic\Helper\ReportHelper;
13use PhpOffice\PhpSpreadsheet\Spreadsheet;
14use Psr\Http\Message\RequestInterface;
15use Psr\Http\Message\ResponseInterface;
16
17class 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}