<?php /* * Copyright (c) 2022 LatePoint LLC. All rights reserved. */ namespace LatePoint\Misc; class BookingSlot{ public string $start_date; public int $start_time; public int $min_capacity = 1; public int $max_capacity = 1; public int $min_capacity_to_be_blocked = 1; public int $booked_capacity = 0; public int $price; function __construct($args = []){ $allowed_props = self::allowed_props(); foreach($args as $key => $arg){ if(in_array($key, $allowed_props)) $this->$key = $arg; } } /** * @param \LatePoint\Misc\BookingSlot[] $booking_slots * @return int */ public static function find_minimum_gap_between_slots(array $booking_slots): int{ $minimum_slot_gap = 0; // calculate minimum gap between slots if(count($booking_slots) > 1){ $prev_start_time = $booking_slots[0]->start_time; $intervals = []; foreach($booking_slots as $booking_slot){ if($prev_start_time){ $gap = $booking_slot->start_time - $prev_start_time; if($gap) $intervals[] = $gap; } $prev_start_time = $booking_slot->start_time; } if($intervals) $minimum_slot_gap = min($intervals); } return $minimum_slot_gap; } public function can_accomodate($total_attendees){ if($this->booked_capacity >= $this->min_capacity_to_be_blocked){ return false; }else{ return $this->available_capacity() >= $total_attendees; } } public function available_capacity(){ return $this->max_capacity - $this->booked_capacity; } public static function allowed_props(): array{ return ['start_time', 'start_date', 'min_capacity', 'max_capacity', 'min_capacity_to_be_blocked', 'booked_capacity', 'available_capacity', 'price']; } }