Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
98.15% covered (success)
98.15%
53 / 54
75.00% covered (warning)
75.00%
3 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
RequestReport
98.15% covered (success)
98.15%
53 / 54
75.00% covered (warning)
75.00%
3 / 4
13
0.00% covered (danger)
0.00%
0 / 1
 readResponse
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
3
 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.55% covered (success)
96.55%
28 / 29
0.00% covered (danger)
0.00%
0 / 1
8
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;
15use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
16
17class RequestReport extends Base
18{
19    public $firstDayDate = null;
20
21    public $lastDayDate = null;
22
23    protected $dateFormatter = [
24        'day' => 'Y-m-d',
25        'month' => 'Y-m'
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 = 'requeststatistic_' . $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->writeReport($report, $download->getSpreadSheet(), 'yyyy', 'MMMM');
44            } else {
45                $this->writeReport($report, $download->getSpreadSheet());
46            }
47        }
48
49        return $download->writeDownload($response);
50    }
51
52    public function writeReport(
53        ReportEntity $report,
54        Spreadsheet $spreadsheet,
55        $datePatternCol1 = 'MMMM',
56        $datePatternCol2 = 'dd (ccc)'
57    ) {
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, $datePatternCol1, $datePatternCol2);
66        $this->writeReportData($report, $sheet, $datePatternCol1, $datePatternCol2);
67
68        return $spreadsheet;
69    }
70
71    public function writeHeader(ReportEntity $report, $sheet, $datePatternCol1, $datePatternCol2)
72    {
73        $reportHeader = [];
74        $reportHeader[] = 'Dienstleistung';
75        $reportHeader[] = 'Ø Bearbeitungsdauer';
76        $reportHeader[] = $this->getFormatedDates($this->firstDayDate, $datePatternCol1);
77        $dateTime = clone $this->firstDayDate;
78        do {
79            $reportHeader[] = $this->getFormatedDates($dateTime, $datePatternCol2);
80            $dateTime->modify('+1 ' . $report->period);
81        } while ($dateTime <= $this->lastDayDate);
82        $sheet->fromArray($reportHeader, null, 'A' . ($sheet->getHighestRow() + 2));
83    }
84
85    /**
86     * @SuppressWarnings(Unused)
87     */
88    public function writeReportData(ReportEntity $report, $sheet, $datePatternCol1, $datePatternCol2)
89    {
90        $reportData = [];
91        $rowIndex = $sheet->getHighestRow() + 1;
92        $firstDataRow = $rowIndex;
93
94        foreach ($report->data as $name => $entry) {
95            if ($name !== 'sum' && $name !== 'average_processingtime') {
96                $rowData = [];
97                $rowData[] = $name;
98                $rowData[] = isset($report->data['average_processingtime'][$name])
99                    && is_numeric($report->data['average_processingtime'][$name])
100                    ? (string)$report->data['average_processingtime'][$name]
101                    : "0";
102                $rowData[] = $report->data['sum'][$name];
103
104                $dateTime = clone $this->firstDayDate;
105                do {
106                    $dateString = $dateTime->format($this->dateFormatter[$report->period]);
107                    $rowData[] = isset($entry[$dateString]) ? (int)$entry[$dateString]['requestscount'] : '0';
108
109
110                    $dateTime->modify('+1 ' . $report->period);
111                } while ($dateTime <= $this->lastDayDate);
112
113                $reportData[$name] = $rowData;
114            }
115        }
116
117        $sheet->fromArray($reportData, null, 'A' . $rowIndex);
118        $lastColumn = $sheet->getHighestColumn();
119        $lastRow = $sheet->getHighestRow();
120        $sumRowIndex = $lastRow + 2;
121        $sumRow = ["Summe", "", ""];
122        $sumRow[2] = "=SUM(C{$firstDataRow}:C{$lastRow})";
123        $lastColumnIndex = Coordinate::columnIndexFromString($lastColumn);
124
125        for ($colIndex = 4; $colIndex <= $lastColumnIndex; $colIndex++) {
126            $colLetter = Coordinate::stringFromColumnIndex($colIndex);
127            $sumRow[] = "=SUM({$colLetter}{$firstDataRow}:{$colLetter}{$lastRow})";
128        }
129
130        $sheet->fromArray($sumRow, null, 'A' . $sumRowIndex);
131    }
132}