Reservations   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 117
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 0

Importance

Changes 0
Metric Value
wmc 10
lcom 0
cbo 0
dl 0
loc 117
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A defineProperties() 0 18 1
A render() 0 17 2
A loadData() 0 34 4
A sortItemsToDays() 0 25 3
1
<?php namespace VojtaSvoboda\Reservations\ReportWidgets;
2
3
use Backend\Classes\ReportWidgetBase;
4
use Carbon\Carbon;
5
use DB;
6
use Exception;
7
use October\Rain\Exception\ApplicationException;
8
use VojtaSvoboda\Reservations\Models\Reservation;
9
10
/**
11
 * Reservations report widget.
12
 *
13
 * @package VojtaSvoboda\Reservations\ReportWidgets
14
 */
15
class Reservations extends ReportWidgetBase
16
{
17
    public function defineProperties()
18
    {
19
        return [
20
            'title' => [
21
                'title' => 'Reservations',
22
                'default' => 'Reservations',
23
                'type' => 'string',
24
                'validationPattern' => '^.+$',
25
                'validationMessage' => 'Widget title is required.',
26
            ],
27
            'days' => [
28
                'title' => 'Number of days',
29
                'default' => '30',
30
                'type' => 'string',
31
                'validationPattern' => '^[0-9]+$',
32
            ],
33
        ];
34
    }
35
36
    /**
37
     * Render widget.
38
     *
39
     * @return mixed
40
     */
41
    public function render()
42
    {
43
        $error = false;
44
        $reservations = [];
45
46
        try {
47
            $reservations = $this->loadData();
48
49
        } catch (Exception $ex) {
50
            $error = $ex->getMessage();
51
        }
52
53
        $this->vars['error'] = $error;
54
        $this->vars['reservations'] = $reservations;
55
56
        return $this->makePartial('widget');
57
    }
58
59
    /**
60
     * Load data for widget. Data are dependent on 'days' widget property.
61
     *
62
     * @return array
63
     */
64
    protected function loadData()
65
    {
66
        $days = $this->property('days');
67
        if (!$days) {
68
            throw new ApplicationException('Invalid days value: ' . $days);
69
        }
70
71
        // get all reservations for gived days
72
        $interval = Carbon::now()->subDays($days)->toDateTimeString();
73
        $items = Reservation::where('created_at', '>=', $interval)->get();
74
75
        // parse data
76
        $all = $this->sortItemsToDays($items);
77
78
        // we need at least two days, to display chart
79
        if (sizeof($all) == 1) {
80
            $day = reset($all);
81
            $date = Carbon::createFromFormat('Y-m-d', $day['date'])->subDays(1);
82
            $dateFormated = $date->format('Y-m-d');
83
            $all[$dateFormated] = [
84
                'timestamp' => $date->timestamp * 1000,
85
                'date' => $dateFormated,
86
                'count' => 0,
87
            ];
88
        }
89
90
        // count all
91
        $all_render = [];
92
        foreach ($all as $a) {
93
            $all_render[] = [$a['timestamp'], $a['count']];
94
        }
95
96
        return $all_render;
97
    }
98
99
    /**
100
     * Sort items by days.
101
     *
102
     * @param $items
103
     *
104
     * @return array
105
     */
106
    private function sortItemsToDays($items)
107
    {
108
        $all = [];
109
110
        foreach ($items as $item)
111
        {
112
            // date
113
            $timestamp = strtotime($item->created_at) * 1000;
114
            $day = Carbon::createFromFormat('Y-m-d H:i:s', $item->created_at)->format('Y-m-d');
115
116
            // init empty day
117
            if (!isset($all[$day])) {
118
                $all[$day] = [
119
                    'timestamp' => $timestamp,
120
                    'date' => $day,
121
                    'count' => 0,
122
                ];
123
            }
124
125
            // increase count
126
            $all[$day]['count']++;
127
        }
128
129
        return $all;
130
    }
131
}
132