Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
86.08% covered (warning)
86.08%
68 / 79
40.00% covered (danger)
40.00%
2 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
RequestReport
86.08% covered (warning)
86.08%
68 / 79
40.00% covered (danger)
40.00%
2 / 5
24.43
0.00% covered (danger)
0.00%
0 / 1
 readResponse
87.50% covered (warning)
87.50%
7 / 8
0.00% covered (danger)
0.00%
0 / 1
3.02
 writeReport
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
1
 getReportDates
20.00% covered (danger)
20.00%
2 / 10
0.00% covered (danger)
0.00%
0 / 1
12.19
 writeHeader
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
2
 writeReportData
95.35% covered (success)
95.35%
41 / 43
0.00% covered (danger)
0.00%
0 / 1
13
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 RequestReport extends Base
18{
19    public ?\DateTime $firstDayDate = null;
20
21    public ?\DateTime $lastDayDate = null;
22
23    protected array $dateFormatter = [
24        'day' => 'Y-m-d',
25        'month' => 'Y-m'
26    ];
27
28    /**
29     * @SuppressWarnings(Param)
30     * @return ResponseInterface
31     */
32    #[\Override]
33    public function readResponse(
34        RequestInterface $request,
35        ResponseInterface $response,
36        array $args
37    ): mixed {
38        $title = 'requeststatistic_' . $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->writeReport($report, $download->getSpreadSheet(), 'MMMM');
45            } else {
46                $this->writeReport($report, $download->getSpreadSheet());
47            }
48        }
49
50        return $download->writeDownload($response);
51    }
52
53    public function writeReport(
54        ReportEntity $report,
55        Spreadsheet $spreadsheet,
56        string $datePatternCol = 'dd.MM.yyyy'
57    ): Spreadsheet {
58        $sheet = $spreadsheet->getActiveSheet();
59
60        $firstDay = $report->firstDay->year . '-' . $report->firstDay->month . '-' . $report->firstDay->day;
61        $lastDay = $report->lastDay->year . '-' . $report->lastDay->month . '-' . $report->lastDay->day;
62        $this->firstDayDate = $this->setDateTime($firstDay);
63        $this->lastDayDate = $this->setDateTime($lastDay);
64
65        $this->writeHeader($report, $sheet, $datePatternCol);
66        $this->writeReportData($report, $sheet);
67
68        return $spreadsheet;
69    }
70
71    private function getReportDates(ReportEntity $report): array
72    {
73        if ($report->period === 'day') {
74            return $report->getDatesWithRequests();
75        }
76
77        $dates = [];
78        if (!$this->firstDayDate instanceof \DateTime || !$this->lastDayDate instanceof \DateTime) {
79            throw new \RuntimeException('Report date range is not initialized');
80        }
81        $dateTime = clone $this->firstDayDate;
82
83        do {
84            $dates[] = $dateTime->format($this->dateFormatter[$report->period]);
85            $dateTime->modify('+1 ' . $report->period);
86        } while ($dateTime <= $this->lastDayDate);
87
88        return $dates;
89    }
90
91    public function writeHeader(
92        ReportEntity $report,
93        \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $sheet,
94        string $datePatternCol
95    ): void {
96        $reportHeader = [];
97        $reportHeader[] = 'Dienstleistung';
98        $reportHeader[] = 'Ø Bearbeitungsdauer';
99        $reportHeader[] = 'Summe';
100        foreach ($this->getReportDates($report) as $date) {
101            $reportHeader[] = $this->getFormatedDates(
102                $this->setDateTime($date),
103                $datePatternCol
104            );
105        }
106        $sheet->fromArray($reportHeader, null, 'A' . ($sheet->getHighestRow() + 2));
107    }
108
109    /**
110     * @SuppressWarnings(Unused)
111     */
112    public function writeReportData(ReportEntity $report, \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $sheet): void
113    {
114        $reportData = [];
115        $firstDataRow = $sheet->getHighestRow() + 1;
116        $totalSum = 0;
117        $reportDates = $this->getReportDates($report);
118        $dateSums = array_fill(0, count($reportDates), 0);
119
120        foreach ($report->data as $name => $entry) {
121            if ($name !== 'sum' && $name !== 'average_processingtime' && $name !== 'average_processingtime_overall') {
122                $rowData = [];
123                if ($name === ReportEntity::REQUEST_STAT_NAME_UNCATEGORIZED) {
124                    $rowData[] = 'Dienstleistung wurde nicht erfasst';
125                } elseif ($name === ReportEntity::REQUEST_STAT_NAME_NONEXISTENT) {
126                    $rowData[] = 'Dienstleistung konnte nicht erbracht werden';
127                } else {
128                    $rowData[] = $name;
129                }
130                $rowData[] = isset($report->data['average_processingtime'][$name])
131                    && is_numeric($report->data['average_processingtime'][$name])
132                    ? ReportHelper::formatTimeValue($report->data['average_processingtime'][$name])
133                    : "0";
134                $rowData[] = $report->data['sum'][$name];
135                $totalSum += (int)($report->data['sum'][$name] ?? 0);
136
137                foreach ($reportDates as $dateColumn => $dateString) {
138                    $requestCount = isset($entry[$dateString])
139                        ? (int) $entry[$dateString]['requestscount']
140                        : 0;
141
142                    $rowData[] = $requestCount;
143                    $dateSums[$dateColumn] += $requestCount;
144                }
145
146                $reportData[] = $rowData;
147            }
148        }
149
150        $sheet->fromArray($reportData, null, 'A' . $firstDataRow);
151        $overallProcessingTime =
152        isset(
153            $report->data['average_processingtime_overall']
154        )
155             && is_numeric($report->data['average_processingtime_overall'])
156             ? ReportHelper::formatTimeValue($report->data['average_processingtime_overall']) : '0';
157        $sumRowIndex = $sheet->getHighestRow() + 2;
158        $sumRow = array_merge(
159            [
160                'Ø Bearbeitungsdauer (unabhängig von DL) / Summe',
161                $overallProcessingTime,
162                $totalSum
163            ],
164            $dateSums
165        );
166
167        $sheet->fromArray($sumRow, null, 'A' . $sumRowIndex);
168    }
169}