Passed
Pull Request — master (#13)
by Vojta
09:53 queued 03:21
created

DatesResolver::getBoundaryBefore()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 8
ccs 0
cts 0
cp 0
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 5
nc 1
nop 2
crap 2
1
<?php namespace VojtaSvoboda\Reservations\Classes;
2
3
use Carbon\Carbon;
4
use Config;
5
use Illuminate\Database\Eloquent\Collection;
6
7
/**
8
 * Class DatesResolver transform reservations to booked time slots, grouped by date.
9
 *
10
 * @package VojtaSvoboda\Reservations\Classes
11
 */
12
class DatesResolver
13
{
14
    /**
15
     * Returns reserved time slots from non cancelled reservations.
16
     *
17
     * If you have reservations at 13.10.2016 at 11:00 and also at 13:00, both with 2 hours lenght, this method return
18
     * all booked slots - from 09:15 to 14:45 (when you have 15 minutes slot lenght).
19
     *
20
     * ------------ 11:00 ------------- 13:00 --------------
21
     *
22
     * Because nearest reservation can be done at 09:00 with 2 hours lenghts and next reservation at 15:00.
23
     *
24
     * @param Collection $reservations
25
     *
26
     * @return array
27
     */
28
    public function getDatesFromReservations(Collection $reservations)
29
    {
30
        // init
31
        $interval = $this->getInterval();
32
        $length = $this->getLength();
33
        $dateFormat = $this->getDateFormat();
34
        $timeFormat = $this->getTimeFormat();
35
36
        // sort reservations by date and count time slots before reservation and during the reservation
37
        $dates = [];
38
        foreach ($reservations as $reservation)
39
        {
40
            /** @var Carbon $date */
41
            $date = Carbon::parse($reservation->date);
42
            $reservationDay = $date->format($dateFormat);
43
44
            // reservation end date
45
            $endTime = clone $date;
46
            $endTime->modify('+' . $length);
47
48
            // each reservation takes some time
49
            $date->modify('-' . $length);
50
            $date->modify('+' . $interval . ' minutes');
51
            while ($date < $endTime) {
52
                $time = $date->format($timeFormat);
53
                $dates[$reservationDay][$time] = $time;
54
                $date->modify('+' . $interval . ' minutes');
55
            }
56
        }
57
58
        return $dates;
59
    }
60
61
    /**
62
     * Get booked interval around the given date.
63
     *
64
     * @param Carbon $date
65
     *
66
     * @return array
67
     */
68
    public function getBoundaryDates($date)
69
    {
70
        // reservation length
71
        $length = $this->getLength();
72
73
        // boundary dates before and after
74
        $startDatetime = $this->getBoundaryBefore($date, $length);
75
        $endDatetime = $this->getBoundaryAfter($date, $length);
76
77
        return [$startDatetime, $endDatetime];
78
    }
79
80
    /**
81
     * Get boundary date before reservation date.
82
     *
83
     * @param $date
84
     * @param $length
85
     *
86
     * @return mixed
87
     */
88
    private function getBoundaryBefore($date, $length)
89
    {
90
        $startDatetime = clone $date;
91
        $startDatetime->modify('-' . $length);
92
        $startDatetime->modify('+1 second');
93
94
        return $startDatetime;
95
    }
96
97
    /**
98
     * Get boundary date after reservation date.
99
     *
100
     * @param $date
101
     * @param $length
102
     *
103
     * @return mixed
104
     */
105
    private function getBoundaryAfter($date, $length)
106
    {
107
        $endDatetime = clone $date;
108
        $endDatetime->modify('+' . $length);
109
        $endDatetime->modify('-1 second');
110
111
        return $endDatetime;
112
    }
113
114
    private function getDateFormat()
115
    {
116
        return Config::get('vojtasvoboda.reservations::config.formats.date', 'd/m/Y');
117
    }
118
119
    private function getTimeFormat()
120
    {
121
        return Config::get('vojtasvoboda.reservations::config.formats.time', 'H:i');
122
    }
123
124
    private function getInterval()
125
    {
126
        return Config::get('vojtasvoboda.reservations::config.reservation.interval', 15);
127
    }
128
129
    private function getLength()
130
    {
131
        return Config::get('vojtasvoboda.reservations::config.reservation.length', '2 hours');
132
    }
133
}
134