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        'waitingcalculated' => 'maximal berechnete Wartezeit Spontankunden',
22        'waitingcount_termin' => 'Wartende Terminkunden',
23        'waitingtime_termin' => 'gemessene Wartezeit Terminkunden',
24        'waitingcalculated_termin' => 'maximal berechnete Wartezeit Terminkunden',
25        'waytime' => 'gemessene Wegezeit Spontankunden',
26        'waytime_termin' => 'gemessene Wegezeit Terminkunden',
27    ];
28
29    /**
30     * @SuppressWarnings(Param)
31     * @return ResponseInterface
32     */
33    public function readResponse(
34        RequestInterface $request,
35        ResponseInterface $response,
36        array $args
37    ) {
38        $title = 'waitingstatistic_' . $args['period'];
39        $download = (new Download($request))->setSpreadSheet($title);
40
41        $this->writeInfoHeader($args, $download->getSpreadSheet());
42        foreach ($args['reports'] as $report) {
43            if ('month' == $report->period) {
44                $this->writeWaitingReport($report, $download->getSpreadSheet(), 'yyyy', 'MMMM');
45            } else {
46                $this->writeWaitingReport($report, $download->getSpreadSheet());
47            }
48        }
49
50        return $download->writeDownload($response);
51    }
52
53    public function writeWaitingReport(
54        ReportEntity $report,
55        Spreadsheet $spreadsheet,
56        $datePatternCol1 = 'MMMM',
57        $datePatternCol2 = 'dd (ccc)'
58    ) {
59        $sheet = $spreadsheet->getActiveSheet();
60        $this->writeHeader($report, $sheet, $datePatternCol1, $datePatternCol2);
61        $this->writeTotals($report, $sheet);
62        foreach ($this->reportParts as $partName => $headline) {
63            $this->writeReportPart($report, $sheet, $partName, $headline);
64        }
65
66        return $spreadsheet;
67    }
68
69    public function writeHeader(ReportEntity $report, $sheet, $datePatternCol1, $datePatternCol2)
70    {
71        $dateString = $report->firstDay->year . '-' . $report->firstDay->month . '-' . $report->firstDay->day;
72        $reportHeader = [];
73        $reportHeader[] = null;
74        $reportHeader[] = $this->getFormatedDates($this->setDateTime($dateString), $datePatternCol1);
75        foreach (array_keys($report->data) as $date) {
76            if (! in_array($date, static::$ignoreColumns)) {
77                $date = $this->getFormatedDates($this->setDateTime($date), $datePatternCol2);
78                $reportHeader[] = $date;
79            }
80        }
81        $sheet->fromArray($reportHeader, null, 'A' . ($sheet->getHighestRow() + 2));
82    }
83
84    public function writeTotals(ReportEntity $report, $sheet)
85    {
86        $entity = clone $report;
87        $totals = array_pop($entity->data);
88        $reportTotal['max'][] = 'Tagesmaximum Spontankunden der gemessenen Zeit';
89        $reportTotal['average'][] = 'Tagesdurchschnitt Spontankunden der gemessenen Zeit';
90        $reportTotal['average_waytime'][] = 'Tagesdurchschnitt Wegezeit Spontankunden';
91        $reportTotal['max'][] = $totals['max_waitingtime'];
92        $reportTotal['average'][] = $totals['average_waitingtime'];
93        $reportTotal['average_waytime'][] = $totals['average_waytime'];
94        foreach ($entity->data as $entry) {
95            $reportTotal['max'][] = $entry['max_waitingtime'];
96            $reportTotal['average'][] = $entry['average_waitingtime'];
97            $reportTotal['average_waytime'][] = $entry['average_waytime'];
98        }
99        $sheet->fromArray($reportTotal, null, 'A' . ($sheet->getHighestRow() + 1));
100
101        $reportTotal2['max'][] = 'Tagesmaximum Terminkunden der gemessenen Zeit';
102        $reportTotal2['average'][] = 'Tagesdurchschnitt Terminkunden der gemessenen Zeit';
103        $reportTotal2['average_waytime'][] = 'Tagesdurchschnitt Wegezeit Terminkunden';
104        $reportTotal2['max'][] = $totals['max_waitingtime_termin'];
105        $reportTotal2['average'][] = $totals['average_waitingtime_termin'];
106        $reportTotal2['average_waytime'][] = $totals['average_waytime_termin'];
107        foreach ($entity->data as $entry) {
108            $reportTotal2['max'][] = $entry['max_waitingtime_termin'];
109            $reportTotal2['average'][] = $entry['average_waitingtime_termin'];
110            $reportTotal2['average_waytime'][] = $entry['average_waytime_termin'];
111        }
112        $sheet->fromArray($reportTotal2, null, 'A' . ($sheet->getHighestRow() + 1));
113    }
114
115    public function writeReportPart(ReportEntity $report, $sheet, $rangeName, $headline)
116    {
117        $entity = clone $report;
118        $totals = $entity->data['max'];
119        unset($entity->data['max']);
120        $reportData['headline'] = ['Zeitabschnitte',$headline];
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                        $reportData[$hour][] = $totals[$hour][$rangeName];
131                    }
132                    $reportData[$hour][] = $item[$rangeName];
133                }
134            }
135        }
136        $sheet->fromArray($reportData, null, 'A' . ($sheet->getHighestRow() + 2));
137    }
138}