<?php class OsAgentHelper { static $agents; static $selected_agent = false; static $total_agents; static $filtered_total_agents; public static function quick_agent_btn_html( $agent_id = false, $params = array() ) { $html = ''; if ( $agent_id ) { $params['agent_id'] = $agent_id; } $route = OsRouterHelper::build_route_name( 'agents', !empty($agent_id) ? 'quick_edit' : 'quick_new' ); $params_str = http_build_query( $params ); $html = 'data-os-params="' . esc_attr($params_str) . '" data-os-action="' . esc_attr($route) . '" data-os-output-target="side-panel" data-os-after-call="latepoint_init_quick_agent_form"'; return $html; } /** * @return OsAgentModel[] */ public static function get_allowed_active_agents(): array { $agents = new OsAgentModel(); return $agents->should_be_active()->filter_allowed_records()->get_results_as_models(); } /** * @param bool $filter_allowed_records * * @return int */ public static function count_agents( bool $filter_allowed_records = false ): int { if ( $filter_allowed_records ) { if ( self::$filtered_total_agents ) { return self::$filtered_total_agents; } } else { if ( self::$total_agents ) { return self::$total_agents; } } $agents = new OsAgentModel(); if ( $filter_allowed_records ) { $agents->filter_allowed_records(); } $agents = $agents->should_be_active()->get_results_as_models(); if ( $filter_allowed_records ) { self::$filtered_total_agents = $agents ? count( $agents ) : 0; return self::$filtered_total_agents; } else { self::$total_agents = $agents ? count( $agents ) : 0; return self::$total_agents; } } public static function create_default_agent() { $agent_model = new OsAgentModel(); $current_user = wp_get_current_user(); $agent_model->first_name = $current_user->user_firstname ?? ''; $agent_model->last_name = $current_user->user_lastname ?? ''; $agent_model->email = get_bloginfo( 'admin_email' ); if ( $agent_model->save() ) { $connector = new OsConnectorModel(); $incomplete_connections = $connector->where( [ 'agent_id' => 'IS NULL' ] )->get_results_as_models(); if ( $incomplete_connections ) { foreach ( $incomplete_connections as $incomplete_connection ) { $incomplete_connection->update_attributes( [ 'agent_id' => $agent_model->id ] ); } } $bookings = new OsBookingModel(); $incomplete_bookings = $bookings->where( [ 'agent_id' => 'IS NULL' ] )->get_results_as_models(); if ( $incomplete_bookings ) { foreach ( $incomplete_bookings as $incomplete_booking ) { $incomplete_booking->update_attributes( [ 'agent_id' => $agent_model->id ] ); } } } return $agent_model; } public static function get_default_agent(): OsAgentModel { $agent_model = new OsAgentModel(); $agent = $agent_model->should_be_active()->set_limit( 1 )->get_results_as_models(); if ( $agent && $agent->id ) { return $agent; } else { // no active agents found, try searching disabled agent $disabled_agent = $agent_model->set_limit( 1 )->get_results_as_models(); // create agent only if we truly haven't found anything unfiltered if ( $disabled_agent && $disabled_agent->id ) { return $disabled_agent; } else { return self::create_default_agent(); } } } public static function get_default_agent_id() { $agent = self::get_default_agent(); return $agent->is_new_record() ? 0 : $agent->id; } public static function generate_summary_for_agent( OsBookingModel $booking ): void { if ( OsAgentHelper::count_agents() > 1 && OsSettingsHelper::is_off( 'steps_hide_agent_info' ) && $booking->agent_id && $booking->agent_id != LATEPOINT_ANY_AGENT ) { ?> <div class="summary-box summary-box-agent-info"> <div class="summary-box-heading"> <div class="sbh-item"><?php esc_html_e( 'Agent', 'latepoint' ) ?></div> <div class="sbh-line"></div> </div> <div class="summary-box-content with-media"> <div class="os-avatar-w" style="background-image: url(<?php echo ( $booking->agent->avatar_image_id ) ? esc_url($booking->agent->get_avatar_url()) : ''; ?>)"> <?php if ( ! $booking->agent->avatar_image_id ) { echo '<div class="os-avatar"><span>' . esc_html($booking->agent->get_initials()) . '</span></div>'; } ?> </div> <div class="sbc-content-i"> <div class="sbc-main-item"><?php echo esc_html($booking->agent->full_name); ?></div> <?php if ( OsSettingsHelper::steps_show_agent_bio() ) { echo '<div class="os-trigger-item-details-popup sbc-link-item" data-item-details-popup-id="osItemDetailsPopupAgent_' . esc_attr($booking->agent_id) . '">' . esc_html__( 'Learn More', 'latepoint' ) . '</div>'; echo OsAgentHelper::generate_bio( $booking->agent ); } ?> </div> </div> </div> <?php } } public static function generate_agents_list( array $agents ): void { if ( ! empty( $agents ) ) { ?> <div class="os-agents os-animated-parent os-items os-selectable-items os-as-grid os-three-columns"> <?php $show_agent_bio = OsSettingsHelper::steps_show_agent_bio(); ?> <?php if ( OsSettingsHelper::is_on( 'allow_any_agent' ) ) { ?> <div class="os-animated-child os-item os-selectable-item" data-summary-field-name="agent" data-summary-value="<?php esc_attr_e( 'Any Agent', 'latepoint' ); ?>" data-id-holder=".latepoint_agent_id" data-cart-item-item-data-key="agent_id" data-item-id="<?php echo esc_attr(LATEPOINT_ANY_AGENT); ?>"> <div class="os-animated-self os-item-i"> <div class="os-item-img-w os-with-avatar"> <div class="os-avatar" style="background-image: url(<?php echo esc_url(LATEPOINT_IMAGES_URL . 'default-avatar.jpg'); ?>);"></div> </div> <div class="os-item-name-w"> <div class="os-item-name"><?php esc_html_e( 'Any Agent', 'latepoint' ); ?></div> </div> </div> </div> <?php } ?> <?php foreach ( $agents as $agent ) { ?> <div class="os-animated-child os-item os-selectable-item <?php echo $show_agent_bio ? 'with-details' : ''; ?>" tabindex="0" data-summary-field-name="agent" data-summary-value="<?php echo esc_attr( $agent->name_for_front ); ?>" data-id-holder=".latepoint_agent_id" data-cart-item-item-data-key="agent_id" data-item-id="<?php echo esc_attr($agent->id); ?>"> <div class="os-animated-self os-item-i"> <div class="os-item-img-w os-with-avatar"> <div class="os-avatar" style="background-image: url(<?php echo esc_url($agent->avatar_url); ?>);"></div> </div> <div class="os-item-name-w"> <div class="os-item-name"><?php echo esc_html($agent->name_for_front); ?></div> </div> <?php if ( $show_agent_bio ) { ?> <div class="os-item-details-popup-btn os-trigger-item-details-popup" data-item-details-popup-id="osItemDetailsPopupAgent_<?php echo esc_attr($agent->id); ?>"> <span><?php esc_html_e( 'Learn More', 'latepoint' ); ?></span></div> <?php } ?> </div> </div> <?php } ?> </div> <?php if ( $show_agent_bio ) { foreach ( $agents as $agent ) { echo OsAgentHelper::generate_bio( $agent ); } } } } public static function generate_bio( OsAgentModel $agent ) { $html = ''; $agent_features_html = ''; foreach ( $agent->features_arr as $feature ) { $agent_features_html .= '<div class="item-details-popup-feature"> <div class="item-details-popup-feature-value">' . esc_html( $feature['value'] ) . '</div> <div class="item-details-popup-feature-label">' . esc_html( $feature['label'] ) . '</div> </div>'; } $html .= '<div class="os-item-details-popup" id="osItemDetailsPopupAgent_' . $agent->id . '"> <a href="#" class="os-item-details-popup-close"><span>' . __( 'Close Details', 'latepoint' ) . '</span><i class="latepoint-icon latepoint-icon-common-01"></i></a> <div class="os-item-details-popup-inner"> <div class="item-details-popup-head" style="background-image: url(' . esc_url( $agent->bio_image_url ) . ')"> <h3>' . esc_html( $agent->name_for_front ) . '</h3> <div class="item-details-popup-title">' . esc_html( $agent->title ) . '</div> </div> <div class="item-details-popup-content"> <img class="bio-curve" src="' . LATEPOINT_IMAGES_URL . 'white-curve.png" alt=""> <div class="item-details-popup-features">' . $agent_features_html . '</div> <div class="item-details-popup-content-i"> ' . esc_html( $agent->bio ) . ' </div> </div> </div> </div>'; return $html; } public static function generate_day_schedule_info( $filter ) { $today_date = new OsWpDateTime( 'today' ); $target_date = new OsWpDateTime( $filter->date_from ); ?> <div class="agent-schedule-info"> <div class="agent-today-info"> <?php echo ( $target_date->format( 'Y-m-d' ) == $today_date->format( 'Y-m-d' ) ) ? esc_html__( 'Today', 'latepoint' ) : esc_html($target_date->format( OsSettingsHelper::get_readable_date_format() )); ?> <?php $booking_request = new \LatePoint\Misc\BookingRequest(); $booking_request->agent_id = $filter->agent_id; $booking_request->start_date = $target_date->format( 'Y-m-d' ); $resources = OsResourceHelper::get_resources_grouped_by_day( $booking_request, $target_date, $target_date ); $day_work_periods = []; $periods = []; foreach ( $resources[ $target_date->format( 'Y-m-d' ) ] as $resource ) { if ( ! empty( $resource->work_time_periods ) ) { foreach ( $resource->work_time_periods as $work_time_period ) { if ( $work_time_period->start_time == $work_time_period->end_time ) { continue; } $periods[] = $work_time_period->start_time . ':' . $work_time_period->end_time; } } } $periods = array_unique( $periods ); foreach ( $periods as $work_time_period ) { $period = explode( ':', $work_time_period ); $work_time_period = new \LatePoint\Misc\WorkPeriod(); $work_time_period->start_time = $period[0]; $work_time_period->end_time = $period[1]; $day_work_periods[] = $work_time_period; } $is_working_today = ! empty( $day_work_periods ); ?> <span class="today-status <?php echo ( $is_working_today ) ? 'is-on-duty' : 'is-off-duty'; ?>"><?php echo ( $is_working_today ) ? esc_html__( 'On Duty', 'latepoint' ) : esc_html__( 'Off Duty', 'latepoint' ); ?></span> <div class="today-schedule"> <?php if ( $is_working_today ) { ?> <?php foreach ( $day_work_periods as $period ) { echo '<span>' . esc_html(OsTimeHelper::minutes_to_hours_and_minutes( $period->start_time ) . ' - ' . OsTimeHelper::minutes_to_hours_and_minutes( $period->end_time )) . '</span>'; } ?> <?php } else { esc_html_e( 'Not Available', 'latepoint' ); } ?> </div> </div> <div class="today-bookings"> <?php esc_html_e( 'Bookings', 'latepoint' ); ?> <div class="today-bookings-count"><?php echo esc_html(OsBookingHelper::count_bookings( $filter )); ?></div> </div> </div> <?php } public static function get_full_name( $agent ) { return join( ' ', array( $agent->first_name, $agent->last_name ) ); } public static function get_agent_ids_for_service_and_location( $service_id = false, $location_id = false ): array { $all_agent_ids = OsConnectorHelper::get_connected_object_ids( 'agent_id', [ 'service_id' => $service_id, 'location_id' => $location_id ] ); $agents = new OsAgentModel(); $active_agent_ids = $agents->select( 'id' )->should_be_active()->get_results( ARRAY_A ); if ( $active_agent_ids ) { $active_agent_ids = array_column( $active_agent_ids, 'id' ); $all_agent_ids = array_intersect( $active_agent_ids, $all_agent_ids ); } else { $all_agent_ids = []; } return $all_agent_ids; } /** * @param bool $filter_allowed_records * @param array $agent_ids * * @return array */ public static function get_agents_list( bool $filter_allowed_records = false, array $agent_ids = [], bool $exclude_disabled = false ): array { $agents = new OsAgentModel(); if ( $filter_allowed_records ) { $agents->filter_allowed_records(); } if (!empty($agent_ids)) { $agents->where_in( 'id', $agent_ids ); } if($exclude_disabled){ $agents->where(['status' => LATEPOINT_AGENT_STATUS_ACTIVE]); } $agents = $agents->order_by('status asc, first_name asc, last_name asc')->get_results_as_models(); $agents_list = []; if ( $agents ) { foreach ( $agents as $agent ) { $label = ($agent->status == LATEPOINT_LOCATION_STATUS_DISABLED) ? ($agent->full_name.' ['.esc_html__('Disabled', 'latepoint').']') : $agent->full_name; $agents_list[] = [ 'value' => $agent->id, 'label' => $label ]; } } return $agents_list; } public static function get_avatar_url( $agent ) { $default_avatar = LATEPOINT_DEFAULT_AVATAR_URL; return OsImageHelper::get_image_url_by_id( $agent->avatar_image_id, 'thumbnail', $default_avatar ); } public static function get_bio_image_url( $agent ) { $default_bio_image = LATEPOINT_DEFAULT_AVATAR_URL; return OsImageHelper::get_image_url_by_id( $agent->bio_image_id, 'large', $default_bio_image ); } }