<?php /* * Copyright (c) 2023 LatePoint LLC. All rights reserved. */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } if ( ! class_exists( 'OsCustomerCabinetController' ) ) : class OsCustomerCabinetController extends OsController { function __construct() { parent::__construct(); $this->action_access['customer'] = array_merge( $this->action_access['customer'], [ 'update', 'request_cancellation', 'print_booking_info', 'print_order_info', 'ical_download', 'process_reschedule_request', 'request_reschedule_calendar', 'view_order_summary_in_lightbox', 'view_booking_summary_in_lightbox', 'scheduling_summary_for_bundle', 'reload_booking_tile' ] ); $this->action_access['public'] = array_merge( $this->action_access['public'], [ 'logout', 'dashboard', 'login', 'do_login', 'password_reset_form', 'request_password_reset_token', 'change_password', 'set_account_password_on_booking_completion' ] ); $this->views_folder = LATEPOINT_VIEWS_ABSPATH . 'customer_cabinet/'; } public function scheduling_summary_for_bundle() { if ( ! filter_var( $this->params['order_item_id'], FILTER_VALIDATE_INT ) ) { exit(); } $order_item = new OsOrderItemModel( $this->params['order_item_id'] ); $order = new OsOrderModel( $order_item->order_id ); if ( $order->is_new_record() || ( $order->customer_id != OsAuthHelper::get_logged_in_customer_id() ) ) { $this->send_json( array( 'status' => LATEPOINT_STATUS_ERROR, 'message' => __('Not Allowed', 'latepoint') ) ); } $bundle = $order_item->build_original_object_from_item_data(); $this->vars['order_item'] = $order_item; $this->vars['bundle'] = $bundle; $this->format_render( __FUNCTION__ ); } public function view_order_summary_in_lightbox() { if ( ! filter_var( $this->params['order_id'], FILTER_VALIDATE_INT ) ) { exit(); } $order = new OsOrderModel( $this->params['order_id'] ); if ( $order->is_new_record() || ( $order->customer_id != OsAuthHelper::get_logged_in_customer_id() ) ) { $this->send_json( array( 'status' => LATEPOINT_STATUS_ERROR, 'message' => __('Not Allowed', 'latepoint') ) ); } $this->vars['order'] = $order; $this->vars['price_breakdown_rows'] = $order->generate_price_breakdown_rows(); $this->format_render( __FUNCTION__ ); } public function view_booking_summary_in_lightbox() { if ( ! filter_var( $this->params['booking_id'], FILTER_VALIDATE_INT ) ) { exit(); } $booking = new OsBookingModel( $this->params['booking_id'] ); $order_item = new OsOrderItemModel( $booking->order_item_id ); $order = new OsOrderModel( $order_item->order_id ); if ( $order->is_new_record() || ( $order->customer_id != OsAuthHelper::get_logged_in_customer_id() ) ) { $this->send_json( array( 'status' => LATEPOINT_STATUS_ERROR, 'message' => __('Not Allowed', 'latepoint') ) ); } $this->vars['booking'] = $booking; $this->vars['order_item'] = $order_item; $this->vars['order'] = $order; $this->format_render( __FUNCTION__ ); } function print_order_info() { if ( ! filter_var( $this->params['latepoint_order_id'], FILTER_VALIDATE_INT ) ) { exit(); } $order_id = $this->params['latepoint_order_id']; if ( empty( $order_id ) ) { return; } $order = new OsOrderModel( $order_id ); if ( $order->id && OsAuthHelper::is_customer_logged_in() && ( $order->customer_id == OsAuthHelper::get_logged_in_customer_id() ) ) { $customer = $order->customer; $this->vars['order'] = $order; $this->vars['customer'] = $customer; $this->set_layout( 'print' ); $content = $this->format_render_return( __FUNCTION__, [], [], true ); echo $content; } } function print_booking_info() { if ( ! filter_var( $this->params['latepoint_booking_id'], FILTER_VALIDATE_INT ) ) { exit(); } $booking_id = $this->params['latepoint_booking_id']; if ( empty( $booking_id ) ) { return; } $booking = new OsBookingModel( $booking_id ); if ( $booking->id && OsAuthHelper::is_customer_logged_in() && ( $booking->customer_id == OsAuthHelper::get_logged_in_customer_id() ) ) { $customer = $booking->customer; $this->vars['booking'] = $booking; $this->vars['customer'] = $customer; $this->set_layout( 'print' ); $content = $this->format_render_return( __FUNCTION__, [], [], true ); echo $content; } } function ical_download() { if ( ! filter_var( $this->params['latepoint_booking_id'], FILTER_VALIDATE_INT ) ) { exit(); } $booking_id = $this->params['latepoint_booking_id']; if ( empty( $booking_id ) ) { return; } $booking = new OsBookingModel( $booking_id ); if ( $booking->id && OsAuthHelper::is_customer_logged_in() && ( $booking->customer_id == OsAuthHelper::get_logged_in_customer_id() ) ) { header( 'Content-Type: text/calendar; charset=utf-8' ); header( 'Content-Disposition: attachment; filename=booking_' . $booking->id . '.ics' ); echo OsBookingHelper::generate_ical_event_string( $booking ); } } function process_reschedule_request() { if ( ! filter_var( $this->params['booking_id'], FILTER_VALIDATE_INT ) ) { exit(); } $booking = new OsBookingModel( $this->params['booking_id'] ); if ( empty( $booking->id ) || empty( $this->params['start_date'] ) || empty( $this->params['start_time'] ) ) { return; } if ( ( OsAuthHelper::get_logged_in_customer_id() == $booking->customer_id ) && OsCustomerHelper::can_reschedule_booking( $booking ) ) { $old_booking = clone $booking; $booking->start_date = $this->params['start_date']; $booking->start_time = $this->params['start_time']; $booking->convert_start_datetime_into_server_timezone($booking->get_customer_timezone_name()); if ( $booking->is_start_date_and_time_set() ) { $booking->calculate_end_date_and_time(); $booking->set_utc_datetimes(); } // check if booking time is still available if ( ! OsBookingHelper::is_booking_request_available( \LatePoint\Misc\BookingRequest::create_from_booking_model( $booking ), [ 'exclude_booking_ids' => [ $booking->id ] ] ) ) { $response_html = __( 'Unfortunately the selected time slot is not available anymore, please select another timeslot.', 'latepoint' ); $status = LATEPOINT_STATUS_ERROR; } else { if ( OsSettingsHelper::is_on( 'change_status_on_customer_reschedule' ) ) { $allowed_statuses = OsBookingHelper::get_statuses_list(); if ( isset( $allowed_statuses[ OsSettingsHelper::get_settings_value( 'status_to_set_after_customer_reschedule' ) ] ) ) { $booking->status = OsSettingsHelper::get_settings_value( 'status_to_set_after_customer_reschedule' ); } } if ( $booking->save() ) { /** * Booking is updated * * @param {OsBookingModel} $this->>booking Updated instance of booking model * @param {OsBookingModel} $old_booking Instance of booking model before it was updated * * @since 4.9.0 * @hook latepoint_booking_updated * */ do_action( 'latepoint_booking_updated', $booking, $old_booking ); $this->vars['booking'] = $booking; $this->vars['timezone_name'] = OsTimeHelper::get_timezone_name_from_session(); $this->vars['viewer'] = 'customer'; $status = LATEPOINT_STATUS_SUCCESS; $this->set_layout( 'none' ); $response_html = $this->format_render_return( __FUNCTION__, [], [], true ); } else { OsDebugHelper::log( 'Error rescheduling appointment', 'booking_reschedule_error', $booking->get_error_messages() ); $response_html = __( 'Error! Please try again later', 'latepoint' ); $status = LATEPOINT_STATUS_ERROR; } } } else { $status = LATEPOINT_STATUS_ERROR; $response_html = __( 'Error! LKDFU343', 'latepoint' ); } if ( $this->get_return_format() == 'json' ) { $this->send_json( array( 'status' => $status, 'message' => $response_html ) ); } } function request_reschedule_calendar() { if ( ! filter_var( $this->params['booking_id'], FILTER_VALIDATE_INT ) ) { exit(); } $booking = new OsBookingModel( $this->params['booking_id'] ); if ( ! empty( $booking->id ) && ( OsAuthHelper::get_logged_in_customer_id() == $booking->customer_id ) && OsCustomerHelper::can_reschedule_booking( $booking ) ) { $this->vars['booking'] = $booking; $this->vars['calendar_start_date'] = ! empty( $this->params['calendar_start_date'] ) ? new OsWpDateTime( $this->params['calendar_start_date'] ) : new OsWpDateTime( 'today' ); $this->vars['timezone_name'] = $booking->get_customer_timezone_name(); $this->set_layout( 'none' ); $response_html = $this->format_render_return( __FUNCTION__, [], [], true ); } else { $status = LATEPOINT_STATUS_ERROR; $response_html = __( 'Reschedule is not allowed', 'latepoint' ); } if ( $this->get_return_format() == 'json' ) { $this->send_json( array( 'status' => $status, 'message' => $response_html ) ); } } function request_cancellation() { if ( ! filter_var( $this->params['id'], FILTER_VALIDATE_INT ) ) { exit(); } $booking_id = $this->params['id']; $booking = new OsBookingModel( $booking_id ); if ( ! empty( $booking->id ) && ( OsAuthHelper::get_logged_in_customer_id() == $booking->customer_id ) && OsCustomerHelper::can_cancel_booking( $booking ) ) { if ( $booking->update_status( LATEPOINT_BOOKING_STATUS_CANCELLED ) ) { $status = LATEPOINT_STATUS_SUCCESS; $response_html = __( 'Appointment Status Updated', 'latepoint' ); } else { $status = LATEPOINT_STATUS_ERROR; $response_html = __( 'Error Updating Booking Status!', 'latepoint' ) . ' ' . implode( ',', $booking->get_error_messages() ); } } else { $status = LATEPOINT_STATUS_ERROR; $response_html = __( 'Not allowed to cancel', 'latepoint' ); } if ( $this->get_return_format() == 'json' ) { $this->send_json( array( 'status' => $status, 'message' => $response_html ) ); } } /* Update profile */ public function update() { $customer = OsAuthHelper::get_logged_in_customer(); if( !$customer ) { exit(); } $this->check_nonce('update_customer_'.$customer->get_uuid()); if($customer){ $old_customer_data = $customer->get_data_vars(); $customer->set_data( $this->params['customer'], LATEPOINT_PARAMS_SCOPE_CUSTOMER ); if ( $customer->save() ) { $response_html = __( 'Information Saved', 'latepoint' ); $status = LATEPOINT_STATUS_SUCCESS; do_action( 'latepoint_customer_updated', $customer, $old_customer_data ); } else { $response_html = $customer->get_error_messages(); $status = LATEPOINT_STATUS_ERROR; } }else{ $response_html = __('Customer not found', 'latepoint'); $status = LATEPOINT_STATUS_ERROR; } if ( $this->get_return_format() == 'json' ) { $this->send_json( array( 'status' => $status, 'message' => $response_html ) ); } } public function reload_booking_tile() { if ( ! filter_var( $this->params['booking_id'], FILTER_VALIDATE_INT ) ) { exit(); } $booking_id = $this->params['booking_id']; $booking = new OsBookingModel( $booking_id ); if ( $booking->id && OsAuthHelper::get_logged_in_customer_id() == $booking->customer_id ) { $this->vars['booking'] = $booking; $this->vars['is_upcoming_booking'] = $booking->is_upcoming(); $this->set_layout( 'none' ); $response_html = $this->format_render_return( '_booking_tile' ); $status = LATEPOINT_STATUS_SUCCESS; } else { $response_html = __( 'Invalid Booking', 'latepoint' ); $status = LATEPOINT_STATUS_ERROR; } if ( $this->get_return_format() == 'json' ) { $this->send_json( array( 'status' => $status, 'message' => $response_html ) ); } } public function logout() { OsAuthHelper::logout_customer(); nocache_headers(); wp_redirect( OsSettingsHelper::get_customer_dashboard_url(), 302 ); } public function login() { $this->set_layout( 'none' ); return $this->format_render_return( __FUNCTION__ ); } public function do_login() { $customer = OsAuthHelper::login_customer( sanitize_email( $this->params['auth']['email'] ), $this->params['auth']['password'] ); if ( $customer ) { $response_html = OsSettingsHelper::get_customer_dashboard_url(); $status = LATEPOINT_STATUS_SUCCESS; } else { $status = LATEPOINT_STATUS_ERROR; $response_html = __( 'Invalid password or email', 'latepoint' ); } if ( $this->get_return_format() == 'json' ) { $this->send_json( array( 'status' => $status, 'message' => $response_html ) ); } } public function password_reset_form() { $this->vars['from_booking'] = ( isset( $this->params['from_booking'] ) && $this->params['from_booking'] ); $this->set_layout( 'none' ); return $this->format_render_return( __FUNCTION__ ); } public function request_password_reset_token() { $this->set_layout( 'none' ); $this->vars['from_booking'] = ( isset( $this->params['from_booking'] ) && $this->params['from_booking'] ); if ( isset( $this->params['password_reset_email'] ) ) { $customer_model = new OsCustomerModel(); $customer = $customer_model->where( [ 'email' => sanitize_email( $this->params['password_reset_email'] ) ] )->set_limit( 1 )->get_results_as_models(); $customer_mailer = new OsCustomerMailer(); if ( $customer && $customer_mailer->password_reset_request( $customer, $customer->account_nonse ) ) { return $this->format_render_return( 'password_reset_form' ); } else { $this->vars['reset_token_error'] = ( $customer ) ? __( 'Error! Email was not sent.', 'latepoint' ) : __( 'Email does not match any customer', 'latepoint' ); return $this->format_render_return( __FUNCTION__ ); } } else { return $this->format_render_return( __FUNCTION__ ); } } public function dashboard( array $params = [] ) { if ( ! OsAuthHelper::is_customer_logged_in() ) { $this->set_layout( 'none' ); return $this->format_render_return( 'login' ); } else { $customer = OsAuthHelper::get_logged_in_customer(); $this->vars['customer'] = $customer; $this->vars['orders'] = $customer->get_orders(); $this->vars['future_bookings'] = $customer->get_future_bookings(); $this->vars['past_bookings'] = $customer->get_past_bookings(); $this->vars['cancelled_bookings'] = $customer->get_cancelled_bookings(); $this->vars['not_scheduled_bundles'] = $customer->get_not_scheduled_bundles(); $this->vars['cart_not_empty'] = ( ! OsCartsHelper::is_current_cart_empty() && OsCartsHelper::can_checkout_multiple_items() ); $this->vars['hide_new_appointment_ui'] = $params['hide_new_appointment_ui'] ?? false; $this->set_layout( 'none' ); return $this->format_render_return( __FUNCTION__ ); } } public function change_password() { $params = OsParamsHelper::permit_params( $this->params, [ 'password_reset_token', 'password', 'password_confirmation', 'change_password_nonce' ] ); if(empty($params['password'])){ $this->send_json( array( 'status' => LATEPOINT_STATUS_ERROR, 'message' => __('Password can not be blank', 'latepoint') ) ); } $customer = false; if ( OsAuthHelper::is_customer_logged_in() ) { $this->check_nonce('change_password_'.OsAuthHelper::get_logged_in_customer_uuid(), $params['change_password_nonce']); $customer = OsAuthHelper::get_logged_in_customer(); } elseif ( !empty($params['password_reset_token'] )) { $params['password_reset_token'] = sanitize_text_field( $params['password_reset_token'] ); $customer = OsCustomerHelper::get_by_account_nonse( $params['password_reset_token'] ); } if ( $customer ) { if ( ! empty( $params['password'] ) && $params['password'] == $params['password_confirmation'] ) { if ( $customer->update_password( $params['password'] ) ) { $status = LATEPOINT_STATUS_SUCCESS; $response_html = __( 'Your password was successfully updated.', 'latepoint' ); } else { $response_html = __( 'Error! Message Code: KS723J', 'latepoint' ); $status = LATEPOINT_STATUS_ERROR; } } else { $status = LATEPOINT_STATUS_ERROR; $response_html = __( 'Error! Passwords do not match.', 'latepoint' ); } } else { $status = LATEPOINT_STATUS_ERROR; $response_html = __( 'Customer Not Found', 'latepoint' ); } if ( $this->get_return_format() == 'json' ) { $this->send_json( array( 'status' => $status, 'message' => $response_html ) ); } } public function set_account_password_on_booking_completion() { $customer = OsAuthHelper::get_logged_in_customer(); if ( $customer ) { $params = OsParamsHelper::permit_params( $this->params, [ 'password', 'password_nonce' ] ); $this->check_nonce('set_initial_password_for_customer_'.$customer->get_uuid(), $params['password_nonce']); if ( ! empty( $params['password'] ) ) { if ( $customer->update_password( $params['password'] ) ) { $status = LATEPOINT_STATUS_SUCCESS; $response_html = __( 'Account Password Set', 'latepoint' ); } else { $response_html = __( 'Error! Message Code: KS723J', 'latepoint' ); $status = LATEPOINT_STATUS_ERROR; } } else { $status = LATEPOINT_STATUS_ERROR; $response_html = __( 'Error! Password is empty.', 'latepoint' ); } } else { $response_html = __( 'Invalid request', 'latepoint' ); $status = LATEPOINT_STATUS_ERROR; } if ( $this->get_return_format() == 'json' ) { $this->send_json( array( 'status' => $status, 'message' => $response_html ) ); } } } endif;