Require bookings to be at least 5 days ahead

Guests could previously book for the same day or tomorrow. The earliest
selectable date is now today + 5 days, configured in one place via the
BOOKING_MIN_LEAD_DAYS constant.

- constants.php: new BOOKING_MIN_LEAD_DAYS define (5)
- Service_model::getAvailableTimes(): optional $minLeadDays param, returns
  no slots for dates closer than that; defaults to 0 so existing callers
  are unaffected
- Pages::ajax(): guest actions (getAvailableTimes, isTimeAvailable) pass the
  constant. The admin action getAvailableTimeOptions deliberately does not,
  so staff can still enter phone bookings for tomorrow.
- Pages::booking_process(): rejects an early booking_date POST and redirects
  back to /booking, guarding against a stale page or a crafted request
- booking-form.php: datepicker minDate/defaultDate and the hidden
  booking_date default all derive from the constant

Deployed and verified on test, dev and prod.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MyYsTAAA1kJLMLCResmgTE
This commit is contained in:
Astral04
2026-08-06 11:01:44 +00:00
co-authored by Claude Opus 5
parent 4e1a69c8d4
commit 69ec9e62a6
4 changed files with 31 additions and 5 deletions
@@ -787,7 +787,7 @@
<div class="bookingResultsWrapper">
<div class="availableTimesContainerTitle"></div>
<div class="availableTimesContainer" style="padding:5px;">
<input type="hidden" name="booking_date" id="booking_date" value="<?php echo date('Y-m-d');?>">
<input type="hidden" name="booking_date" id="booking_date" value="<?php echo date('Y-m-d', strtotime('+'.BOOKING_MIN_LEAD_DAYS.' days'));?>">
<input type="hidden" name="booking_start_time" id="booking_time" value="">
<div class="availableTimes">
@@ -1122,7 +1122,8 @@
$("#datepicker").datepicker({
firstDay: 1,
defaultDate: new Date(),
minDate: <?php echo intval(BOOKING_MIN_LEAD_DAYS);?>,
defaultDate: +<?php echo intval(BOOKING_MIN_LEAD_DAYS);?>,
dateFormat: 'yy-mm-dd',
onSelect: function(dateText) {
$('#booking_date').val(this.value);