[Back] <?php
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
if ( ! class_exists( 'OsSettingsController' ) ) :
class OsSettingsController extends OsController {
function __construct() {
parent::__construct();
$this->views_folder = LATEPOINT_VIEWS_ABSPATH . 'settings/';
$this->vars['page_header'] = OsMenuHelper::get_menu_items_by_id( 'settings' );
$this->vars['pre_page_header'] = OsMenuHelper::get_label_by_id( 'settings' );
$this->vars['breadcrumbs'][] = array( 'label' => __( 'Settings', 'latepoint' ), 'link' => OsRouterHelper::build_link( OsRouterHelper::build_route_name( 'settings', 'general' ) ) );
}
public function generate_instant_booking_page_url(){
$url_settings = [];
$instant_booking_settings = $this->params['instant_booking'] ?? [];
if(!empty($instant_booking_settings['selected_agent'])) $url_settings['selected_agent'] = $instant_booking_settings['selected_agent'];
if(!empty($instant_booking_settings['selected_location'])) $url_settings['selected_location'] = $instant_booking_settings['selected_location'];
if(!empty($instant_booking_settings['selected_service'])) $url_settings['selected_service'] = $instant_booking_settings['selected_service'];
if(!empty($instant_booking_settings['background_pattern'])) $url_settings['background_pattern'] = $instant_booking_settings['background_pattern'];
if(!empty($instant_booking_settings['hide_side_panel']) && $instant_booking_settings['hide_side_panel'] == LATEPOINT_VALUE_ON){
$url_settings['hide_side_panel'] = 'yes';
}
if(!empty($instant_booking_settings['hide_summary']) && $instant_booking_settings['hide_summary'] == LATEPOINT_VALUE_ON){
$url_settings['hide_summary'] = 'yes';
}
$url = OsSettingsHelper::generate_instant_booking_page_url($url_settings);
$this->send_json( [ 'status' => LATEPOINT_STATUS_SUCCESS, 'message' => $url ] );
}
public function generate_instant_booking_page(){
$agents = new OsAgentModel();
$this->vars['agents'] = $agents->should_be_active()->get_results_as_models();
$services = new OsServiceModel();
$this->vars['services'] = $services->should_be_active()->get_results_as_models();
$locations = new OsLocationModel();
$this->vars['locations'] = $locations->should_be_active()->get_results_as_models();
$url_settings = [];
if(!empty($this->params['agent_id'])){
$this->vars['selected_agent_id'] = sanitize_text_field($this->params['agent_id']);
$url_settings['selected_agent'] = sanitize_text_field($this->params['agent_id']);
}
if(!empty($this->params['location_id'])){
$this->vars['selected_location_id'] = sanitize_text_field($this->params['location_id']);
$url_settings['selected_location'] = sanitize_text_field($this->params['location_id']);
}
if(!empty($this->params['service_id'])){
$this->vars['selected_service_id'] = sanitize_text_field($this->params['service_id']);
$url_settings['selected_service'] = sanitize_text_field($this->params['service_id']);
}
if(!empty($this->params['background_pattern'])){
$this->vars['background_pattern'] = sanitize_text_field($this->params['background_pattern']);
$url_settings['background_pattern'] = sanitize_text_field($this->params['background_pattern']);
}
$this->vars['instant_booking_page_url'] = OsSettingsHelper::generate_instant_booking_page_url($url_settings);
$this->vars['patterns'] = OsSettingsHelper::instant_page_background_patterns();
$this->format_render( __FUNCTION__ );
}
public function export_data() {
$this->set_layout( 'pure' );
$this->vars['content'] = OsSettingsHelper::export_data();
$this->format_render( __FUNCTION__ );
}
public function version_5_intro() {
$this->set_layout( 'full_modal' );
$this->format_render( __FUNCTION__ );
}
public function import_modal() {
$this->set_layout( 'full_modal' );
$this->format_render( __FUNCTION__ );
}
public function get_pro() {
$this->format_render( __FUNCTION__ );
}
public function start_import() {
$this->check_nonce( 'import_json_data' );
if ( $this->params['latepoint_data_erase_acknowledgement'] != 'on' ) {
$this->send_json( array( 'status' => LATEPOINT_STATUS_ERROR, 'message' => __( 'You have to acknowledge the data erase warning', 'latepoint' ) ) );
}
if ( !empty( $this->files['latepoint_json_data']['tmp_name'][0] )) {
WP_Filesystem();
global $wp_filesystem;
$temp_file = $this->files['latepoint_json_data']['tmp_name'][0];
$content = $wp_filesystem->get_contents( $temp_file );
if ( $content === false ) {
$status = LATEPOINT_STATUS_ERROR;
$message = __( 'Error reading import file', 'latepoint' );
} else {
try{
if ( OsSettingsHelper::import_data( $content ) ) {
$status = LATEPOINT_STATUS_SUCCESS;
$message = __( 'Data imported', 'latepoint' );
}
}catch(Exception $e){
$status = LATEPOINT_STATUS_ERROR;
$message = $e->getMessage();
}
}
} else {
$status = LATEPOINT_STATUS_ERROR;
$message = __( 'You must upload a JSON file to import data from', 'latepoint' );
}
$this->send_json( array( 'status' => $status, 'message' => $message ) );
}
public function steps_order_modal() {
$this->vars['steps'] = OsStepsHelper::unflatten_steps( OsStepsHelper::get_step_codes_in_order( true ) );
$this->format_render( __FUNCTION__ );
}
public function update_steps_order() {
$new_order = explode( ',', $this->params['steps_order'] );
$errors = [];
if ( $new_order ) {
$errors = OsStepsHelper::check_steps_for_errors( $new_order, OsStepsHelper::get_step_codes_with_rules() );
if ( empty( $errors ) ) {
OsStepsHelper::save_step_codes_in_order( $new_order );
}
}
if ( empty( $errors ) ) {
$status = LATEPOINT_STATUS_SUCCESS;
$message = __( 'Order of steps has been successfully updated', 'latepoint' );
} else {
$status = LATEPOINT_STATUS_ERROR;
$message = implode( ', ', $errors );
}
if ( $this->get_return_format() == 'json' ) {
$this->send_json( array( 'status' => $status, 'message' => $message ) );
}
}
public function set_menu_layout_style() {
$menu_layout_style = ( isset( $this->params['menu_layout_style'] ) && in_array( $this->params['menu_layout_style'], [ 'full', 'compact' ] ) ) ? $this->params['menu_layout_style'] : 'full';
OsSettingsHelper::set_menu_layout_style( $menu_layout_style );
if ( $this->get_return_format() == 'json' ) {
$this->send_json( array( 'status' => LATEPOINT_STATUS_SUCCESS, 'message' => '' ) );
}
}
public function notifications() {
$this->vars['notification_types'] = OsNotificationsHelper::get_available_notification_types();
$this->format_render( __FUNCTION__ );
}
public function pages() {
$this->vars['breadcrumbs'][] = array( 'label' => __( 'Pages Setup', 'latepoint' ), 'link' => false );
$pages = get_pages();
$this->vars['pages'] = $pages;
$this->format_render( __FUNCTION__ );
}
public function payments() {
$this->vars['breadcrumbs'][] = array( 'label' => __( 'Payment Processing', 'latepoint' ), 'link' => false );
$pages = get_pages();
$this->vars['pages'] = $pages;
$this->vars['payment_processors'] = OsPaymentsHelper::get_payment_processors();
$this->format_render( __FUNCTION__ );
}
public function work_periods() {
$this->vars['breadcrumbs'][] = array( 'label' => __( 'Work Schedule Settings', 'latepoint' ), 'link' => false );
$this->format_render( __FUNCTION__ );
}
public function general() {
$this->vars['breadcrumbs'][] = array( 'label' => __( 'General', 'latepoint' ), 'link' => false );
$this->format_render( __FUNCTION__ );
}
public function remove_chain_schedule() {
$chain_id = $this->params['chain_id'];
if ( $chain_id && OsWorkPeriodsHelper::remove_periods_for_chain_id( $chain_id ) ) {
$response_html = __( 'Date Range Schedule Removed', 'latepoint' );
$status = LATEPOINT_STATUS_SUCCESS;
} else {
$response_html = __( 'Invalid Data', 'latepoint' );
$status = LATEPOINT_STATUS_ERROR;
}
if ( $this->get_return_format() == 'json' ) {
$this->send_json( array( 'status' => $status, 'message' => $response_html ) );
}
}
public function remove_custom_day_schedule() {
$target_date_string = $this->params['date'];
$args = [];
$args['agent_id'] = isset( $this->params['agent_id'] ) ? $this->params['agent_id'] : 0;
$args['service_id'] = isset( $this->params['service_id'] ) ? $this->params['service_id'] : 0;
$args['location_id'] = isset( $this->params['location_id'] ) ? $this->params['location_id'] : 0;
if ( OsUtilHelper::is_date_valid( $target_date_string ) && OsWorkPeriodsHelper::remove_periods_for_date( $target_date_string, $args ) ) {
$response_html = __( 'Custom Day Schedule Removed', 'latepoint' );
$status = LATEPOINT_STATUS_SUCCESS;
} else {
$response_html = __( 'Invalid Date', 'latepoint' );
$status = LATEPOINT_STATUS_ERROR;
}
if ( $this->get_return_format() == 'json' ) {
$this->send_json( array( 'status' => $status, 'message' => $response_html ) );
}
}
public function save_columns_for_bookings_table() {
$selected_columns = [];
if ( isset( $this->params['selected_columns'] ) && $this->params['selected_columns'] ) {
foreach ( $this->params['selected_columns'] as $column_type => $columns ) {
foreach ( $columns as $column_key => $selected_column ) {
if ( $selected_column == 'on' ) {
$selected_columns[ $column_type ][] = $column_key;
}
}
}
}
OsSettingsHelper::save_setting_by_name( 'bookings_table_columns', $selected_columns );
if ( $this->get_return_format() == 'json' ) {
$this->send_json( array( 'status' => LATEPOINT_STATUS_SUCCESS, 'message' => __( 'Columns Saved', 'latepoint' ) ) );
}
}
public function premium_modal(){
$this->set_layout( 'none' );
$response_html = $this->format_render_return( __FUNCTION__ );
$this->send_json( array( 'status' => LATEPOINT_STATUS_SUCCESS, 'message' => $response_html ) );
}
public function save_custom_day_schedule() {
$this->check_nonce( 'save_custom_day_schedule' );
$response_html = __( 'Work Schedule Updated', 'latepoint' );
$status = LATEPOINT_STATUS_SUCCESS;
$day_date = new OsWpDateTime( $this->params['start_custom_date'] );
// if end date is provided and is range
$period_type = ( $this->params['period_type'] == 'range' && $this->params['end_custom_date'] ) ? 'range' : 'single';
$start_date = new OsWpDateTime( $this->params['start_custom_date'] );
$end_date = ( $period_type == 'range' ) ? new OsWpDateTime( $this->params['end_custom_date'] ) : $start_date;
$chain_id = ( isset( $this->params['chain_id'] ) ) ? $this->params['chain_id'] : false;
$existing_work_periods_ids = ( isset( $this->params['existing_work_periods_ids'] ) ) ? $this->params['existing_work_periods_ids'] : false;
// remove existing chained periods by chain ID
if ( $chain_id ) {
$work_periods_to_delete = new OsWorkPeriodModel();
$work_periods_to_delete->delete_where( [ 'chain_id' => $chain_id ] );
if ( $period_type == 'single' ) {
$chain_id = false;
}
} else {
$chain_id = ( $period_type == 'range' ) ? uniqid() : false;
}
// remove existing periods by period ID
if ( $existing_work_periods_ids ) {
$work_periods_to_delete = new OsWorkPeriodModel();
$delete_ids = explode( ',', $existing_work_periods_ids );
foreach ( $delete_ids as $delete_id ) {
$work_periods_to_delete->delete_where( [ 'id' => $delete_id ] );
}
}
for ( $day_date = clone $start_date; $day_date <= $end_date; $day_date->modify( '+1 day' ) ) {
$work_periods = $this->params['work_periods'];
foreach ( $work_periods as &$work_period ) {
$work_period['custom_date'] = $day_date->format( 'Y-m-d' );
$work_period['week_day'] = $day_date->format( 'N' );
$work_period['chain_id'] = $chain_id ? $chain_id : null;
}
unset( $work_period );
OsWorkPeriodsHelper::save_work_periods( $work_periods, true );
}
if ( $this->get_return_format() == 'json' ) {
$this->send_json( array( 'status' => $status, 'message' => $response_html ) );
}
}
public function custom_day_schedule_form() {
$target_date_string = isset( $this->params['target_date'] ) ? $this->params['target_date'] : 'now + 1 month';
$this->vars['date_is_preselected'] = isset( $this->params['target_date'] );
$this->vars['target_date'] = new OsWpDateTime( $target_date_string );
$this->vars['day_off'] = isset( $this->params['day_off'] ) ? true : false;
$this->vars['agent_id'] = isset( $this->params['agent_id'] ) ? $this->params['agent_id'] : 0;
$this->vars['service_id'] = isset( $this->params['service_id'] ) ? $this->params['service_id'] : 0;
$this->vars['location_id'] = isset( $this->params['location_id'] ) ? $this->params['location_id'] : 0;
$chain_id = isset( $this->params['chain_id'] ) ? $this->params['chain_id'] : false;
$this->vars['chain_id'] = $chain_id;
$this->vars['chain_end_date'] = false;
if ( $chain_id ) {
$work_period = new OsWorkPeriodModel();
$chained_work_period = $work_period->where( [ 'chain_id' => $chain_id ] )->order_by( 'custom_date desc' )->set_limit( 1 )->get_results_as_models();
if ( $chained_work_period ) {
$this->vars['chain_end_date'] = new OsWpDateTime( $chained_work_period->custom_date );
} else {
$this->vars['chain_id'] = false;
}
}
$this->format_render( __FUNCTION__ );
}
public function update_work_periods() {
$this->check_nonce( 'update_work_periods' );
OsWorkPeriodsHelper::save_work_periods( $this->params['work_periods'] );
$response_html = __( 'Work Schedule Updated', 'latepoint' );
$status = LATEPOINT_STATUS_SUCCESS;
if ( $this->get_return_format() == 'json' ) {
$this->send_json( array( 'status' => $status, 'message' => $response_html ) );
}
}
public function update() {
$this->check_nonce( 'update_settings' );
$errors = array();
if ( $this->params['settings'] ) {
// make sure thousands and decimal separator are not the same symbol
if ( isset( $this->params['settings']['thousand_separator'] ) && isset( $this->params['settings']['decimal_separator'] ) && ( $this->params['settings']['thousand_separator'] == $this->params['settings']['decimal_separator'] ) ) {
$this->params['settings']['thousand_separator'] = '';
}
foreach ( $this->params['settings'] as $setting_name => $setting_value ) {
$setting = new OsSettingsModel();
$setting = $setting->load_by_name( $setting_name );
$is_new_record = $setting->is_new_record();
if ( ! $is_new_record ) {
$old_setting_value = $setting->value;
}
$setting->name = $setting_name;
$setting->value = OsSettingsHelper::prepare_value( $setting_name, $setting_value );
if ( $setting->save() ) {
if ( $is_new_record ) {
do_action( 'latepoint_setting_created', $setting );
} else {
do_action( 'latepoint_setting_updated', $setting, $old_setting_value );
}
} else {
$errors[] = $setting->get_error_messages();
}
}
do_action( 'latepoint_settings_updated', $this->params['settings'] );
}
if ( empty( $errors ) ) {
$response_html = esc_html__( 'Settings Updated', 'latepoint' );
$status = LATEPOINT_STATUS_SUCCESS;
} else {
$response_html = esc_html__( 'Settings Updated With Errors:', 'latepoint' ) . implode( ', ', $errors );
$status = LATEPOINT_STATUS_ERROR;
}
if ( $this->get_return_format() == 'json' ) {
$this->send_json( array( 'status' => $status, 'message' => $response_html ) );
}
}
public function load_step_settings() {
}
public function load_work_period_form() {
$args = [ 'week_day' => 1, 'agent_id' => 0, 'service_id' => 0, 'location_id' => 0 ];
if ( isset( $this->params['week_day'] ) ) {
$args['week_day'] = $this->params['week_day'];
}
if ( isset( $this->params['agent_id'] ) ) {
$args['agent_id'] = $this->params['agent_id'];
}
if ( isset( $this->params['service_id'] ) ) {
$args['service_id'] = $this->params['service_id'];
}
if ( isset( $this->params['location_id'] ) ) {
$args['location_id'] = $this->params['location_id'];
}
$response_html = OsWorkPeriodsHelper::generate_work_period_form( $args );
$status = LATEPOINT_STATUS_SUCCESS;
if ( $this->get_return_format() == 'json' ) {
$this->send_json( array( 'status' => $status, 'message' => $response_html ) );
}
}
}
endif;