PluginProbe ʕ •ᴥ•ʔ
Booking for Appointments and Events Calendar – Amelia / 1.2.20
Booking for Appointments and Events Calendar – Amelia v1.2.20
2.4.4 2.4.3 2.4.2 2.4.1 2.4 trunk 1.2.1 1.2.10 1.2.11 1.2.12 1.2.13 1.2.14 1.2.15 1.2.16 1.2.17 1.2.18 1.2.19 1.2.2 1.2.20 1.2.21 1.2.22 1.2.23 1.2.24 1.2.25 1.2.26 1.2.27 1.2.28 1.2.29 1.2.3 1.2.30 1.2.31 1.2.32 1.2.33 1.2.34 1.2.35 1.2.36 1.2.37 1.2.38 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 2.0 2.0.1 2.0.2 2.1 2.1.1 2.1.2 2.1.3 2.2 2.2.1 2.3
ameliabooking / src / Domain / Services / Interval / IntervalService.php
ameliabooking / src / Domain / Services / Interval Last commit date
IntervalService.php 3 years ago
IntervalService.php
144 lines
1 <?php
2
3 namespace AmeliaBooking\Domain\Services\Interval;
4
5 /**
6 * Class IntervalService
7 *
8 * @package AmeliaBooking\Domain\Services\Interval
9 */
10 class IntervalService
11 {
12 /**
13 * @param string $time
14 *
15 * @return int
16 */
17 public function getSeconds($time)
18 {
19 $timeParts = explode(':', $time);
20
21 return $timeParts[0] * 60 * 60 + $timeParts[1] * 60 + $timeParts[2];
22 }
23
24 /**
25 * @param string $endTime
26 *
27 * @return string
28 */
29 public function getEndTimeString($endTime)
30 {
31 return $endTime === '00:00:00' ? '24:00:00' : $endTime;
32 }
33
34 /**
35 * get available appointment intervals.
36 *
37 * @param array $availableIntervals
38 * @param array $unavailableIntervals
39 *
40 * @return array
41 */
42 public function getAvailableIntervals(&$availableIntervals, $unavailableIntervals)
43 {
44 $parsedAvailablePeriod = [];
45
46 ksort($availableIntervals);
47 ksort($unavailableIntervals);
48
49 foreach ($availableIntervals as $available) {
50 $parsedAvailablePeriod[] = $available;
51
52 foreach ($unavailableIntervals as $unavailable) {
53 if ($parsedAvailablePeriod) {
54 $lastAvailablePeriod = $parsedAvailablePeriod[sizeof($parsedAvailablePeriod) - 1];
55
56 if ($unavailable[0] >= $lastAvailablePeriod[0] && $unavailable[1] <= $lastAvailablePeriod[1]) {
57 // unavailable interval is inside available interval
58 $fixedPeriod = array_pop($parsedAvailablePeriod);
59
60 if ($fixedPeriod[0] !== $unavailable[0]) {
61 $parsedAvailablePeriod[] = [$fixedPeriod[0], $unavailable[0], $fixedPeriod[2]];
62 }
63
64 if ($unavailable[1] !== $fixedPeriod[1]) {
65 $parsedAvailablePeriod[] = [$unavailable[1], $fixedPeriod[1], $fixedPeriod[2]];
66 }
67 } elseif ($unavailable[0] <= $lastAvailablePeriod[0] && $unavailable[1] >= $lastAvailablePeriod[1]) {
68 // available interval is inside unavailable interval
69 array_pop($parsedAvailablePeriod);
70 } elseif ($unavailable[0] <= $lastAvailablePeriod[0] && $unavailable[1] >= $lastAvailablePeriod[0] && $unavailable[1] <= $lastAvailablePeriod[1]) {
71 // unavailable interval intersect start of available interval
72 $fixedPeriod = array_pop($parsedAvailablePeriod);
73
74 if ($unavailable[1] !== $fixedPeriod[1]) {
75 $parsedAvailablePeriod[] = [$unavailable[1], $fixedPeriod[1], $fixedPeriod[2]];
76 }
77 } elseif ($unavailable[0] >= $lastAvailablePeriod[0] && $unavailable[0] <= $lastAvailablePeriod[1] && $unavailable[1] >= $lastAvailablePeriod[1]) {
78 // unavailable interval intersect end of available interval
79 $fixedPeriod = array_pop($parsedAvailablePeriod);
80
81 if ($fixedPeriod[0] !== $unavailable[0]) {
82 $parsedAvailablePeriod[] = [$fixedPeriod[0], $unavailable[0], $fixedPeriod[2]];
83 }
84 }
85 }
86 }
87 }
88
89 return $parsedAvailablePeriod;
90 }
91
92 /**
93 * @param array $data
94 * @param int $startTime
95 * @param int $endTime
96 *
97 * @return array
98 */
99 public function getFreeIntervals($data, $startTime, $endTime)
100 {
101 $result = [];
102
103 ksort($data);
104
105 $firstIntervalTime = true;
106
107 $lastStartTime = $startTime;
108
109 foreach ((array)$data as &$interval) {
110 // Appointment is out of working hours
111 if ($interval[0] >= $endTime || $interval[1] <= $startTime) {
112 continue;
113 }
114
115 // Beginning or End of the Appointment is out of working hours
116 if ($interval[0] < $startTime && $interval[1] <= $endTime) {
117 $interval[0] = $startTime;
118 } elseif ($interval[0] >= $startTime && $interval[1] > $endTime) {
119 $interval[1] = $endTime;
120 }
121
122 if ($lastStartTime !== $interval[0] && ($lastStartTime !== $startTime || ($firstIntervalTime && $lastStartTime !== $interval[0]))) {
123 $firstIntervalTime = false;
124
125 $result[$lastStartTime] = [
126 $lastStartTime,
127 $interval[0]
128 ];
129 }
130
131 $lastStartTime = $interval[1];
132 }
133
134 if ($lastStartTime !== $endTime) {
135 $result[$lastStartTime] = [
136 $lastStartTime,
137 $endTime
138 ];
139 }
140
141 return $result;
142 }
143 }
144