PluginProbe
Fluent Booking – The Ultimate Appointments Scheduling, Events Booking, Events Calendar Solution / 1.5.01
Fluent Booking – The Ultimate Appointments Scheduling, Events Booking, Events Calendar Solution v1.5.01
2.4.0 2.3.0 2.2.5 2.2.0 2.1.2 2.1.1 trunk 1.10.0 1.10.01 1.10.02 1.5.0 1.5.01 1.5.02 1.5.1 1.5.10 1.5.20 1.5.21 1.5.22 1.5.23 1.5.24 1.5.25 1.6.0 1.7.0 1.7.1 1.7.2 All 33 releases
fluent-booking / app / Services / Integrations / Calendars / RemoteCalendarHelper.php

RemoteCalendarHelper.php in Fluent Booking – The Ultimate Appointments Scheduling, Events Booking, Events Calendar Solution 1.5.01, at app/Services/Integrations/Calendars/RemoteCalendarHelper.php

208 lines 6.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentBooking\App\Services\Integrations\Calendars;
4
5 use FluentBooking\App\App;
6 use FluentBooking\App\Models\Meta;
7 use FluentBooking\App\Services\DateTimeHelper;
8 use FluentBooking\App\Services\Helper;
9 use FluentBooking\Framework\Support\Arr;
10
11 class RemoteCalendarHelper
12 {
13 public static function getUserRemoteCreatableCalendarSettings($userId)
14 {
15 $exist = Meta::where('object_type', '_calendar_user_meta')
16 ->where('object_id', $userId)
17 ->where('key', 'create_remote_calendar')
18 ->first();
19
20 if ($exist) {
21 $value = $exist->value;
22 if (!is_array($value)) {
23 return [];
24 }
25 return $value;
26 }
27
28 return [];
29 }
30
31 public static function updateUserRemoteCreatableCalendarSettings($userId, $settings)
32 {
33 if (!$settings) {
34 $settings = [];
35 }
36
37 $exist = Meta::where('object_type', '_calendar_user_meta')
38 ->where('object_id', $userId)
39 ->where('key', 'create_remote_calendar')
40 ->first();
41
42 if ($exist) {
43 $exist->value = $settings;
44 $exist->save();
45 return $exist;
46 }
47
48 return Meta::create([
49 'object_type' => '_calendar_user_meta',
50 'object_id' => $userId,
51 'key' => 'create_remote_calendar',
52 'value' => $settings
53 ]);
54 }
55
56 public static function getRemoteCalendarConfig($userId)
57 {
58 $settings = self::getUserRemoteCreatableCalendarSettings($userId);
59
60 if (!$settings) {
61 return null;
62 }
63
64 $idConfig = Arr::get($settings, 'id');
65 $driver = Arr::get($settings, 'driver');
66
67 if (!$idConfig || !$driver) {
68 return null;
69 }
70
71 $idArr = explode('__||__', $idConfig);
72
73 if (count($idArr) < 2) {
74 return null;
75 }
76
77 $metaId = (int)array_shift($idArr);
78
79 if (!$metaId) {
80 return null;
81 }
82
83 $remoteCalendarId = implode('__||__', $idArr);
84
85 return [
86 'db_id' => $metaId,
87 'remote_calendar_id' => $remoteCalendarId,
88 'driver' => $driver
89 ];
90 }
91
92 public static function showGeneralError($data = [])
93 {
94 $defaults = [
95 'title' => __('Unknown error', 'fluent-booking'),
96 'body' => __('Something went wrong. Please try again later.', 'fluent-booking'),
97 'btn_url' => Helper::getAppBaseUrl(),
98 'btn_text' => __('Back to dashboard', 'fluent-booking')
99 ];
100
101 $data = array_merge($defaults, $data);
102
103 $app = App::getInstance();
104
105 header('Content-Type: text/html; charset=utf-8');
106 $app->view->render('admin.general_error', $data);
107 exit();
108 }
109
110 public static function getRruleDates($rules, $sampleRange, $minDate, $maxDate, $args = [], $timezone = 'UTC')
111 {
112 try {
113 $durationSeconds = strtotime($sampleRange[1]) - strtotime($sampleRange[0]);
114
115 // Define the time range you're interested in
116 $minDate = new \DateTime($minDate, new \DateTimeZone($timezone));
117 $maxDate = new \DateTime($maxDate, new \DateTimeZone($timezone));
118 $dtStart = new \DateTime($sampleRange[0], new \DateTimeZone($timezone));
119
120 // Create a rule set
121 $rset = new \FluentBooking\App\Services\Libs\RRule\RSet();
122
123 foreach ($rules as $recurrence) {
124 if (strpos($recurrence, 'RRULE') === 0) {
125 // Create the RRule object with the actual DTSTART
126 $rrule = new \FluentBooking\App\Services\Libs\RRule\RRule($recurrence, $dtStart);
127 $rset->addRRule($rrule);
128 } elseif (strpos($recurrence, 'EXDATE') === 0) {
129 $exDates = \FluentBooking\App\Services\Libs\RRule\RfcParser::parseExDate($recurrence);
130 foreach ($exDates as $exDate) {
131 $rset->addExDate($exDate);
132 }
133 }
134 }
135
136 $occurrences = $rset->getOccurrencesBetween($minDate, $maxDate);
137
138 return array_map(function ($date) use ($durationSeconds, $args) {
139
140 $start = $date->format('Y-m-d H:i:s');
141 $endDateTime = gmdate('Y-m-d H:i:s', strtotime($start) + $durationSeconds); // phpcs:ignore WordPress.DateTime.RestrictedFunctions.date_date
142
143 if (!$args) {
144 return [
145 'start' => $start,
146 'end' => $endDateTime
147 ];
148 }
149
150 return wp_parse_args([
151 'start' => $start,
152 'end' => $endDateTime
153 ], $args);
154 }, $occurrences);
155
156 } catch (\Exception $exception) {
157 Helper::debugLog([
158 'message' => $exception->getMessage(),
159 'method' => __METHOD__,
160 'type' => 'rrule_error'
161 ]);
162 return [];
163 }
164 }
165
166 public static function convertToTimeZoneOffset($dateTime, $toTimeZone, $refernceDate = null)
167 {
168 if ($toTimeZone === 'UTC') {
169 return gmdate('Y-m-d H:i:s', strtotime($dateTime));
170 }
171
172 if (!$refernceDate) {
173 return DateTimeHelper::convertFromUtc($dateTime, $toTimeZone);
174 }
175
176 $dateTime = new \DateTime($dateTime, new \DateTimeZone('UTC'));
177 $offset = self::getTimeOffset($refernceDate, $toTimeZone);
178 if ($offset > 0) {
179 $dateTime->add(new \DateInterval('PT' . $offset . 'S'));
180 } else {
181 $dateTime->sub(new \DateInterval('PT' . abs($offset) . 'S'));
182 }
183
184 return $dateTime->format('Y-m-d H:i:s');
185 }
186
187 public static function getTimeOffset($refDate, $timezone)
188 {
189 static $cache = [];
190
191 $cacheKey = $refDate . '_' . $timezone;
192
193 if (isset($cache[$cacheKey])) {
194 return $cache[$cacheKey];
195 }
196
197 $refDate = new \DateTime($refDate, new \DateTimeZone('UTC'));
198 $refDate->setTimezone(new \DateTimeZone($timezone));
199
200 $offset = $refDate->getOffset();
201
202 $cache[$cacheKey] = $offset;
203
204 return $offset;
205 }
206
207 }
208