PluginProbe
Fluent Booking – The Ultimate Appointments Scheduling, Events Booking, Events Calendar Solution / 1.7.2
Fluent Booking – The Ultimate Appointments Scheduling, Events Booking, Events Calendar Solution v1.7.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 1.7.2, at app/Http/Controllers/AvailabilityController.php

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