<?php /** * @var $target_date OsWpDateTime * @var $today_date OsWpDateTime * @var $calendar_start OsWpDateTime * @var $calendar_end OsWpDateTime * @var $booking_request \LatePoint\Misc\BookingRequest * @var $calendar_settings array * @var $agents OsAgentModel[] */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly } ?> <?php if($agents){ ?> <?php $agents_head_html = ''; foreach($agents as $agent){ $agents_head_html.= '<div class="ma-head-agent"> <div class="ma-head-agent-avatar" style="background-image: url('.esc_url($agent->get_avatar_url()).')"></div> <div class="ma-head-agent-name">'.esc_html($agent->full_name).'</div> </div>'; } $calendar_not_scrollable_class = (count($agents) > 4) ? '' : 'calendar-month-not-scrollable'; echo '<div class="calendar-month-agents-w '.esc_attr($calendar_not_scrollable_class).'" data-route="'.esc_attr(OsRouterHelper::build_route_name('calendars', 'month_view')).'">'; echo '<div class="ma-floated-days-w">'; echo '<div class="ma-head-info"><span>'.esc_html__('Date', 'latepoint').'</span><span>'.esc_html__('Agent', 'latepoint').'</span></div>'; for($day_date=clone $calendar_start; $day_date<=$calendar_end; $day_date->modify('+1 day')){ echo '<div class="ma-day ma-day-number-'.esc_attr($day_date->format('N')).' '.(($today_date == $day_date) ? 'is-today' : '').'">'; echo '<div class="ma-day-info">'; echo '<span class="ma-day-number">'.esc_html($day_date->format('j')).'</span>'; echo '<span class="ma-day-weekday">'.esc_html(OsUtilHelper::get_weekday_name_by_number($day_date->format('N'), true)).'</span>'; echo '</div>'; echo '</div>'; } echo '</div>'; echo '<div class="ma-days-with-bookings-w">'; echo '<div class="ma-days-with-bookings-i">'; echo '<div class="ma-head">'; echo $agents_head_html; echo '</div>'; for($day_date=clone $calendar_start; $day_date<=$calendar_end; $day_date->modify('+1 day')){ echo '<div class="ma-day ma-day-number-'.esc_attr($day_date->format('N')).' '.(($today_date == $day_date) ? 'is-today' : '').'">'; foreach($agents as $agent){ $day_periods = []; $blocked_blocks = []; foreach($resources[$day_date->format('Y-m-d')] as $resource){ // TODO if multiple resources available for this day - merge blocked periods to find intersections - those intersection perons are truly blocked if($resource->agent_id == $agent->id){ $day_periods = array_merge($day_periods, $resource->work_time_periods); foreach($resource->blocked_time_periods as $blocked_time_period){ $left = max(($blocked_time_period->start_time - $work_boundaries->start_time) / $work_total_minutes * 100, 0); $right = max(($work_boundaries->end_time - $blocked_time_period->end_time) / $work_total_minutes * 100, 0); $blocked_blocks[] = ['left' => $left, 'right' => $right]; } } } usort($day_periods,function($first,$second){ return ($first->start_time > $second->start_time) ? 1 : 0; }); $day_periods = \LatePoint\Misc\TimePeriod::merge_periods($day_periods); $slot_class = !$day_periods ? 'is-day-off' : ''; echo '<div class="ma-day-agent-bookings '. $slot_class . '" ' . OsOrdersHelper::quick_order_btn_html(false, array( 'agent_id' => $agent->id, 'location_id' => $booking_request->location_id, 'start_date' => $day_date->format('Y-m-d'))) . '>'; if($day_periods){ $off_blocks = []; foreach($day_periods as $day_period){ if($day_period->start_time > $work_boundaries->start_time){ if($off_blocks){ $right = ($work_boundaries->end_time - $day_period->start_time) / $work_total_minutes * 100; $off_blocks[count($off_blocks) - 1]['right'] = $right; }else{ $right = ($work_boundaries->end_time - $day_period->start_time) / $work_total_minutes * 100; $off_blocks[] = ['left' => 0, 'right' => $right]; } } if($day_period->end_time < $work_boundaries->end_time){ $left = ($day_period->end_time - $work_boundaries->start_time) / $work_total_minutes * 100; $off_blocks[] = ['left' => $left, 'right' => 0]; } } foreach($blocked_blocks as $blocked_block){ echo '<div class="ma-day-off" style="left:'.esc_attr($blocked_block["left"]).'%; right: '.esc_attr($blocked_block["right"]).'%;"></div>'; } foreach($off_blocks as $off_block){ echo '<div class="ma-day-off" style="left:'.esc_attr($off_block["left"]).'%; right: '.esc_attr($off_block["right"]).'%;"></div>'; } echo '<div class="ma-day-work-periods">'; echo '<div class="ma-day-label">'.esc_html($day_date->format($date_format)).': </div>'; foreach($day_periods as $day_period){ echo '<div class="ma-day-work-period">'; echo esc_html(OsTimeHelper::minutes_to_hours_and_minutes($day_period->start_time).' - '.OsTimeHelper::minutes_to_hours_and_minutes($day_period->end_time)); echo '</div>'; } echo '</div>'; } else { echo '<div class="ma-day-off full"><span><strong>' . esc_html( $day_date->format( $date_format ) ) . ': </strong>' . esc_html__( 'Day Off', 'latepoint' ) . '</span></div>'; } // show booking even if day is off if(!empty($bookings_grouped_by_date_and_agent[$day_date->format('Y-m-d')][$agent->id])){ $overlaps_count = 1; $total_attendees_in_group = 0; $total_bookings_in_group = 0; $total_bookings = count($bookings_grouped_by_date_and_agent[$day_date->format('Y-m-d')][$agent->id]); foreach($bookings_grouped_by_date_and_agent[$day_date->format('Y-m-d')][$agent->id] as $index => $booking){ $next_booking = (($index + 1) < $total_bookings) ? $bookings_grouped_by_date_and_agent[$day_date->format('Y-m-d')][$agent->id][$index + 1] : false; if(OsBookingHelper::check_if_group_bookings($booking, $next_booking)){ // skip this output because multiple bookings in the same slot because next booking has the same start and end time $total_attendees_in_group+= $booking->total_attendees; $total_bookings_in_group++; continue; }else{ if($booking->end_date && ($booking->start_date != $booking->end_date)){ $width = (24*60 - $booking->start_time) / $work_total_minutes * 100; $left = ($booking->start_time - $work_boundaries->start_time) / $work_total_minutes * 100; }else{ $width = ($booking->end_time - $booking->start_time) / $work_total_minutes * 100; $left = ($booking->start_time - $work_boundaries->start_time) / $work_total_minutes * 100; } $max_capacity = OsServiceHelper::get_max_capacity($booking->service); if($max_capacity > 1){ $action_html = OsBookingHelper::group_booking_btn_html($booking->id); }else{ $action_html = OsBookingHelper::quick_booking_btn_html($booking->id); } if($width <= 0 || $left >= 100 || (($left + $width) <= 0)) continue; if($left < 0){ $width = $width + $left; $left = 0; } if(($left + $width) > 100) $width = 100 - $left; echo '<div class="ma-day-booking" style="left: '.esc_attr($left).'%; width: '.esc_attr($width).'%; background-color: '.esc_attr($booking->service->bg_color).'" '.$action_html.'>'; $hide_agent_info = true; include(LATEPOINT_VIEWS_ABSPATH.'dashboard/_booking_info_box_small.php'); echo '</div>'; // time overlaps $overlaps_count = ($next_booking && ($next_booking->start_time < $booking->end_time)) ? $overlaps_count + 1 : 1; // reset $total_attendees_in_group = 0; } } } echo '</div>'; } echo '</div>'; } echo '</div>'; echo '</div>'; echo '</div>'; }else{ ?> <div class="no-results-w"> <div class="icon-w"><i class="latepoint-icon latepoint-icon-grid"></i></div> <h2><?php esc_html_e('No Agents Created', 'latepoint'); ?></h2> <a href="<?php echo esc_url(OsRouterHelper::build_link(OsRouterHelper::build_route_name('agents', 'new_form') )); ?>" class="latepoint-btn"><i class="latepoint-icon latepoint-icon-plus-square"></i><span><?php esc_html_e('Create Agent', 'latepoint'); ?></span></a> </div> <?php } ?> <?php include('_shared.php'); ?>