<?php if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } if ( ! class_exists( 'OsServicesController' ) ) : class OsServicesController extends OsController { function __construct() { parent::__construct(); $this->views_folder = LATEPOINT_VIEWS_ABSPATH . 'services/'; $this->vars['page_header'] = OsMenuHelper::get_menu_items_by_id( 'services' ); $this->vars['pre_page_header'] = OsMenuHelper::get_label_by_id( 'services' ); $this->vars['breadcrumbs'][] = array( 'label' => __( 'Services', 'latepoint' ), 'link' => OsRouterHelper::build_link( OsRouterHelper::build_route_name( 'services', 'index' ) ) ); } /* Edit service */ public function edit_form() { $service_id = $this->params['id']; $this->vars['pre_page_header'] = ''; $this->vars['page_header'] = __( 'Edit Service', 'latepoint' ); $this->vars['breadcrumbs'][] = array( 'label' => __( 'Edit Service', 'latepoint' ), 'link' => false ); $service = new OsServiceModel( $service_id ); $service_categories = new OsServiceCategoryModel(); $agents = new OsAgentModel(); $locations = new OsLocationModel(); $this->vars['service'] = $service; $this->vars['service_categories_for_select'] = $service_categories->index_for_select(); $this->vars['agents'] = $agents->get_results_as_models(); $this->vars['locations'] = $locations->get_results_as_models(); $custom_work_periods = OsWorkPeriodsHelper::get_work_periods( new \LatePoint\Misc\Filter( [ 'service_id' => $service_id, 'exact_match' => true ] ), true ); $this->vars['custom_work_periods'] = $custom_work_periods; $this->vars['is_custom_schedule'] = ( $custom_work_periods && ( count( $custom_work_periods ) > 0 ) ); $this->format_render( __FUNCTION__ ); } /* New service form */ public function new_form() { $this->vars['pre_page_header'] = ''; $this->vars['page_header'] = __( 'New Service', 'latepoint' ); $this->vars['breadcrumbs'][] = array( 'label' => __( 'Create New Service', 'latepoint' ), 'link' => false ); $service = new OsServiceModel(); $service_categories = new OsServiceCategoryModel(); $agents = new OsAgentModel(); $locations = new OsLocationModel(); $service->bg_color = $service->generate_new_bg_color(); if ( isset( $this->params['service_category_id'] ) ) { $service->category_id = $this->params['service_category_id']; } $this->vars['service'] = $service; $this->vars['service_categories_for_select'] = $service_categories->index_for_select(); $this->vars['agents'] = $agents->get_results_as_models(); $this->vars['locations'] = $locations->get_results_as_models(); $this->vars['custom_work_periods'] = []; $this->vars['is_custom_schedule'] = false; $this->format_render( __FUNCTION__ ); } /* Index of services */ public function index() { $service_categories = new OsServiceCategoryModel(); $service_categories = $service_categories->order_by( 'order_number asc' )->filter_allowed_records()->get_results_as_models(); $this->vars['service_categories'] = $service_categories; $uncategorized_services = new OsServiceModel(); $this->vars['uncategorized_services'] = $uncategorized_services->filter_allowed_records()->should_be_active()->where( array( 'category_id' => [ 'OR' => [ 0, 'IS NULL' ] ] ) )->order_by( 'order_number asc' )->get_results_as_models(); $disabled_services = new OsServiceModel(); $this->vars['disabled_services'] = $disabled_services->filter_allowed_records()->where( [ 'status' => LATEPOINT_SERVICE_STATUS_DISABLED ] )->get_results_as_models(); $this->format_render( __FUNCTION__ ); } /* Create service */ public function create() { $this->update(); } /* Update service */ public function update() { $is_new_record = ( isset( $this->params['service']['id'] ) && $this->params['service']['id'] ) ? false : true; $this->check_nonce( $is_new_record ? 'new_service' : 'edit_service_' . $this->params['service']['id'] ); $service = new OsServiceModel(); $service->set_data( $this->params['service'] ); $extra_response_vars = array(); $this->params['service']['durations'] = isset( $this->params['service']['durations'] ) ? $this->params['service']['durations'] : []; $this->params['service']['agents'] = isset( $this->params['service']['agents'] ) ? $this->params['service']['agents'] : []; if ( $service->save() && $service->save_durations( $this->params['service']['durations'] ) && $service->save_agents_and_locations( $this->params['service']['agents'] ) ) { if ( $is_new_record ) { $response_html = __( 'Service Created. ID:', 'latepoint' ) . $service->id; OsActivitiesHelper::create_activity( array( 'code' => 'service_created', 'service_id' => $service->id ) ); } else { $response_html = __( 'Service Updated. ID:', 'latepoint' ) . $service->id; OsActivitiesHelper::create_activity( array( 'code' => 'service_updated', 'service_id' => $service->id ) ); } $status = LATEPOINT_STATUS_SUCCESS; // save schedules if ( $this->params['is_custom_schedule'] == 'on' ) { $service->save_custom_schedule( $this->params['work_periods'] ); } elseif ( $this->params['is_custom_schedule'] == 'off' ) { $service->delete_custom_schedule(); } $extra_response_vars['record_id'] = $service->id; do_action( 'latepoint_service_saved', $service, $is_new_record, $this->params['service'] ); } else { $response_html = $service->get_error_messages(); $status = LATEPOINT_STATUS_ERROR; } if ( $this->get_return_format() == 'json' ) { $this->send_json( array( 'status' => $status, 'message' => $response_html ) + $extra_response_vars ); } } /* Delete service */ public function destroy() { if ( filter_var( $this->params['id'], FILTER_VALIDATE_INT ) ) { $this->check_nonce( 'destroy_service_' . $this->params['id'] ); $service = new OsServiceModel( $this->params['id'] ); if ( $service->delete() ) { $status = LATEPOINT_STATUS_SUCCESS; $response_html = __( 'Service Removed', 'latepoint' ); } else { $status = LATEPOINT_STATUS_ERROR; $response_html = __( 'Error Removing Service', 'latepoint' ); } } else { $status = LATEPOINT_STATUS_ERROR; $response_html = __( 'Error Removing Service', 'latepoint' ); } if ( $this->get_return_format() == 'json' ) { $this->send_json( array( 'status' => $status, 'message' => $response_html ) ); } } public function duplicate( ) { if(filter_var($this->params['id'], FILTER_VALIDATE_INT)) { $this->check_nonce( 'duplicate_service_' . $this->params['id'] ); $original_service = new OsServiceModel( $this->params['id'] ); $cloned_service = clone $original_service; $cloned_service->id = null; // reset ID to create a new record $cloned_service->name = $cloned_service->name . ' - ' . __('Copy', 'latepoint'); if($cloned_service->save()){ $status = LATEPOINT_STATUS_SUCCESS; $response_html = OsRouterHelper::build_link( OsRouterHelper::build_route_name( 'services', 'edit_form' ), array('id' => $cloned_service->id) ); OsActivitiesHelper::create_activity( array( 'code' => 'service_created', 'service_id' => $cloned_service->id ) ); $work_periods = new OsWorkPeriodModel(); $work_periods = $work_periods->where(['service_id' => $original_service->id])->get_results_as_models(); foreach($work_periods as $work_period){ $new_period = clone $work_period; $new_period->id = null; // reset ID to create a new record $new_period->service_id = $cloned_service->id; // set new service ID $new_period->save(); } $connection_model = new OsConnectorModel(); $connectors = $connection_model->where(['service_id' => $original_service->id])->get_results_as_models(); foreach($connectors as $connector){ $new_connector = clone $connector; $new_connector->id = null; $new_connector->service_id = $cloned_service->id; // set new location ID $new_connector->save(); } $meta = new OsServiceMetaModel(); $meta_items = $meta->where(['object_id' => $original_service->id]) ->where_not_in('meta_key', ['woocommerce_product_id', 'surecart_product_id']) ->get_results_as_models(); foreach($meta_items as $meta_item){ $new_meta_item = clone $meta_item; $new_meta_item->id = null; $new_meta_item->object_id = $cloned_service->id; $new_meta_item->save(); } #available in pro version only if (class_exists('OsServiceExtraConnectorModel')) { $extras = new OsServiceExtraConnectorModel(); $extras = $extras->where(['service_id' => $original_service->id])->get_results_as_models(); foreach($extras as $extra){ $new_extra = clone $extra; $new_extra->id = null; $new_extra->service_id = $cloned_service->id; $new_extra->save(); } } } } else { $status = LATEPOINT_STATUS_ERROR; $response_html = __('Error Creating Service', 'latepoint'); } if($this->get_return_format() == 'json'){ $this->send_json(array('status' => $status, 'message' => $response_html)); } } } endif;