|
Server : LiteSpeed System : Linux premium92.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64 User : rbnsfqys ( 805) PHP Version : 8.1.33 Disable Function : NONE Directory : /home/rbnsfqys/public_html/wp-content/plugins/latepoint/lib/helpers/ |
<?php
class OsLocationHelper {
static $locations;
static $selected_location = false;
static $total_locations;
static $filtered_total_locations;
public static function locations_selector_html() {
return false;
}
public static function get_location_ids_for_service_and_agent( $service_id = false, $agent_id = false ): array {
$all_location_ids = OsConnectorHelper::get_connected_object_ids( 'location_id', [
'service_id' => $service_id,
'agent_id' => $agent_id
] );
$locations = new OsLocationModel();
$active_location_ids = $locations->select( 'id' )->should_be_active()->get_results( ARRAY_A );
if ( $active_location_ids ) {
$active_location_ids = array_column( $active_location_ids, 'id' );
$all_location_ids = array_intersect( $active_location_ids, $all_location_ids );
} else {
$all_location_ids = [];
}
return $all_location_ids;
}
public static function generate_summary_for_location( OsBookingModel $booking ): void {
if ( $booking->location_id && $booking->location_id != LATEPOINT_ANY_LOCATION ) {
$locations = new OsLocationModel();
$location_ids = $locations->select( 'id' )->should_be_active()->get_results( ARRAY_A );
$location = $booking->get_location();
// only show location if there are multiple in database or is location has a full address set
if ( ( is_array( $location_ids ) && count( $location_ids ) > 1 ) || ! empty( $location->full_address ) ) { ?>
<div class="summary-box summary-box-location-info">
<div class="summary-box-heading">
<div class="sbh-item"><?php esc_html_e( 'Location', 'latepoint' ); ?></div>
<div class="sbh-line"></div>
</div>
<div class="summary-box-content with-media">
<div class="os-location-image"></div>
<div class="sbc-content-i">
<div class="sbc-main-item">
<?php
$location = $booking->get_location();
echo esc_html( $location->name );
if ( ! empty( $location->full_address ) ) {
echo ' <a href="' . esc_url( $location->get_google_maps_link() ) . '" target="_blank"><i class="latepoint-icon latepoint-icon-external-link"></i></a>';
}
?>
</div>
<?php if ( $location->full_address ) {
echo '<div class="sbc-sub-item">' . esc_html( $location->full_address ) . '</div>';
} ?>
</div>
</div>
</div><?php
}
}
}
public static function generate_locations_list( $locations = false, $preselected_location = false ): void {
if ( $locations && is_array( $locations ) && ! empty( $locations ) ) { ?>
<div class="os-locations os-animated-parent os-items os-selectable-items os-as-rows">
<?php foreach ( $locations as $location ) { ?>
<?php if ( $preselected_location && $location->id != $preselected_location->id ) {
continue;
} ?>
<div tabindex="0" class="os-animated-child os-item os-selectable-item <?php echo !empty($location->full_address) ? 'with-description' : ''; ?> <?php echo ($preselected_location && $location->id === $preselected_location->id) ? 'selected is-preselected' : ''; ?>"
data-summary-field-name="location"
data-summary-value="<?php echo esc_attr($location->name); ?>"
data-id-holder=".latepoint_location_id"
data-cart-item-item-data-key="location_id"
data-item-id="<?php echo esc_attr($location->id); ?>">
<div class="os-animated-self os-item-i">
<div class="os-item-img-w"
style="background-image: url(<?php echo esc_url($location->selection_image_url); ?>);"></div>
<div class="os-item-name-w">
<div class="os-item-name"><?php echo esc_html($location->name); ?></div>
<?php if ($location->full_address) { ?>
<div class="os-item-desc"><?php echo wp_kses_post($location->full_address); ?></div>
<?php } ?>
</div>
</div>
</div>
<?php } ?>
</div>
<?php }
}
public static function generate_locations_and_categories_list( $parent_id = false, $show_selected_locations = false ) {
$location_categories = new OsLocationCategoryModel();
$args = array();
$args['parent_id'] = $parent_id ? $parent_id : 'IS NULL';
$location_categories = $location_categories->where( $args )->order_by( 'order_number asc' )->get_results_as_models();
$main_parent_class = ( $parent_id ) ? 'os-animated-parent' : 'os-item-categories-main-parent os-animated-parent';
echo '<div class="os-item-categories-holder ' . esc_attr($main_parent_class) . '">';
// generate locations that have no category
if ( $parent_id == false ) {
$locations_without_category = new OsLocationModel();
if ( $show_selected_locations ) {
$locations_without_category->where_in( 'id', $show_selected_locations );
}
$locations_without_category = $locations_without_category->where( [ 'category_id' => 0 ] )->should_be_active()->get_results_as_models();
if ( $locations_without_category ) {
OsLocationHelper::generate_locations_list( $locations_without_category );
}
}
if ( is_array( $location_categories ) ) {
foreach ( $location_categories as $location_category ) {
$locations = [];
$category_locations = $location_category->get_active_locations();
if ( is_array( $category_locations ) ) {
// if show selected locations restriction is set - filter
if ( $show_selected_locations ) {
foreach ( $category_locations as $category_location ) {
if ( in_array( $category_location->id, $show_selected_locations ) ) {
$locations[] = $category_location;
}
}
} else {
$locations = $category_locations;
}
}
$child_categories = new OsLocationCategoryModel();
$count_child_categories = $child_categories->where( [ 'parent_id' => $location_category->id ] )->count();
// show only if it has either at least one child category or location
if ( $count_child_categories || count( $locations ) ) { ?>
<div class="os-item-category-w os-items os-as-rows os-animated-child" data-id="<?php echo esc_attr($location_category->id); ?>">
<div class="os-item-category-info-w os-item os-animated-self with-plus">
<div class="os-item-category-info os-item-i">
<div class="os-item-img-w"
style="background-image: url(<?php echo esc_url($location_category->selection_image_url); ?>);"></div>
<div class="os-item-name-w">
<div class="os-item-name"><?php echo esc_html($location_category->name); ?></div>
</div>
<?php if (!empty($locations)) { ?>
<div class="os-item-child-count">
<span><?php echo (int) count($locations); ?></span> <?php esc_html_e('Locations', 'latepoint'); ?>
</div>
<?php } ?>
</div>
</div>
<?php OsLocationHelper::generate_locations_list( $locations ); ?>
<?php OsLocationHelper::generate_locations_and_categories_list( $location_category->id, $show_selected_locations ); ?>
</div><?php
}
}
}
echo '</div>';
}
public static function get_locations_for_service_and_agent( $service_id = false, $agent_id = false, $active_only = true ) {
$all_location_ids = OsConnectorHelper::get_connected_object_ids( 'location_id', [
'service_id' => $service_id,
'agent_id' => $agent_id
] );
if ( $active_only ) {
$locations = new OsLocationModel();
$active_location_ids = $locations->select( 'id' )->should_be_active()->get_results( ARRAY_A );
if ( $active_location_ids ) {
$active_location_ids = array_column( $active_location_ids, 'id' );
$all_location_ids = array_intersect( $active_location_ids, $all_location_ids );
} else {
$all_location_ids = [];
}
}
return $all_location_ids;
}
/**
* @param bool $filter_allowed_records
*
* @return array
*/
public static function get_locations( bool $filter_allowed_records = false ): array {
$locations = new OsLocationModel();
if ( $filter_allowed_records ) {
$locations->filter_allowed_records();
}
$locations = $locations->get_results_as_models();
return $locations;
}
/**
* @param bool $filter_allowed_records
*
* @return array
*/
public static function get_locations_list( bool $filter_allowed_records = false, array $location_ids = [], bool $exclude_disabled = false ): array {
$locations = new OsLocationModel();
if ( $filter_allowed_records ) {
$locations->filter_allowed_records();
}
if (!empty($location_ids)) {
$locations->where_in('id', $location_ids);
}
if ($exclude_disabled) {
$locations->where(['status' => LATEPOINT_LOCATION_STATUS_ACTIVE]);
}
$locations = $locations->order_by('status asc, name asc')->get_results_as_models();
$locations_list = [];
if ( $locations ) {
foreach ( $locations as $location ) {
$label = ($location->status == LATEPOINT_LOCATION_STATUS_DISABLED) ? ($location->name.' ['.esc_html__('Disabled', 'latepoint').']') : $location->name;
$locations_list[] = [ 'value' => $location->id, 'label' => $label ];
}
}
return $locations_list;
}
/**
* @param bool $filter_allowed_records
*
* @return int
*/
public static function count_locations( bool $filter_allowed_records = false ): int {
if ( $filter_allowed_records ) {
if ( self::$filtered_total_locations ) {
return self::$filtered_total_locations;
}
} else {
if ( self::$total_locations ) {
return self::$total_locations;
}
}
$locations = new OsLocationModel();
if ( $filter_allowed_records ) {
$locations->filter_allowed_records();
}
$locations = $locations->should_be_active()->get_results_as_models();
if ( $filter_allowed_records ) {
self::$filtered_total_locations = $locations ? count( $locations ) : 0;
return self::$filtered_total_locations;
} else {
self::$total_locations = $locations ? count( $locations ) : 0;
return self::$total_locations;
}
}
public static function get_default_location( bool $filter_allowed_records = false ): OsLocationModel {
$location_model = new OsLocationModel();
if ( $filter_allowed_records ) {
$location_model->filter_allowed_records();
}
$location = $location_model->should_be_active()->set_limit( 1 )->get_results_as_models();
if ( $location && $location->id ) {
return $location;
} else {
// no active locations found, try searching disabled location
$disabled_location = $location_model->set_limit( 1 )->get_results_as_models();
if ( $disabled_location && $disabled_location->id ) {
return $disabled_location;
} else {
// create location only if we truly haven't found anything unfiltered
if ( ! $filter_allowed_records || OsRolesHelper::are_all_records_allowed( 'location' ) ) {
return self::create_default_location();
} else {
return new OsLocationModel();
}
}
}
}
public static function get_default_location_id( bool $filter_allowed_records = false ) {
$location = self::get_default_location( $filter_allowed_records );
return $location->is_new_record() ? 0 : $location->id;
}
public static function create_default_location() {
$location_model = new OsLocationModel();
$location_model->name = __( 'Main Location', 'latepoint' );
if ( $location_model->save() ) {
$connector = new OsConnectorModel();
$incomplete_connections = $connector->where( [ 'location_id' => 'IS NULL' ] )->get_results_as_models();
if ( $incomplete_connections ) {
foreach ( $incomplete_connections as $incomplete_connection ) {
$incomplete_connection->update_attributes( [ 'location_id' => $location_model->id ] );
}
}
$bookings = new OsBookingModel();
$incomplete_bookings = $bookings->where( [ 'location_id' => 'IS NULL' ] )->get_results_as_models();
if ( $incomplete_bookings ) {
foreach ( $incomplete_bookings as $incomplete_booking ) {
$incomplete_booking->update_attributes( [ 'location_id' => $location_model->id ] );
}
}
}
return $location_model;
}
public static function generate_location_categories_list( $parent_id = false ) {
$location_categories = new OsLocationCategoryModel();
$args = array();
$args['parent_id'] = $parent_id ? $parent_id : 'IS NULL';
$location_categories = $location_categories->where( $args )->order_by( 'order_number asc' )->get_results_as_models();
if ( ! is_array( $location_categories ) ) {
return;
}
if ( $location_categories ) {
foreach ( $location_categories as $location_category ) { ?>
<div class="os-category-parent-w" data-id="<?php echo esc_attr($location_category->id); ?>">
<div class="os-category-w">
<div class="os-category-head">
<div class="os-category-drag"></div>
<div class="os-category-name"><?php echo esc_html($location_category->name); ?></div>
<div class="os-category-items-meta"><?php esc_html_e('ID: ', 'latepoint'); ?>
<span><?php echo esc_html($location_category->id); ?></span></div>
<div class="os-category-items-count">
<span><?php echo esc_html($location_category->count_locations()); ?></span> <?php esc_html_e('Locations Linked', 'latepoint'); ?>
</div>
<button class="os-category-edit-btn"><i class="latepoint-icon latepoint-icon-edit-3"></i>
</button>
</div>
<div class="os-category-body">
<?php include( LATEPOINT_ADDON_PRO_VIEWS_ABSPATH . 'location_categories/_form.php' ); ?>
</div>
</div>
<div class="os-category-children">
<?php
if ( is_array($location_category->locations) ) {
foreach ( $location_category->locations as $location ) {
echo '<div class="item-in-category-w status-' . esc_attr($location->status) . '" data-id="' . esc_attr($location->id) . '">';
echo '<div class="os-category-item-drag"></div>';
echo '<div class="os-category-item-name">' . esc_html($location->name) . '</div>';
echo '<div class="os-category-item-meta">ID: ' . esc_html($location->id) . '</div>';
echo '</div>';
}
} ?>
<?php OsLocationHelper::generate_location_categories_list( $location_category->id ); ?>
</div>
</div>
<?php
}
}
}
public static function get_location_categories( ): array {
$result = [];
$location_categories = new OsLocationCategoryModel();
$location_categories = $location_categories->order_by('order_number asc')->get_results_as_models();
foreach ( $location_categories as $location_category ) {
$result[$location_category->id] = $location_category->name;
}
return $result;
}
}