@@ -5,17 +5,20 @@
|
||||
*/
|
||||
class RsvTimetableAvailability {
|
||||
/**
|
||||
* @param array<int,int> $occupancy Number of available seats for each time block
|
||||
* @param array<int,int> $occupancy Number of available seats for each time block
|
||||
* @param array<int,int> $lead_time_minutes Minimum lead time in minutes required for each block
|
||||
*/
|
||||
public function __construct(
|
||||
public int $from_minutes,
|
||||
public int $to_minutes,
|
||||
public int $block_size_in_minutes,
|
||||
public array $occupancy
|
||||
public array $occupancy,
|
||||
public array $lead_time_minutes = []
|
||||
) { }
|
||||
|
||||
public function push_block(int $capacity) {
|
||||
$this->occupancy[] = $capacity;
|
||||
$this->to_minutes += $this->block_size_in_minutes;
|
||||
public function push_block(int $capacity, int $min_lead_time_minutes = 0) {
|
||||
$this->occupancy[] = $capacity;
|
||||
$this->lead_time_minutes[] = $min_lead_time_minutes;
|
||||
$this->to_minutes += $this->block_size_in_minutes;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,6 +39,14 @@ class RsvTimetableReservationService {
|
||||
return false;
|
||||
}
|
||||
|
||||
$max_lead_time = max(array_map(fn($c) => (int) $c->min_lead_time_minutes, $overlapping_capacity));
|
||||
$earliest_allowed = new DateTime('now', new DateTimeZone('UTC'));
|
||||
$earliest_allowed->modify("+{$max_lead_time} minutes");
|
||||
if ($start_utc < $earliest_allowed) {
|
||||
Logger::error("Reservation rejected: minimum lead time of {$max_lead_time} minutes not met for timetable_id: $timetable_id");
|
||||
return false;
|
||||
}
|
||||
|
||||
$start_min = $this->time_of_day_minutes($start_utc);
|
||||
$end_min = $this->time_of_day_minutes($end_utc);
|
||||
|
||||
|
||||
@@ -98,7 +98,8 @@ class RsvTimetableService {
|
||||
$availabilities[] = new RsvTimetableAvailability($i * $block_length, ($i + 1) * $block_length, $block_length, []);
|
||||
}
|
||||
|
||||
$availabilities[$availability_idx]->push_block($total_capacity - count($reservation_stack));
|
||||
$max_lead_time = empty($capacity_stack) ? 0 : max(array_map(fn($x) => $x->min_lead_time_minutes, $capacity_stack));
|
||||
$availabilities[$availability_idx]->push_block($total_capacity - count($reservation_stack), $max_lead_time);
|
||||
} else if($total_capacity === 0 && count($availabilities) !== $availability_idx) {
|
||||
$availability_idx++;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user