PluginProbe ʕ •ᴥ•ʔ
LatePoint – Calendar Booking Plugin for Appointments and Events / 5.2.4
LatePoint – Calendar Booking Plugin for Appointments and Events v5.2.4
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 / steps_controller.php
latepoint / lib / controllers Last commit date
activities_controller.php 11 months ago auth_controller.php 9 months ago booking_form_settings_controller.php 1 year ago bookings_controller.php 1 year ago calendars_controller.php 9 months ago carts_controller.php 1 year ago controller.php 9 months ago customer_cabinet_controller.php 9 months ago customers_controller.php 9 months ago dashboard_controller.php 9 months ago default_agent_controller.php 1 year ago events_controller.php 1 year ago form_fields_controller.php 9 months ago integrations_controller.php 9 months 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 9 months ago processes_controller.php 1 year ago search_controller.php 1 year ago services_controller.php 9 months ago settings_controller.php 1 year ago steps_controller.php 9 months ago stripe_connect_controller.php 9 months 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
steps_controller.php
352 lines
1 <?php
2 if ( ! defined( 'ABSPATH' ) ) {
3 exit; // Exit if accessed directly.
4 }
5
6
7 if ( ! class_exists( 'OsStepsController' ) ) :
8
9
10 class OsStepsController extends OsController {
11
12 private $booking;
13
14 function __construct() {
15 parent::__construct();
16 $this->action_access['customer'] = array_merge( $this->action_access['customer'], [ ] );
17 $this->action_access['public'] = array_merge( $this->action_access['public'], [
18 'start',
19 'start_instant',
20 'load_step',
21 'reload_booking_form_summary_panel',
22 'check_order_intent_bookable',
23 'load_datepicker_month',
24 'start_from_order_intent'
25 ] );
26
27 $this->views_folder = LATEPOINT_VIEWS_ABSPATH . 'steps/';
28 $this->vars['page_header'] = __( 'Appointments', 'latepoint' );
29 $this->vars['breadcrumbs'][] = array(
30 'label' => __( 'Appointments', 'latepoint' ),
31 'link' => OsRouterHelper::build_link( [
32 'bookings',
33 'pending_approval'
34 ] )
35 );
36 }
37
38
39 public function start_instant() {
40 $atts = [];
41 if(!empty($this->params['selected_agent'])) $atts['selected_agent'] = sanitize_text_field($this->params['selected_agent']);
42 if(!empty($this->params['selected_service'])) $atts['selected_service'] = sanitize_text_field($this->params['selected_service']);
43 if(!empty($this->params['selected_location'])) $atts['selected_location'] = sanitize_text_field($this->params['selected_location']);
44
45 if(!empty($this->params['hide_side_panel']) && $this->params['hide_side_panel'] == 'yes') $atts['hide_side_panel'] = 'yes';
46 if(!empty($this->params['hide_summary']) && $this->params['hide_summary'] == 'yes') $atts['hide_summary'] = 'yes';
47 if(!empty($this->params['background_pattern'])) $this->vars['background_pattern'] = sanitize_text_field($this->params['background_pattern']);
48
49 $this->vars['atts'] = $atts;
50 $this->set_layout( 'clean' );
51 $this->format_render( __FUNCTION__ );
52 }
53
54 public function load_datepicker_month() {
55 OsStepsHelper::set_required_objects( $this->params );
56
57 $target_date = new OsWpDateTime( $this->params['target_date_string'] );
58 $calendar_settings = [
59 'layout' => $this->params['calendar_layout'] ?? 'classic',
60 'timezone_name' => $this->params['timezone_name'] ?? false,
61 ];
62
63 $calendar_settings['earliest_possible_booking'] = OsSettingsHelper::get_earliest_possible_booking_restriction( OsStepsHelper::$booking_object->service_id ?? false );
64 $calendar_settings['latest_possible_booking'] = OsSettingsHelper::get_latest_possible_booking_restriction( OsStepsHelper::$booking_object->service_id ?? false );
65
66 $this->format_render( 'partials/_monthly_calendar_days', [
67 'target_date' => $target_date,
68 'calendar_settings' => $calendar_settings,
69 'booking_request' => \LatePoint\Misc\BookingRequest::create_from_booking_model( OsStepsHelper::$booking_object )
70 ] );
71 }
72
73
74 public function check_order_intent_bookable() {
75 OsStepsHelper::set_required_objects( $this->params );
76 if(OsStepsHelper::$cart_object->order_id){
77 // already converted, so we are good
78 $this->send_json( [
79 'status' => LATEPOINT_STATUS_SUCCESS,
80 'message' => __( 'Cart has already been converted to order', 'latepoint' )
81 ] );
82 }
83 $order_intent = OsOrderIntentHelper::create_or_update_order_intent( OsStepsHelper::$cart_object, OsStepsHelper::$restrictions, OsStepsHelper::$presets, '', OsStepsHelper::get_customer_object_id() );
84 if ( $order_intent->is_bookable() ) {
85 $this->send_json( [
86 'status' => LATEPOINT_STATUS_SUCCESS,
87 'message' => __( 'Order intent can be converted to order', 'latepoint' )
88 ] );
89 } else {
90 $this->send_json( [
91 'status' => LATEPOINT_STATUS_ERROR,
92 'message' => __( 'Selected booking slot is not available anymore. Please pick a different time slot.', 'latepoint' )
93 ] );
94 }
95 }
96
97 function generate_timeslots_for_day(){
98 OsStepsHelper::set_required_objects( $this->params );
99
100
101
102 wp_send_json( [ 'status' => LATEPOINT_STATUS_SUCCESS, 'message' => '' ] );
103 }
104
105
106 function reload_booking_form_summary_panel() {
107 OsStepsHelper::set_required_objects( $this->params );
108 $this->vars['cart'] = OsStepsHelper::$cart_object;
109
110 if ( OsStepsHelper::is_ready_for_summary() ) {
111 $this->vars['current_step_code'] = $this->params['current_step_code'] ?? '';
112 $this->vars['booking'] = OsStepsHelper::$booking_object;
113 $this->vars['customer'] = OsStepsHelper::get_customer_object();
114 $this->vars['active_cart_item'] = OsStepsHelper::$active_cart_item;
115
116 if ( $this->get_return_format() == 'json' ) {
117 $response_html = $this->render( $this->views_folder . 'partials/_booking_form_summary_panel', 'none' );
118 wp_send_json( [ 'status' => LATEPOINT_STATUS_SUCCESS, 'message' => $response_html ] );
119 exit();
120 } else {
121 echo $this->render( $this->views_folder . 'partials/_booking_form_summary_panel', $this->get_layout() );
122 }
123 } else {
124 wp_send_json( [ 'status' => LATEPOINT_STATUS_SUCCESS, 'message' => '' ] );
125 }
126
127 }
128
129
130 public function start_from_order_intent() {
131 $order_intent = OsOrderIntentHelper::get_order_intent_by_intent_key($this->params['order_intent_key']);
132
133 if ( !$order_intent->is_new_record() ) {
134 $step_codes_to_preload = [];
135 $steps = OsStepsHelper::get_steps();
136 OsStepsHelper::set_required_objects($this->params);
137
138 if ( $order_intent->order_id ) {
139 // if order is created - load it
140 OsStepsHelper::load_order_object( $order_intent->order_id );
141 $current_step_code = 'confirmation';
142 $current_step = $steps[ $current_step_code ];
143
144 $this->vars['price_breakdown_rows'] = OsStepsHelper::$order_object->generate_price_breakdown_rows();
145
146 $steps = [ 'confirmation' => $steps['confirmation'] ];
147
148
149 } else {
150
151 OsStepsHelper::set_cart_object_from_order_intent( $order_intent );
152 $current_step_code = 'verify';
153 $current_step = $steps[ $current_step_code ];
154
155
156 foreach ( OsStepsHelper::$step_codes_in_order as $step_code ) {
157 if ( $step_code == $current_step_code ) {
158 break;
159 } else {
160 $step_codes_to_preload[] = $step_code;
161 }
162 }
163
164 $this->vars['price_breakdown_rows'] = OsStepsHelper::$cart_object->generate_price_breakdown_rows();
165 // order exists - only load confirmation step
166 $this->vars['step_codes_to_preload'] = $step_codes_to_preload;
167
168 }
169
170 $this->vars['cart'] = OsStepsHelper::$cart_object;
171 $this->vars['show_next_btn'] = OsStepsHelper::can_step_show_next_btn( $current_step_code );
172 $this->vars['show_prev_btn'] = OsStepsHelper::can_step_show_prev_btn( $current_step_code );
173 $this->vars['all_steps'] = OsStepsHelper::get_steps( true );
174 $this->vars['steps'] = $steps;
175 $this->vars['current_step'] = $current_step;
176
177 $this->vars['current_step_code'] = $current_step_code;
178 $this->vars['booking'] = OsStepsHelper::$booking_object;
179 $this->vars['customer'] = OsStepsHelper::get_customer_object();
180 $this->vars['active_cart_item'] = OsStepsHelper::$active_cart_item;
181 $this->vars['restrictions'] = OsStepsHelper::$restrictions;
182 $this->vars['presets'] = OsStepsHelper::$presets;
183 $this->vars['booking_element_type'] = 'lightbox';
184 $this->vars['booking_element_styles'] = [];
185
186
187
188
189
190 $this->set_layout( 'none' );
191
192 $this->format_render( 'start', array(), array( 'lightbox_class' => '' ) );
193 } else {
194 $this->send_json( array(
195 'status' => LATEPOINT_STATUS_ERROR,
196 'message' => __( 'Invalid order intent key', 'latepoint' )
197 ) );
198 }
199
200 }
201
202 public function start( array $custom_restrictions = [], array $custom_presets = [], array $booking_element_styles = [], bool $output = true, string $booking_element_type = 'lightbox' ) {
203 $merged_params = $this->params;
204
205 if ( ! empty( $custom_restrictions ) ) {
206 $merged_params['restrictions'] = $custom_restrictions;
207 }
208 if ( ! empty( $custom_presets ) ) {
209 $merged_params['presets'] = $custom_presets;
210 }
211 if( ! empty( $this->params['booking_element_type'] ) ) {
212 $booking_element_type = $this->params['booking_element_type'];
213 }
214
215
216 if(!empty($merged_params['booking_element_styles'])){
217 $booking_element_styles = array_merge( $booking_element_styles, $merged_params['booking_element_styles'] );
218 }
219
220 // set early to check if it's converted or should be emptied
221 OsStepsHelper::set_cart_object();
222 if(!empty(OsStepsHelper::$cart_object->order_id)){
223 OsCartsHelper::reset_cart();
224 OsStepsHelper::set_cart_object();
225 }
226 // clear cart if "shopping cart" feature is not enabled
227 if ( ! OsCartsHelper::can_checkout_multiple_items() ) OsStepsHelper::$cart_object->clear();
228
229
230
231
232 OsStepsHelper::set_required_objects( $merged_params );
233
234 $steps = OsStepsHelper::get_steps();
235
236 $current_step_code = OsStepsHelper::get_step_codes_in_order()[0];
237
238 if ( OsStepsHelper::should_step_be_skipped( $current_step_code ) ) {
239 $current_step_code = OsStepsHelper::get_next_step_code( $current_step_code );
240 }
241 // check if all booking steps have to be skipped, if so - it means the booking object is ready and we can add it to the cart
242 $ready_to_add_to_cart = true;
243 if(OsStepsHelper::$active_cart_item->is_booking()){
244 foreach($steps as $step_code => $step_object) {
245 $step_main_parent_code = explode('__', $step_code);
246 if(!empty($step_main_parent_code[0]) && $step_main_parent_code[0] == 'booking'){
247 $ready_to_add_to_cart = false;
248 break;
249 }
250 }
251 }
252 // looks like item is ready to be added to cart (because all necessary steps/presets where applied in a trigger element), add it to cart
253 if($ready_to_add_to_cart){
254 try{
255 OsStepsHelper::add_current_item_to_cart();
256 }catch(Exception $e){
257 $this->vars['booking'] = OsStepsHelper::$booking_object;
258 if ( $output ) {
259 $this->format_render( 'preset_slot_not_available' );
260 return false;
261 } else {
262 return $this->format_render_return( 'preset_slot_not_available' );
263 }
264 }
265 }
266 $current_step = $steps[ $current_step_code ];
267
268 $this->vars['cart'] = OsStepsHelper::$cart_object;
269 $this->vars['show_next_btn'] = OsStepsHelper::can_step_show_next_btn( $current_step->code );
270 $this->vars['show_prev_btn'] = OsStepsHelper::can_step_show_prev_btn( $current_step->code );
271 $this->vars['all_steps'] = OsStepsHelper::get_steps( true );
272 $this->vars['steps'] = $steps;
273 $this->vars['current_step'] = $current_step;
274
275 $this->vars['current_step_code'] = $current_step->code;
276 $this->vars['booking'] = OsStepsHelper::$booking_object;
277 $this->vars['customer'] = OsStepsHelper::get_customer_object();
278 $this->vars['active_cart_item'] = OsStepsHelper::$active_cart_item;
279 $this->vars['restrictions'] = OsStepsHelper::$restrictions;
280 $this->vars['presets'] = OsStepsHelper::$presets;
281 $this->vars['booking_element_type'] = $booking_element_type;
282 $this->vars['booking_element_styles'] = $booking_element_styles;
283 $this->vars['timezone_name'] = OsTimeHelper::get_timezone_name_from_session();
284
285 $this->set_layout( 'none' );
286
287
288
289 if ( $output ) {
290 $this->format_render( __FUNCTION__, [], [ 'step' => $current_step->code ] );
291 } else {
292 return $this->format_render_return( __FUNCTION__, [], [ 'step' => $current_step->code ] );
293 }
294 }
295
296
297 public function load_step() {
298 OsStepsHelper::set_required_objects( $this->params );
299
300 $current_step_code = OsStepsHelper::retrieve_step_code( $this->params['current_step_code'] );
301 if ( empty( $current_step_code ) ) {
302 return false;
303 }
304
305 $step_direction = $this->params['step_direction'] ?? 'next';
306 $step_code_to_load = false;
307 switch ( $step_direction ) {
308 case 'next':
309 /**
310 * Process step by code
311 *
312 * @param {string} $step_code step code that will be processed
313 * @param {OsBookingModel} $booking booking object
314 * @param {array} $params array of params
315 *
316 * @since 5.0.0
317 * @hook latepoint_process_step
318 *
319 */
320 do_action( 'latepoint_process_step', $current_step_code, OsStepsHelper::$booking_object, $this->params );
321 $step_code_to_load = OsStepsHelper::get_next_step_code( $current_step_code );
322 break;
323 case 'prev':
324 $step_code_to_load = OsStepsHelper::get_prev_step_code( $current_step_code );
325 break;
326 case 'specific':
327 $step_code_to_load = OsStepsHelper::should_step_be_skipped( $current_step_code ) ? OsStepsHelper::get_next_step_code( $current_step_code ) : $current_step_code;
328 break;
329 }
330 if ( $step_code_to_load ) {
331
332 /**
333 * Load step by code
334 *
335 * @param {string} $step_code step code to load
336 * @param {string} $type type of return (json)
337 * @param {array} $params array of params
338 *
339 * @since 5.0.0
340 * @hook latepoint_load_step
341 *
342 */
343 do_action( 'latepoint_load_step', $step_code_to_load, 'json', $this->params );
344 }
345 }
346
347
348 }
349
350
351 endif;
352