PluginProbe ʕ •ᴥ•ʔ
LatePoint – Calendar Booking Plugin for Appointments and Events / 5.1.2
LatePoint – Calendar Booking Plugin for Appointments and Events v5.1.2
5.6.7 5.6.6 5.6.5 5.6.4 5.6.3 5.6.2 5.6.1 5.6.0 5.5.2 5.5.1 5.5.0 5.4.2 trunk 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.1.8 5.1.9 5.1.91 5.1.92 5.1.93 5.1.94 5.2.0 5.2.1 5.2.10 5.2.11 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.2.8 5.2.9 5.3.0 5.3.1 5.3.2 5.4.0 5.4.1
latepoint / lib / controllers / bookings_controller.php
latepoint / lib / controllers Last commit date
activities_controller.php 1 year ago auth_controller.php 1 year ago booking_form_settings_controller.php 1 year ago bookings_controller.php 1 year ago calendars_controller.php 1 year ago carts_controller.php 1 year ago controller.php 1 year ago customer_cabinet_controller.php 1 year ago customers_controller.php 1 year ago dashboard_controller.php 1 year ago default_agent_controller.php 1 year ago events_controller.php 1 year ago form_fields_controller.php 1 year ago integrations_controller.php 1 year ago invoices_controller.php 1 year ago manage_booking_by_key_controller.php 1 year ago manage_order_by_key_controller.php 1 year ago notifications_controller.php 1 year ago orders_controller.php 1 year ago pro_controller.php 1 year ago process_jobs_controller.php 1 year ago processes_controller.php 1 year ago search_controller.php 1 year ago services_controller.php 1 year ago settings_controller.php 1 year ago steps_controller.php 1 year ago stripe_connect_controller.php 1 year ago support_topics_controller.php 1 year ago todos_controller.php 1 year ago transactions_controller.php 1 year ago wizard_controller.php 1 year ago
bookings_controller.php
357 lines
1 <?php
2 if ( ! defined( 'ABSPATH' ) ) {
3 exit; // Exit if accessed directly.
4 }
5
6
7 if ( ! class_exists( 'OsBookingsController' ) ) :
8
9
10 class OsBookingsController extends OsController {
11
12 private $booking;
13
14 function __construct(){
15 parent::__construct();
16 $this->views_folder = LATEPOINT_VIEWS_ABSPATH . 'bookings/';
17 $this->vars['page_header'] = OsMenuHelper::get_menu_items_by_id('appointments');
18 $this->vars['breadcrumbs'][] = array('label' => __('Appointments', 'latepoint'), 'link' => OsRouterHelper::build_link(['bookings', 'pending_approval'] ) );
19
20 }
21
22 public function view_booking_log(){
23 $activities = new OsActivityModel();
24 $activities = $activities->where(['booking_id' => absint($this->params['booking_id'])])->order_by('id desc')->get_results_as_models();
25
26 $booking = new OsBookingModel($this->params['booking_id']);
27
28 $this->vars['booking'] = $booking;
29 $this->vars['activities'] = $activities;
30
31 $this->format_render(__FUNCTION__);
32 }
33
34 public function grouped_bookings_quick_view(){
35 if(!isset($this->params['booking_id'])) return false;
36
37 $booking = new OsBookingModel($this->params['booking_id']);
38 $this->vars['booking'] = $booking;
39
40 $group_bookings = new OsBookingModel();
41 $group_bookings = $group_bookings->where(['start_time' => $booking->start_time,
42 'start_date' => $booking->start_date,
43 'service_id' => $booking->service_id,
44 'location_id' => $booking->location_id,
45 'agent_id' => $booking->agent_id])->should_not_be_cancelled()->get_results_as_models();
46 $total_attendees = 0;
47 if($group_bookings){
48 foreach($group_bookings as $group_booking){
49 $total_attendees = $total_attendees + $group_booking->total_attendees;
50 }
51 }
52 $this->vars['total_attendees'] = $total_attendees;
53 $this->vars['group_bookings'] = $group_bookings;
54 $this->format_render(__FUNCTION__);
55 }
56
57 public function pending_approval(){
58 $this->vars['page_header'] = __('Pending Appointments', 'latepoint');
59 $this->vars['breadcrumbs'][] = array('label' => __('Pending Appointments', 'latepoint'), 'link' => false );
60
61 $page_number = isset($this->params['page_number']) ? $this->params['page_number'] : 1;
62 $per_page = OsSettingsHelper::get_number_of_records_per_page();
63 $offset = ($page_number > 1) ? (($page_number - 1) * $per_page) : 0;
64
65 $bookings = new OsBookingModel();
66 $query_args = ['status' => OsBookingHelper::get_booking_statuses_for_pending_page()];
67
68 $bookings->where($query_args)->filter_allowed_records();
69
70 $count_total_bookings = clone $bookings;
71 $total_bookings = $count_total_bookings->count();
72
73 $this->vars['bookings'] = $bookings->set_limit($per_page)->set_offset($offset)->order_by('id desc')->get_results_as_models();
74
75 $total_pages = ceil($total_bookings / $per_page);
76
77 $this->vars['total_pages'] = $total_pages;
78 $this->vars['total_bookings'] = $total_bookings;
79 $this->vars['per_page'] = $per_page;
80 $this->vars['current_page_number'] = $page_number;
81
82 $this->vars['showing_from'] = (($page_number - 1) * $per_page) ? (($page_number - 1) * $per_page) : 1;
83 $this->vars['showing_to'] = min($page_number * $per_page, $this->vars['total_bookings']);
84
85 $this->format_render(__FUNCTION__);
86 }
87
88 public function customize_table(){
89 $this->vars['selected_columns'] = OsSettingsHelper::get_selected_columns_for_bookings_table();
90 $this->vars['available_columns'] = OsSettingsHelper::get_available_columns_for_bookings_table();
91
92 $this->format_render(__FUNCTION__);
93 }
94
95 public function index(){
96
97 $this->vars['page_header'] = false;
98 $this->vars['breadcrumbs'][] = array('label' => __('All', 'latepoint'), 'link' => false );
99
100 $page_number = isset($this->params['page_number']) ? $this->params['page_number'] : 1;
101 $per_page = OsSettingsHelper::get_number_of_records_per_page();
102 $offset = ($page_number > 1) ? (($page_number - 1) * $per_page) : 0;
103
104
105 $bookings = new OsBookingModel();
106 $query_args = [];
107
108 $selected_columns = OsSettingsHelper::get_selected_columns_for_bookings_table();
109 $available_columns = OsSettingsHelper::get_available_columns_for_bookings_table();
110
111 $filter = isset($this->params['filter']) ? $this->params['filter'] : false;
112
113 $order_by = ['key' => 'booking_id', 'direction' => 'desc', 'column' => 'id'];
114
115 // TABLE SEARCH FILTERS
116 if($filter){
117 if(!empty($filter['records_ordered_by_key']) && !empty($filter['records_ordered_by_direction'])){
118 if(in_array($filter['records_ordered_by_direction'], ['desc', 'asc'])) $order_by['direction'] = $filter['records_ordered_by_direction'];
119 $order_by['key'] = $filter['records_ordered_by_key'];
120 switch($filter['records_ordered_by_key']){
121 case 'booking_id':
122 $order_by['column'] = 'id';
123 break;
124 case 'booking_start_datetime':
125 $order_by['column'] = 'start_datetime_utc';
126 break;
127 case 'booking_created_on':
128 $order_by['column'] = 'created_at';
129 break;
130 case 'booking_time_left':
131 $order_by['column'] = 'start_datetime_utc';
132 break;
133 }
134 }
135 if(!empty($filter['service_id'])) $query_args['service_id'] = $filter['service_id'];
136 if(!empty($filter['agent_id'])) $query_args['agent_id'] = $filter['agent_id'];
137 if(!empty($filter['location_id'])) $query_args['location_id'] = $filter['location_id'];
138 if(!empty($filter['time_status'])){
139 switch($filter['time_status']){
140 case 'now':
141 $query_args['start_datetime_utc <='] = OsTimeHelper::now_datetime_utc_in_db_format();
142 $query_args['end_datetime_utc >='] = OsTimeHelper::now_datetime_utc_in_db_format();
143 break;
144 case 'upcoming':
145 $query_args['start_datetime_utc >='] = OsTimeHelper::now_datetime_utc_in_db_format();
146 break;
147 case 'past':
148 $query_args['end_datetime_utc <='] = OsTimeHelper::now_datetime_utc_in_db_format();
149 break;
150 }
151 }
152 if(!empty($filter['status'])) $query_args[LATEPOINT_TABLE_BOOKINGS.'.status'] = $filter['status'];
153 if(!empty($filter['payment_status'])) $query_args[LATEPOINT_TABLE_BOOKINGS.'.payment_status'] = $filter['payment_status'];
154 if(!empty($filter['id'])) $query_args[LATEPOINT_TABLE_BOOKINGS.'.id'] = $filter['id'];
155 if(!empty($filter['created_date_from']) && !empty($filter['created_date_to'])){
156 $query_args[LATEPOINT_TABLE_BOOKINGS.'.created_at >='] = $filter['created_date_from'].' 00:00:00';
157 $query_args[LATEPOINT_TABLE_BOOKINGS.'.created_at <='] = $filter['created_date_to'].' 23:59:59';
158 }
159 if(!empty($filter['booking_date_from']) && !empty($filter['booking_date_to'])){
160 $query_args[LATEPOINT_TABLE_BOOKINGS.'.start_date >='] = $filter['booking_date_from'];
161 $query_args[LATEPOINT_TABLE_BOOKINGS.'.start_date <='] = $filter['booking_date_to'];
162 }
163
164 $selected_columns = OsSettingsHelper::get_selected_columns_for_bookings_table();
165 if(!empty($filter['customer'])){
166 $bookings->select(LATEPOINT_TABLE_BOOKINGS.'.*');
167 if(!empty($filter['customer']['full_name'])){
168 $bookings->select(LATEPOINT_TABLE_CUSTOMERS.'.first_name, '.LATEPOINT_TABLE_CUSTOMERS.'.last_name');
169 $query_args['concat_ws(" ", '.LATEPOINT_TABLE_CUSTOMERS.'.first_name,'.LATEPOINT_TABLE_CUSTOMERS.'.last_name) LIKE'] = '%'.$filter['customer']['full_name'].'%';
170 $this->vars['customer_name_query'] = $filter['customer']['full_name'];
171 }
172 $bookings->join(LATEPOINT_TABLE_CUSTOMERS, ['id' => LATEPOINT_TABLE_BOOKINGS.'.customer_id']);
173 if(!empty($selected_columns['customer'])){
174 foreach($selected_columns['customer'] as $customer_column_key){
175 if(!empty($available_columns['customer'][$customer_column_key]) && !empty($filter['customer'][$customer_column_key])){
176 $bookings->select(LATEPOINT_TABLE_CUSTOMERS.'.'.$customer_column_key);
177 $query_args[LATEPOINT_TABLE_CUSTOMERS.'.'.$customer_column_key.' LIKE'] = '%'.$filter['customer'][$customer_column_key].'%';
178 }
179 }
180 }
181 }
182 // filters for custom selected columns, only related to booking fields
183 if(!empty($selected_columns['booking'])){
184 foreach($selected_columns['booking'] as $booking_column_key){
185 if(!empty($available_columns['booking'][$booking_column_key]) && !empty($filter[$booking_column_key])){
186 $query_args[$booking_column_key.' LIKE'] = '%'.$filter[$booking_column_key].'%';
187 }
188 }
189 }
190 }
191
192 $this->vars['agents_list'] = OsAgentHelper::get_agents_list(true);
193 $this->vars['locations_list'] = OsLocationHelper::get_locations_list(true);
194 $this->vars['services_list'] = OsServiceHelper::get_services_list(true);
195
196 $this->vars['selected_columns'] = $selected_columns;
197 $this->vars['available_columns'] = $available_columns;
198
199 $this->vars['records_ordered_by_key'] = $order_by['key'];
200 $this->vars['records_ordered_by_direction'] = $order_by['direction'];
201
202 // OUTPUT CSV IF REQUESTED
203 if(isset($this->params['download']) && $this->params['download'] == 'csv'){
204 $csv_filename = 'all_bookings_'.OsUtilHelper::random_text().'.csv';
205
206 header("Content-Type: text/csv");
207 header("Content-Disposition: attachment; filename={$csv_filename}");
208
209 $labels_row = [ __('ID', 'latepoint'),
210 __('Service', 'latepoint'),
211 __('Start Date & Time', 'latepoint'),
212 __('Duration', 'latepoint'),
213 __('Customer', 'latepoint'),
214 __('Customer Phone', 'latepoint'),
215 __('Customer Email', 'latepoint'),
216 __('Agent', 'latepoint'),
217 __('Agent Phone', 'latepoint'),
218 __('Agent Email', 'latepoint'),
219 __('Status', 'latepoint'),
220 __('Price', 'latepoint'),
221 __('Booked On', 'latepoint') ];
222
223
224 $bookings_data = [];
225 $bookings_data[] = $labels_row;
226
227
228 $bookings_arr = $bookings->where($query_args)->filter_allowed_records()->order_by($order_by['column'].' '.$order_by['direction'])->get_results_as_models();
229
230 if($bookings_arr){
231 foreach($bookings_arr as $booking){
232 $order_item = new OsOrderItemModel( $booking->order_item_id );
233 $values_row = [ $booking->id,
234 $booking->service->name,
235 $booking->nice_start_datetime,
236 $booking->get_total_duration(),
237 $booking->customer->full_name,
238 $booking->customer->phone,
239 $booking->customer->email,
240 $booking->agent->full_name,
241 $booking->agent->phone,
242 $booking->agent->email,
243 $booking->nice_status,
244 OsMoneyHelper::format_price($order_item->get_total(), true, false),
245 $booking->nice_created_at];
246 $values_row = apply_filters('latepoint_booking_row_for_csv_export', $values_row, $booking, $this->params);
247 $bookings_data[] = $values_row;
248 }
249
250 }
251
252 $bookings_data = apply_filters('latepoint_bookings_data_for_csv_export', $bookings_data, $this->params);
253 OsCSVHelper::array_to_csv($bookings_data);
254 return;
255 }
256
257 $query_args = OsRolesHelper::filter_allowed_records_from_arguments_or_filter($query_args);
258 $bookings->where($query_args)->filter_allowed_records();
259 $count_total_bookings = clone $bookings;
260 $total_bookings = $count_total_bookings->count();
261
262 $this->vars['bookings'] = $bookings->set_limit($per_page)->set_offset($offset)->order_by($order_by['column'].' '.$order_by['direction'])->get_results_as_models();
263 $this->vars['total_bookings'] = $total_bookings;
264 $total_pages = ceil($total_bookings / $per_page);
265
266 $this->vars['total_pages'] = $total_pages;
267 $this->vars['per_page'] = $per_page;
268 $this->vars['current_page_number'] = $page_number;
269 $this->vars['total_records'] = $total_bookings;
270
271 $this->vars['showing_from'] = (($page_number - 1) * $per_page) ? (($page_number - 1) * $per_page) : 1;
272 $this->vars['showing_to'] = min($page_number * $per_page, $this->vars['total_bookings']);
273
274 $this->format_render(['json_view_name' => '_table_body', 'html_view_name' => __FUNCTION__], [], ['total_pages' => $total_pages, 'showing_from' => $this->vars['showing_from'], 'showing_to' => $this->vars['showing_to'], 'total_records' => $total_bookings]);
275 }
276
277 function quick_availability(){
278
279 $trigger_form_booking_id = $this->params['trigger_form_booking_id'];
280 $trigger_form_order_item_id = $this->params['trigger_form_order_item_id'];
281
282 $booking = OsOrdersHelper::create_booking_object_from_booking_data_form($this->params['order_items'][$trigger_form_order_item_id]['bookings'][$trigger_form_booking_id]);
283
284 $calendar_start_date = isset($this->params['start_date']) ? new OsWpDateTime($this->params['start_date']) : new OsWpDateTime($booking->start_date);
285 // show one more day before so the current selection does not look weird
286 if(isset($this->params['previous_days'])){
287 $calendar_end_date = clone $calendar_start_date;
288 $calendar_start_date->modify('-30 days');
289 }else{
290 if(!isset($this->params['show_days_only'])) $calendar_start_date->modify('-1 day');
291 $calendar_end_date = clone $calendar_start_date;
292 $calendar_end_date->modify('+30 days');
293 }
294
295 if(OsAuthHelper::get_current_user()->is_single_record_allowed('agent')) $booking->agent_id = OsRolesHelper::get_allowed_records('agent')[0];
296
297 $work_periods = OsWorkPeriodsHelper::get_work_periods(new \LatePoint\Misc\Filter(['date_from' => $calendar_start_date->format('Y-m-d'), 'date_to' => $calendar_end_date->format('Y-m-d'), 'service_id' => $booking->service_id, 'agent_id' => $booking->agent_id, 'location_id' => $booking->location_id]));
298 $work_start_end = OsWorkPeriodsHelper::get_work_start_end_time($work_periods);
299
300 $booking_request = \LatePoint\Misc\BookingRequest::create_from_booking_model($booking);
301 $settings = [];
302 $settings['accessed_from_backend'] = true;
303 if(!$booking->is_new_record()) $settings['exclude_booking_ids'] = [$booking->id];
304 $resources = OsResourceHelper::get_resources_grouped_by_day($booking_request, $calendar_start_date, $calendar_end_date, $settings);
305 $work_boundaries = OsResourceHelper::get_work_boundaries_for_groups_of_resources($resources);
306
307 $this->vars['trigger_form_booking_id'] = $trigger_form_booking_id;
308 $this->vars['trigger_form_order_item_id'] = $trigger_form_order_item_id;
309
310 $this->vars['booking'] = $booking;
311 $this->vars['work_boundaries'] = $work_boundaries;
312 $this->vars['show_days_only'] = isset($this->params['show_days_only']) ? true : false;
313
314 $this->vars['timeblock_interval'] = $booking->service->get_timeblock_interval();
315 $this->vars['calendar_start_date'] = $calendar_start_date;
316 $this->vars['calendar_end_date'] = $calendar_end_date;
317 $this->vars['booking_request'] = $booking_request;
318 $this->vars['resources'] = $resources;
319
320 $agents = new OsAgentModel();
321 $this->vars['agents'] = $agents->filter_allowed_records()->get_results_as_models();
322
323 $this->format_render(__FUNCTION__);
324 }
325
326
327
328
329 function change_status(){
330
331 if(filter_var($this->params['id'], FILTER_VALIDATE_INT)) {
332 $this->check_nonce('change_status_booking_' . $this->params['id']);
333 $booking_id = $this->params['id'];
334 $new_status = $this->params['status'];
335 $booking = new OsBookingModel($booking_id);
336 if (!OsRolesHelper::can_user_make_action_on_model_record($booking, 'edit')) exit;
337
338 if ($booking->update_status($new_status)) {
339 $status = LATEPOINT_STATUS_SUCCESS;
340 $response_html = __('Appointment Status Updated', 'latepoint');
341 } else {
342 $status = LATEPOINT_STATUS_ERROR;
343 $response_html = __('Error Updating Booking Status!', 'latepoint') . ' ' . implode(',', $booking->get_error_messages());
344 }
345 }else{
346 $status = LATEPOINT_STATUS_ERROR;
347 $response_html = __('Error Updating Booking Status! Invalid ID', 'latepoint');
348 }
349
350 if($this->get_return_format() == 'json'){
351 $this->send_json(array('status' => $status, 'message' => $response_html));
352 }
353 }
354
355 }
356
357 endif;