PluginProbe
Fluent Booking – The Ultimate Appointments Scheduling, Events Booking, Events Calendar Solution / 2.1.2
Fluent Booking – The Ultimate Appointments Scheduling, Events Booking, Events Calendar Solution v2.1.2
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 / Http / Controllers / AvailabilityController.php

AvailabilityController.php in Fluent Booking – The Ultimate Appointments Scheduling, Events Booking, Events Calendar Solution 2.1.2, at app/Http/Controllers/AvailabilityController.php

286 lines 9.4 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\Http\Controllers;
4
5 use FluentBooking\App\Models\Availability;
6 use FluentBooking\App\Models\Calendar;
7 use FluentBooking\App\Models\CalendarSlot;
8 use FluentBooking\Framework\Http\Request\Request;
9 use FluentBooking\App\Services\PermissionManager;
10 use FluentBooking\App\Services\SanitizeService;
11 use FluentBooking\App\Services\AvailabilityService;
12 use FluentBooking\Framework\Support\Arr;
13
14 class AvailabilityController extends Controller
15 {
16 public function index(Request $request)
17 {
18 $filters = $request->get('filters', []);
19
20 $query = Availability::orderBy('id', 'desc');
21
22 $host = Arr::get($filters, 'author');
23
24 if ($host == 'me') {
25 $host = get_current_user_id();
26 } else if ($host !== 'all') {
27 $host = (int)$host;
28 }
29
30 if (!PermissionManager::userCan(['manage_all_data', 'read_and_use_other_availabilities', 'manage_other_availabilities'])) {
31 $host = get_current_user_id();
32 }
33
34 if ($host && $host !== 'all') {
35 $query->where('object_id', $host);
36 }
37
38 do_action_ref_array('fluent_booking/availability_schedules_query', [&$query]);
39
40 $schedules = $query->paginate();
41
42 do_action('fluent_booking/availability_schedules', $schedules);
43
44 $formattedSchedules = [];
45 foreach ($schedules as $schedule) {
46
47 $timezone = Arr::get($schedule, 'value.timezone', 'UTC');
48
49 $author = $schedule->getAuthor();
50
51 $formattedSchedules[] = [
52 'id' => $schedule->id,
53 'host_name' => $author['name'],
54 'host_avatar' => $author['avatar'],
55 'title' => $schedule->key,
56 'usage_count' => AvailabilityService::getAvailabilityUsageCount($schedule->id),
57 'created_at' => $schedule->created_at->format('Y-m-d H:i:s'),
58 'settings' => [
59 'default' => Arr::isTrue($schedule, 'value.default'),
60 'timezone' => $timezone,
61 'date_overrides' => SanitizeService::slotDateOverrides(Arr::get($schedule, 'value.date_overrides', []), 'UTC', $timezone),
62 'weekly_schedules' => SanitizeService::weeklySchedules(Arr::get($schedule, 'value.weekly_schedules', []), 'UTC', $timezone)
63 ]
64 ];
65 }
66
67 return [
68 'availabilities' => [
69 'data' => $formattedSchedules,
70 'total' => $schedules->total(),
71 'per_page' => $schedules->perPage(),
72 ],
73 ];
74 }
75
76 public function getSchedule(Request $request, $scheduleId)
77 {
78 $schedule = Availability::findOrFail($scheduleId);
79
80 $formattedSchedule = AvailabilityService::getFormattedSchedule($schedule);
81
82 return [
83 'schedule' => $formattedSchedule,
84 ];
85 }
86
87 public function getAvailabilityUsages(Request $request, $scheduleId)
88 {
89 $availabilityUsages = CalendarSlot::with(['calendar'])
90 ->where('availability_type', 'existing_schedule')
91 ->where('availability_id', $scheduleId)
92 ->latest()
93 ->paginate();
94
95 return [
96 'usages' => $availabilityUsages
97 ];
98 }
99
100 public function createSchedule(Request $request)
101 {
102 $userId = get_current_user_id();
103
104 $data = $request->all();
105
106 $this->validate($data, [
107 'title' => 'required',
108 ]);
109
110 $isTitleExist = AvailabilityService::isTitleAlreadyExist($data['title'], $userId);
111
112 if ($isTitleExist) {
113 /* translators: %s is the existing availability title */
114 $message = sprintf(__('%s already exists', 'fluent-booking'), $data['title']);
115 return $this->sendError([
116 'message' => $message,
117 ], 422);
118 }
119
120 $timezone = $request->get('timezone');
121
122 if (!$timezone) {
123 $calendar = Calendar::where('user_id', $userId)->where('type', 'simple')->first();
124 if ($calendar) {
125 $timezone = $calendar->author_timezone;
126 } else {
127 $timezone = 'UTC';
128 }
129 }
130
131 // Check if the author has existing schedule
132 $existingSchedule = Availability::where('object_id', $userId)->first();
133
134 $scheduleData = AvailabilityService::createScheduleSchema($userId, $data['title'], !$existingSchedule, $timezone);
135
136 $createdSchedule = Availability::create($scheduleData);
137
138 do_action('fluent_booking/availability_schedule_created', $createdSchedule);
139
140 return [
141 'schedule' => $createdSchedule,
142 'message' => __('Schedule has been created successfully', 'fluent-booking'),
143 ];
144 }
145
146 public function cloneSchedule(Request $request, $scheduleId)
147 {
148 $originalSchedule = Availability::findOrFail($scheduleId);
149
150 $clonedSchedule = $originalSchedule->replicate();
151
152 $clonedSchedule->object_id = get_current_user_id();
153
154 $clonedSchedule->key = $clonedSchedule->key . ' (Clone)';
155
156 $clonedScheduleValue = $clonedSchedule->value;
157
158 $clonedScheduleValue['default'] = false;
159
160 $clonedSchedule->value = $clonedScheduleValue;
161
162 $clonedSchedule->save();
163
164 do_action('fluent_booking/availability_schedule_cloned', $clonedSchedule);
165
166 return [
167 'schedule' => $clonedSchedule,
168 'message' => __('Schedule has been cloned successfully', 'fluent-booking'),
169 ];
170 }
171
172 public function updateSchedule(Request $request, $scheduleId)
173 {
174 $schedule = Availability::findOrFail($scheduleId);
175
176 $scheduleTimezone = Arr::get($schedule, 'value.timezone');
177
178 $data = $request->all();
179
180 $timezone = Arr::get($data, 'schedule.settings.timezone', $scheduleTimezone);
181
182 $scheduleData = [
183 'default' => Arr::isTrue($schedule, 'value.default'),
184 'timezone' => $timezone,
185 'date_overrides' => SanitizeService::slotDateOverrides(Arr::get($data, 'schedule.settings.date_overrides', []), $timezone, 'UTC', null, true),
186 'weekly_schedules' => SanitizeService::weeklySchedules(Arr::get($data, 'schedule.settings.weekly_schedules', []), $timezone, 'UTC', true),
187 ];
188
189 $schedule->value = $scheduleData;
190 $schedule->save();
191
192 do_action('fluent_booking/avaibility_schedule_updated', $schedule, $scheduleData);
193
194 return [
195 'message' => __('Schedule has been updated successfully', 'fluent-booking'),
196 'schedule' => $schedule
197 ];
198 }
199
200 public function updateScheduleTitle(Request $request, $scheduleId)
201 {
202 $title = $request->get('title');
203
204 $schedule = Availability::findOrFail($scheduleId);
205
206 $isTitleExist = AvailabilityService::isTitleAlreadyExist($title, $schedule->object_id, $schedule->key);
207
208 if ($isTitleExist) {
209 /* translators: %s is the existing availability title */
210 $message = sprintf(__('%s already exists', 'fluent-booking'), $title);
211 return $this->sendError([
212 'message' => $message,
213 ], 422);
214 }
215
216 $schedule->key = $title;
217 $schedule->save();
218
219 return [
220 'message' => __('Schedule title has been updated successfully', 'fluent-booking'),
221 'title' => $schedule->key
222 ];
223 }
224
225 public function updateDefaultStatus(Request $request, $scheduleId)
226 {
227 $schedule = Availability::findOrFail($scheduleId);
228
229 $updatedSettings = [
230 'default' => true,
231 'timezone' => Arr::get($schedule, 'value.timezone', 'UTC'),
232 'date_overrides' => Arr::get($schedule, 'value.data_overrides', []),
233 'weekly_schedules' => Arr::get($schedule, 'value.weekly_schedules'),
234 ];
235
236 $schedule->value = $updatedSettings;
237 $schedule->save();
238
239 AvailabilityService::updateOtherDefaultStatus($schedule, $scheduleId);
240
241 return [
242 'message' => __('Status has been updated successfully', 'fluent-booking')
243 ];
244 }
245
246 public function deleteSchedule(Request $request, $scheduleId)
247 {
248 $schedule = Availability::findOrFail($scheduleId);
249
250 if (!$schedule) {
251 return;
252 }
253
254 $isDefault = Arr::isTrue($schedule, 'value.default');
255
256 if ($isDefault) {
257 $calendar = Calendar::where('user_id', $schedule->object_id)->first();
258 if ($calendar) {
259 return $this->sendError([
260 'message' => __('Default Schedule cannot be deleted', 'fluent-booking')
261 ], 422);
262 }
263 }
264
265 $usageCount = AvailabilityService::getAvailabilityUsageCount($scheduleId);
266
267 if ($usageCount) {
268 /* translators: Number of events dependent on the schedule */
269 $message = sprintf(__('Can\'t delete: %s events depend on this schedule', 'fluent-booking'), $usageCount);
270 return $this->sendError([
271 'message' => $message
272 ], 422);
273 }
274
275 do_action('fluent_booking/before_delete_availability_schedule', $schedule);
276
277 $schedule->delete();
278
279 do_action('fluent_booking/after_delete_availability_schedule', $scheduleId);
280
281 return [
282 'message' => __('Schedule Availability has been deleted successfully', 'fluent-booking')
283 ];
284 }
285 }
286