PluginProbe ʕ •ᴥ•ʔ
Booking for Appointments and Events Calendar – Amelia / trunk
Booking for Appointments and Events Calendar – Amelia vtrunk
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 6 months ago
IntervalService.php
152 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 (int)$timeParts[0] * 60 * 60 + (int)$timeParts[1] * 60 + (!empty($timeParts[2]) ? (int)$timeParts[2] : 0);
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 (
71 $unavailable[0] <= $lastAvailablePeriod[0] &&
72 $unavailable[1] >= $lastAvailablePeriod[0] &&
73 $unavailable[1] <= $lastAvailablePeriod[1]
74 ) {
75 // unavailable interval intersect start of available interval
76 $fixedPeriod = array_pop($parsedAvailablePeriod);
77
78 if ($unavailable[1] !== $fixedPeriod[1]) {
79 $parsedAvailablePeriod[] = [$unavailable[1], $fixedPeriod[1], $fixedPeriod[2]];
80 }
81 } elseif (
82 $unavailable[0] >= $lastAvailablePeriod[0] &&
83 $unavailable[0] <= $lastAvailablePeriod[1] &&
84 $unavailable[1] >= $lastAvailablePeriod[1]
85 ) {
86 // unavailable interval intersect end of available interval
87 $fixedPeriod = array_pop($parsedAvailablePeriod);
88
89 if ($fixedPeriod[0] !== $unavailable[0]) {
90 $parsedAvailablePeriod[] = [$fixedPeriod[0], $unavailable[0], $fixedPeriod[2]];
91 }
92 }
93 }
94 }
95 }
96
97 return $parsedAvailablePeriod;
98 }
99
100 /**
101 * @param array $data
102 * @param int $startTime
103 * @param int $endTime
104 *
105 * @return array
106 */
107 public function getFreeIntervals($data, $startTime, $endTime)
108 {
109 $result = [];
110
111 ksort($data);
112
113 $firstIntervalTime = true;
114
115 $lastStartTime = $startTime;
116
117 foreach ((array)$data as &$interval) {
118 // Appointment is out of working hours
119 if ($interval[0] >= $endTime || $interval[1] <= $startTime) {
120 continue;
121 }
122
123 // Beginning or End of the Appointment is out of working hours
124 if ($interval[0] < $startTime && $interval[1] <= $endTime) {
125 $interval[0] = $startTime;
126 } elseif ($interval[0] >= $startTime && $interval[1] > $endTime) {
127 $interval[1] = $endTime;
128 }
129
130 if ($lastStartTime !== $interval[0] && ($lastStartTime !== $startTime || ($firstIntervalTime && $lastStartTime !== $interval[0]))) {
131 $firstIntervalTime = false;
132
133 $result[$lastStartTime] = [
134 $lastStartTime,
135 $interval[0]
136 ];
137 }
138
139 $lastStartTime = $interval[1];
140 }
141
142 if ($lastStartTime !== $endTime) {
143 $result[$lastStartTime] = [
144 $lastStartTime,
145 $endTime
146 ];
147 }
148
149 return $result;
150 }
151 }
152