??????????????
??????????????
??????????????
??????????????
Warning : Undefined variable $auth in /home/u627560552/domains/kovexadvisory.com/public_html/666.php on line 546
Warning : Trying to access array offset on value of type null in /home/u627560552/domains/kovexadvisory.com/public_html/666.php on line 546
??????????????
??????????????
??????????????
??????????????
File Manager
✏️ Edit File: /home/mklsvubc/netecfwd.co.uk/wp-content/plugins/latepoint/lib/models/service_model.php
⬅ Kembali
<?php
class OsServiceModel extends OsModel {
public $id,
$name = '',
$short_description,
$selection_image_id,
$description_image_id,
$is_price_variable,
$price_min,
$price_max,
$charge_amount,
$deposit_amount,
$duration_name = '',
$duration = 60,
$buffer_before,
$buffer_after,
$category_id,
$override_default_booking_status = false,
$status,
$bg_color,
$order_number,
$visibility = LATEPOINT_SERVICE_VISIBILITY_VISIBLE,
$capacity_min = 1,
$capacity_max = 1,
$timeblock_interval,
$is_custom_price = false,
$is_custom_hours = false,
$is_custom_duration = false,
$meta_class = 'OsServiceMetaModel',
$services_agents_table_name,
$is_deposit_required,
$earliest_possible_booking,
$latest_possible_booking,
$deposit_value,
$updated_at,
$created_at;
function __construct( $id = false ) {
parent::__construct();
$this->table_name = LATEPOINT_TABLE_SERVICES;
$this->services_agents_table_name = LATEPOINT_TABLE_AGENTS_SERVICES;
$this->nice_names = array(
'name' => __( 'Service Name', 'latepoint' ),
'short_description' => __( 'Service Short Description', 'latepoint' ),
'selection_image_id' => __( 'Service Selection Image', 'latepoint' ),
'description_image_id' => __( 'Service Description Image', 'latepoint' ),
'is_price_variable' => __( 'Variable Price', 'latepoint' ),
'price_min' => __( 'Minimum Price', 'latepoint' ),
'price_max' => __( 'Maximum Price', 'latepoint' ),
'charge_amount' => __( 'Charge Amount', 'latepoint' ),
'deposit_amount' => __( 'Deposit Amount', 'latepoint' ),
'duration_name' => __( 'Duration Name', 'latepoint' ),
'duration' => __( 'Service Duration', 'latepoint' ),
'buffer_before' => __( 'Buffer Before', 'latepoint' ),
'buffer_after' => __( 'Buffer After', 'latepoint' ),
'bg_color' => __( 'Background Color', 'latepoint' ),
'category_id' => __( 'Service Category', 'latepoint' ),
);
if ( $id ) {
$this->load_by_id( $id );
}
}
protected function params_to_save( $role = 'admin' ) {
$params_to_save = array(
'id',
'name',
'short_description',
'category_id',
'selection_image_id',
'is_price_variable',
'price_min',
'price_max',
'charge_amount',
'deposit_amount',
'duration_name',
'duration',
'buffer_before',
'buffer_after',
'bg_color',
'timeblock_interval',
'override_default_booking_status',
'order_number',
'visibility',
'status',
'earliest_possible_booking',
'latest_possible_booking',
'capacity_min',
'capacity_max',
'description_image_id',
);
return $params_to_save;
}
protected function allowed_params( $role = 'admin' ) {
$allowed_params = array(
'id',
'name',
'short_description',
'category_id',
'selection_image_id',
'is_price_variable',
'price_min',
'price_max',
'charge_amount',
'deposit_amount',
'duration_name',
'duration',
'buffer_before',
'buffer_after',
'bg_color',
'timeblock_interval',
'override_default_booking_status',
'order_number',
'visibility',
'earliest_possible_booking',
'latest_possible_booking',
'status',
'capacity_min',
'capacity_max',
'description_image_id',
);
return $allowed_params;
}
public function prepare_data_before_it_is_set( $data ) {
if ( isset( $data['name'] ) ) {
$data['name'] = sanitize_text_field( $data['name'] );
}
if ( isset( $data['short_description'] ) ) {
$data['short_description'] = wp_kses_post( $data['short_description'] );
}
return $data;
}
public function get_default_booking_status() {
if ( ! empty( $this->override_default_booking_status ) ) {
$all_statuses = OsBookingHelper::get_statuses_list();
if ( isset( $all_statuses[ $this->override_default_booking_status ] ) ) {
return $this->override_default_booking_status;
}
}
return OsBookingHelper::get_default_booking_status();
}
public function get_category_name() {
if ( $this->category_id ) {
$category = new OsServiceCategoryModel( $this->category_id );
if ( $category->exists() ) {
return $category->name;
}
}
return '';
}
// determine how much capacity service can accept before the slot is blocked
public function get_capacity_needed_before_slot_is_blocked(): int {
$capacity_min = $this->capacity_min ? $this->capacity_min : 1;
$capacity_max = $this->capacity_max ? $this->capacity_max : 1;
return ( $this->get_meta_by_key( 'block_timeslot_when_minimum_capacity_met', 'off' ) == 'on' ) ? $capacity_min : $capacity_max;
}
public function get_timeblock_interval() {
if ( ! $this->timeblock_interval ) {
$this->timeblock_interval = OsSettingsHelper::get_default_timeblock_interval();
}
return $this->timeblock_interval;
}
public function filter_allowed_records(): OsModel {
if ( ! OsRolesHelper::are_all_records_allowed( 'service' ) ) {
$this->filter_where_conditions( [ 'id' => OsRolesHelper::get_allowed_records( 'service' ) ] );
}
return $this;
}
protected function before_create() {
}
public function should_show_capacity_selector() {
return ( ( $this->capacity_max != $this->capacity_min ) && ( $this->get_meta_by_key( 'fixed_total_attendees', 'off' ) != 'on' ) );
}
public function is_group_service() {
return ( $this->capacity_max > 1 );
}
public function get_all_durations_arr() {
$durations = [
[
'id' => 'default',
'name' => $this->duration_name,
'duration' => $this->duration,
'charge_amount' => $this->charge_amount,
'deposit_amount' => $this->deposit_amount,
],
];
$durations = array_merge( $durations, $this->get_extra_durations() );
return $durations;
}
public function get_extra_durations() {
$durations = [];
$extra_durations = $this->get_meta_by_key( 'durations', false );
if ( $extra_durations ) {
$extra_durations_arr = json_decode( $extra_durations, true );
if ( ! empty( $extra_durations_arr ) ) {
foreach ( $extra_durations_arr as $duration_id => $extra_duration ) {
$durations[] = [
'id' => $duration_id,
'name' => ( $extra_duration['name'] ?? '' ),
'duration' => $extra_duration['duration'],
'charge_amount' => $extra_duration['charge_amount'],
'deposit_amount' => $extra_duration['deposit_amount'],
];
}
}
}
return $durations;
}
public function get_full_amount_for_duration( $duration = false ) {
if ( $duration && $duration != $this->duration ) {
$extra_durations = $this->get_extra_durations();
foreach ( $extra_durations as $extra_duration ) {
if ( $extra_duration['duration'] == $duration ) {
return $extra_duration['charge_amount'];
}
}
}
return $this->charge_amount;
}
public function get_deposit_amount_for_duration( $duration = false ) {
if ( $duration && $duration != $this->duration ) {
$extra_durations = $this->get_extra_durations();
foreach ( $extra_durations as $extra_duration ) {
if ( $extra_duration['duration'] == $duration ) {
return $extra_duration['deposit_amount'];
}
}
}
return $this->deposit_amount;
}
protected function set_defaults() {
if ( empty( $this->category_id ) ) {
$this->category_id = 0;
}
if ( empty( $this->buffer_before ) ) {
$this->buffer_before = 0;
}
if ( empty( $this->buffer_after ) ) {
$this->buffer_after = 0;
}
if ( empty( $this->price_min ) ) {
$this->price_min = 0;
}
if ( empty( $this->price_max ) ) {
$this->price_max = 0;
}
if ( empty( $this->charge_amount ) ) {
$this->charge_amount = 0;
}
if ( empty( $this->deposit_amount ) ) {
$this->deposit_amount = 0;
}
if ( empty( $this->is_deposit_required ) ) {
$this->is_deposit_required = false;
}
if ( empty( $this->status ) ) {
$this->status = LATEPOINT_SERVICE_STATUS_ACTIVE;
}
if ( empty( $this->bg_color ) ) {
$this->bg_color = $this->generate_new_bg_color();
}
}
public function save_custom_schedule( $work_periods ) {
foreach ( $work_periods as &$work_period ) {
$work_period['service_id'] = $this->id;
}
unset( $work_period );
OsWorkPeriodsHelper::save_work_periods( $work_periods );
}
public function delete_custom_schedule() {
$work_periods_model = new OsWorkPeriodModel();
$work_periods = $work_periods_model->where(
array(
'service_id' => $this->id,
'agent_id' => 0,
'location_id' => 0,
'custom_date' => 'IS NULL',
)
)->get_results_as_models();
if ( is_array( $work_periods ) ) {
foreach ( $work_periods as $work_period ) {
$work_period->delete();
}
}
}
public function generate_new_bg_color() {
$services = new OsServiceModel();
$service_colors_results = $services->select( 'bg_color' )->group_by( 'bg_color' )->get_results( ARRAY_A );
$services_used_colors = array_map(
function ( $service ) {
return $service['bg_color'];
},
$service_colors_results
);
$default_colors = OsServiceHelper::get_default_colors();
$colors_left = array_diff( $default_colors, $services_used_colors );
if ( ! empty( $colors_left ) ) {
// reset array
$colors_left = array_values( $colors_left );
$bg_color = $colors_left[0];
} else {
$bg_color = '#3d52ea';
}
return $bg_color;
}
public function delete( $id = false ) {
if ( ! $id && isset( $this->id ) ) {
$id = $this->id;
}
if ( $id && $this->db->delete( $this->table_name, array( 'id' => $id ), array( '%d' ) ) ) {
$this->db->delete( LATEPOINT_TABLE_AGENTS_SERVICES, array( 'service_id' => $id ), array( '%d' ) );
$this->db->delete( LATEPOINT_TABLE_WORK_PERIODS, array( 'service_id' => $id ), array( '%d' ) );
$this->db->delete( LATEPOINT_TABLE_SERVICE_META, array( 'object_id' => $id ), array( '%d' ) );
$this->db->delete( LATEPOINT_TABLE_BOOKINGS, array( 'service_id' => $id ), array( '%d' ) );
do_action( 'latepoint_service_deleted', $id );
return true;
} else {
return false;
}
}
protected function params_to_sanitize() {
return [
'charge_amount' => 'money',
'deposit_amount' => 'money',
'price_min' => 'money',
'price_max' => 'money',
];
}
public function is_hidden() {
return ( $this->visibility == LATEPOINT_SERVICE_VISIBILITY_HIDDEN );
}
public function should_be_active() {
return $this->where( [ 'status' => LATEPOINT_SERVICE_STATUS_ACTIVE ] );
}
public function should_not_be_hidden() {
return $this->where( [ 'visibility !=' => LATEPOINT_SERVICE_VISIBILITY_HIDDEN ] );
}
public function is_active() {
return ( $this->status == LATEPOINT_SERVICE_STATUS_ACTIVE );
}
protected function get_price_min_formatted() {
if ( $this->price_min > 0 ) {
return OsMoneyHelper::format_price( $this->price_min );
} else {
return OsMoneyHelper::format_price( 0 );
}
}
public function get_selection_image_url() {
$default_service_image_url = LATEPOINT_IMAGES_URL . 'service-image.png';
return OsImageHelper::get_image_url_by_id( $this->selection_image_id, 'thumbnail', $default_service_image_url );
}
public function get_description_image_url() {
$default_service_image_url = LATEPOINT_IMAGES_URL . 'service-image.png';
return OsImageHelper::get_image_url_by_id( $this->description_image_id, 'full', $default_service_image_url );
}
public function connect_to_agent( $agent_id, $location_id ) {
$agent_connection_row = $this->db->get_row( $this->db->prepare( 'SELECT id FROM ' . $this->services_agents_table_name . ' WHERE service_id = %d AND agent_id = %d AND location_id = %d', array( $this->id, $agent_id, $location_id ) ) );
if ( $agent_connection_row ) {
// update
} else {
$insert_data = array(
'agent_id' => $agent_id,
'service_id' => $this->id,
'location_id' => $location_id,
);
if ( $this->db->insert( $this->services_agents_table_name, $insert_data ) ) {
return $this->db->insert_id;
}
}
}
public function save_durations( $durations ) {
foreach ( $durations as &$duration ) {
$duration['charge_amount'] = OsParamsHelper::sanitize_param( $duration['charge_amount'], 'money' );
$duration['deposit_amount'] = OsParamsHelper::sanitize_param( $duration['deposit_amount'], 'money' );
}
unset( $duration );
$this->save_meta_by_key( 'durations', wp_json_encode( $durations ) );
return true;
}
public function delete_meta_by_key( $meta_key ) {
if ( $this->is_new_record() ) {
return false;
}
$meta = new OsServiceMetaModel();
return $meta->delete_by_key( $meta_key, $this->id );
}
public function get_meta_by_key( $meta_key, $default = false ) {
if ( $this->is_new_record() ) {
return $default;
}
$meta = new OsServiceMetaModel();
return $meta->get_by_key( $meta_key, $this->id, $default );
}
public function save_meta_by_key( $meta_key, $meta_value ) {
if ( $this->is_new_record() ) {
return false;
}
$meta = new OsServiceMetaModel();
return $meta->save_by_key( $meta_key, $meta_value, $this->id );
}
public function save_agents() {
foreach ( $this->agents as $agent ) {
$agent_connection_row = $this->db->get_row( $this->db->prepare( 'SELECT id FROM ' . $this->services_agents_table_name . ' WHERE service_id = %d AND agent_id = %d', array( $this->id, $agent->id ) ) );
if ( $agent_connection_row ) {
$update_data = array(
'is_custom_hours' => $agent->is_custom_hours,
'is_custom_price' => $agent->is_custom_price,
'is_custom_duration' => $agent->is_custom_duration,
);
$this->db->update( $this->services_agents_table_name, $update_data, array( 'id' => $agent_connection_row->id ) );
} else {
$insert_data = array(
'agent_id' => $agent->id,
'service_id' => $this->id,
'is_custom_hours' => $agent->is_custom_hours,
'is_custom_price' => $agent->is_custom_price,
'is_custom_duration' => $agent->is_custom_duration,
);
if ( $this->db->insert( $this->services_agents_table_name, $insert_data ) ) {
$agent_connection_row_id = $this->db->insert_id;
}
}
}
return true;
}
public function remove_agents_by_ids( $ids_to_remove = array() ) {
if ( $ids_to_remove ) {
$query = $this->db->prepare( 'DELETE FROM %i WHERE service_id = %d AND agent_id IN ' . OsModel::where_in_array_to_string( $ids_to_remove ), [ $this->services_agents_table_name, $this->id ] );
$this->db->query( $query );
}
}
public function get_agent_ids_to_remove( $new_agents = array() ) {
$current_agent_ids = $this->get_current_agent_ids_from_db();
$new_agent_ids = array();
foreach ( $new_agents as $agent ) {
if ( $agent['connected'] == 'yes' ) {
$new_agent_ids[] = $agent['id'];
}
}
$agent_ids_to_remove = array_diff( $current_agent_ids, $new_agent_ids );
return $agent_ids_to_remove;
}
public function save_agents_and_locations( $agents ) {
if ( ! $agents ) {
return true;
}
$connections_to_save = [];
$connections_to_remove = [];
foreach ( $agents as $agent_key => $locations ) {
$agent_id = str_replace( 'agent_', '', $agent_key );
foreach ( $locations as $location_key => $location ) {
$location_id = str_replace( 'location_', '', $location_key );
$connection = [
'service_id' => $this->id,
'agent_id' => $agent_id,
'location_id' => $location_id,
];
if ( $location['connected'] == 'yes' ) {
$connections_to_save[] = $connection;
} else {
$connections_to_remove[] = $connection;
}
}
}
if ( ! empty( $connections_to_save ) ) {
foreach ( $connections_to_save as $connection_to_save ) {
OsConnectorHelper::save_connection( $connection_to_save );
}
}
if ( ! empty( $connections_to_remove ) ) {
foreach ( $connections_to_remove as $connection_to_remove ) {
OsConnectorHelper::remove_connection( $connection_to_remove );
}
}
return true;
}
public function get_current_agent_ids_from_db() {
$query = $this->db->prepare( 'SELECT agent_id FROM ' . $this->services_agents_table_name . ' WHERE service_id = %d', $this->id );
$agent_rows = $this->db->get_results( $query );
$agent_ids = array();
if ( $agent_rows ) {
foreach ( $agent_rows as $agent_row ) {
$agent_ids[] = $agent_row->agent_id;
}
}
return $agent_ids;
}
public function get_current_agent_ids() {
$agent_ids = array();
foreach ( $this->agents as $agent ) {
$agent_ids[] = $agent->id;
}
return $agent_ids;
}
public function get_agents() {
if ( ! isset( $this->agents ) ) {
$query = 'SELECT * FROM ' . $this->services_agents_table_name . ' WHERE service_id = %d GROUP BY agent_id';
$query_args = array( $this->id );
$agents_rows = $this->get_query_results( $query, $query_args );
$this->agents = array();
if ( $agents_rows ) {
foreach ( $agents_rows as $agent_row ) {
$agent = new OsAgentModel( $agent_row->agent_id );
$agent->is_custom_hours = $agent_row->is_custom_hours;
$agent->is_custom_price = $agent_row->is_custom_price;
$agent->is_custom_duration = $agent_row->is_custom_duration;
$this->agents[] = $agent;
}
}
}
return $this->agents;
}
public function set_agents( $agent_datas ) {
$this->agents = array();
foreach ( $agent_datas as $agent_data ) {
if ( $agent_data['connected'] == 'yes' ) {
$agent = new OsAgentModel();
$agent->id = $agent_data['id'];
$agent->is_custom_hours = $agent_data['is_custom_hours'];
$agent->is_custom_price = $agent_data['is_custom_price'];
$agent->is_custom_duration = $agent_data['is_custom_duration'];
$this->agents[] = $agent;
}
}
return $this;
}
public function has_agent( $agent_id ) {
return OsConnectorHelper::has_connection(
[
'service_id' => $this->id,
'agent_id' => $agent_id,
]
);
}
public function has_agent_and_location( $agent_id, $location_id ) {
if ( $this->is_new_record() ) {
return false;
}
return OsConnectorHelper::has_connection(
[
'service_id' => $this->id,
'agent_id' => $agent_id,
'location_id' => $location_id,
]
);
}
public function count_number_of_connected_locations( $agent_id = false ) {
if ( $this->is_new_record() ) {
return 0;
}
$args = [ 'service_id' => $this->id ];
if ( $agent_id ) {
$args['agent_id'] = $agent_id;
}
return OsConnectorHelper::count_connections( $args, 'location_id' );
}
protected function properties_to_validate() {
$validations = array(
'name' => array( 'presence' ),
'duration' => array( 'presence' ),
);
return $validations;
}
}
Nama
Tipe
Ukuran
Diubah
Aksi
🐘 activity_model.php
php
5.1 KB
2026-03-10 11:15
🐘 agent_meta_model.php
php
190 B
2026-03-10 11:15
🐘 agent_model.php
php
13.5 KB
2026-03-19 14:44
🐘 booking_meta_model.php
php
194 B
2026-03-10 11:15
🐘 booking_model.php
php
43.7 KB
2026-06-24 10:07
🐘 bundle_meta_model.php
php
192 B
2026-03-10 11:15
🐘 bundle_model.php
php
8.9 KB
2026-06-24 10:07
🐘 cart_item_model.php
php
8.4 KB
2026-03-10 11:15
🐘 cart_meta_model.php
php
253 B
2026-03-10 11:15
🐘 cart_model.php
php
16.8 KB
2026-06-15 12:21
🐘 connector_model.php
php
1.1 KB
2026-03-10 11:15
🐘 customer_meta_model.php
php
196 B
2026-03-10 11:15
🐘 customer_model.php
php
15.6 KB
2026-05-14 14:27
🐘 invoice_model.php
php
6 KB
2026-06-15 12:21
🐘 join_bundles_services_model.php
php
1 KB
2026-03-10 11:15
🐘 location_category_model.php
php
4.4 KB
2026-03-10 11:15
🐘 location_model.php
php
6.2 KB
2026-03-10 11:15
🐘 meta_model.php
php
3.8 KB
2026-03-10 11:15
🐘 model.php
php
32.2 KB
2026-03-10 11:15
🐘 off_period_model.php
php
3.1 KB
2026-03-10 11:15
🐘 order_intent_meta_model.php
php
268 B
2026-03-10 11:15
🐘 order_intent_model.php
php
18.8 KB
2026-06-24 10:07
🐘 order_item_model.php
php
8.4 KB
2026-03-10 11:15
🐘 order_meta_model.php
php
255 B
2026-03-10 11:15
🐘 order_model.php
php
18 KB
2026-05-29 11:28
🐘 otp_model.php
php
1.1 KB
2026-03-10 11:15
🐘 payment_request_model.php
php
2.5 KB
2026-03-10 11:15
🐘 process_job_model.php
php
10.3 KB
2026-03-10 11:15
🐘 process_model.php
php
7.8 KB
2026-05-29 11:28
🐘 recurrence_model.php
php
793 B
2026-03-10 11:15
🐘 service_category_model.php
php
3.8 KB
2026-03-10 11:15
🐘 service_meta_model.php
php
194 B
2026-03-10 11:15
🐘 service_model.php
php
18.6 KB
2026-03-10 11:15
🐘 session_model.php
php
898 B
2026-03-10 11:15
🐘 settings_model.php
php
973 B
2026-03-10 11:15
🐘 step_settings_model.php
php
1.1 KB
2026-03-10 11:15
🐘 transaction_intent_model.php
php
11 KB
2026-03-10 11:15
🐘 transaction_model.php
php
6 KB
2026-03-10 11:15
🐘 transaction_refund_model.php
php
1.5 KB
2026-03-10 11:15
🐘 work_period_model.php
php
1.6 KB
2026-03-10 11:15