Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
96.55% covered (success)
96.55%
56 / 58
50.00% covered (danger)
50.00%
2 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
RequestReport
96.55% covered (success)
96.55%
56 / 58
50.00% covered (danger)
50.00%
2 / 4
15
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
 writeHeader
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
1
 writeReportData
96.97% covered (success)
96.97%
32 / 33
0.00% covered (danger)
0.00%
0 / 1
10
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;
16use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
17
18class RequestReport extends Base
19{
20    public $firstDayDate = null;
21
22    public $lastDayDate = null;
23
24    protected $dateFormatter = [
25        'day' => 'Y-m-d',
26        'month' => 'Y-m'
27    ];
28
29    /**
30     * @SuppressWarnings(Param)
31     * @return ResponseInterface
32     */
33    #[\Override]
34    public function readResponse(
35        RequestInterface $request,
36        ResponseInterface $response,
37        array $args
38    ) {
39        $title = 'requeststatistic_' . $args['period'];
40        $download = (new Download($request))->setSpreadSheet($title);
41
42        $this->writeInfoHeader($args, $download->getSpreadSheet());
43        foreach ($args['reports'] as $report) {
44            if ('month' == $report->period) {
45                $this->writeReport($report, $download->getSpreadSheet(), 'MMMM');
46            } else {
47                $this->writeReport($report, $download->getSpreadSheet());
48            }
49        }
50
51        return $download->writeDownload($response);
52    }
53
54    public function writeReport(
55        ReportEntity $report,
56        Spreadsheet $spreadsheet,
57        $datePatternCol = 'dd.MM.yyyy'
58    ) {
59        $sheet = $spreadsheet->getActiveSheet();
60
61        $firstDay = $report->firstDay->year . '-' . $report->firstDay->month . '-' . $report->firstDay->day;
62        $lastDay = $report->lastDay->year . '-' . $report->lastDay->month . '-' . $report->lastDay->day;
63        $this->firstDayDate = $this->setDateTime($firstDay);
64        $this->lastDayDate = $this->setDateTime($lastDay);
65
66        $this->writeHeader($report, $sheet, $datePatternCol);
67        $this->writeReportData($report, $sheet);
68
69        return $spreadsheet;
70    }
71
72    public function writeHeader(ReportEntity $report, $sheet, $datePatternCol)
73    {
74        $reportHeader = [];
75        $reportHeader[] = 'Dienstleistung';
76        $reportHeader[] = 'Ø Bearbeitungsdauer';
77        $reportHeader[] = 'Summe';
78        $dateTime = clone $this->firstDayDate;
79        do {
80            $reportHeader[] = $this->getFormatedDates($dateTime, $datePatternCol);
81            $dateTime->modify('+1 ' . $report->period);
82        } while ($dateTime <= $this->lastDayDate);
83        $sheet->fromArray($reportHeader, null, 'A' . ($sheet->getHighestRow() + 2));
84    }
85
86    /**
87     * @SuppressWarnings(Unused)
88     */
89    public function writeReportData(ReportEntity $report, $sheet)
90    {
91        $reportData = [];
92        $rowIndex = $sheet->getHighestRow() + 1;
93        $firstDataRow = $rowIndex;
94
95        foreach ($report->data as $name => $entry) {
96            if ($name !== 'sum' && $name !== 'average_processingtime') {
97                $rowData = [];
98                if ($name === 'uncategorized') {
99                    $rowData[] = 'Dienstleistung wurde nicht erfasst';
100                } elseif ($name === 'nonexistent') {
101                    $rowData[] = 'Dienstleistung konnte nicht erbracht werden';
102                } else {
103                    $rowData[] = $name;
104                }
105                $rowData[] = isset($report->data['average_processingtime'][$name])
106                    && is_numeric($report->data['average_processingtime'][$name])
107                    ? ReportHelper::formatTimeValue($report->data['average_processingtime'][$name])
108                    : "0";
109                $rowData[] = $report->data['sum'][$name];
110
111                $dateTime = clone $this->firstDayDate;
112                do {
113                    $dateString = $dateTime->format($this->dateFormatter[$report->period]);
114                    $rowData[] = isset($entry[$dateString]) ? (int)$entry[$dateString]['requestscount'] : '0';
115
116
117                    $dateTime->modify('+1 ' . $report->period);
118                } while ($dateTime <= $this->lastDayDate);
119
120                $reportData[$name] = $rowData;
121            }
122        }
123
124        $sheet->fromArray($reportData, null, 'A' . $rowIndex);
125        $lastColumn = $sheet->getHighestColumn();
126        $lastRow = $sheet->getHighestRow();
127        $sumRowIndex = $lastRow + 2;
128        $sumRow = ["Summe", "", ""];
129        $sumRow[2] = "=SUM(C{$firstDataRow}:C{$lastRow})";
130        $lastColumnIndex = Coordinate::columnIndexFromString($lastColumn);
131
132        for ($colIndex = 4; $colIndex <= $lastColumnIndex; $colIndex++) {
133            $colLetter = Coordinate::stringFromColumnIndex($colIndex);
134            $sumRow[] = "=SUM({$colLetter}{$firstDataRow}:{$colLetter}{$lastRow})";
135        }
136
137        $sheet->fromArray($sumRow, null, 'A' . $sumRowIndex);
138    }
139}