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