Skip to content

Restricted Dates (Holidays)

Overview

Restricted Dates allow you to set special hours or closures for specific dates. Use this for holidays, special events, or any day that differs from regular business hours.

Key Purpose: Configure exceptions to regular business hours.

Purpose

This page lets you add, edit, and remove date-specific closures or modified operating hours that override the regular weekly business hours for a location.

Key Concepts

  • Restricted Date: A specific calendar date with either a full closure (closed: true) or special operating hours (from/to time range) that overrides the regular business hours.
  • Yearly Recurrence: A yearly flag causes the restriction to repeat annually; a scheduled command (location:update-restricted-dates) updates the year on recurring dates that have already passed.
  • Channel Scope: Each restricted date can independently affect online ordering (affects_online) and in-house/kiosk (affects_in_house), allowing partial closures per channel.
  • Priority Over Business Hours: Restricted dates always take precedence over the regular weekly schedule; the system checks restricted dates first before falling back to normal hours.
  • Location-Level Storage: Restricted dates are stored as an array on the Location model's restricted_dates field and are evaluated in the location's timezone.

Actions

Add a Restricted Date

Select a date, choose whether to close all day or set special hours, optionally enter a reason, and toggle yearly recurrence and channel scope.

Edit a Restricted Date

Modify the special hours, reason, recurrence, or channel scope of an existing restricted date.

Remove a Restricted Date

Delete a restricted date entry so the location reverts to its regular business hours for that day.

Location

  • Backoffice Route: /settings/locations/:id/restricted-dates
  • Backend Model: app/RawModels/Location.php
  • Vue Component: src/views/settings/Locations/forms/LocationRestrictedDates.vue

Fields

Date

PropertyValue
Field IDdate
LabelDate
TypeDate
RequiredYes
ValidationMust be future or today

Description: The specific date to restrict.

Examples:

  • "2024-12-25" (Christmas)
  • "2024-01-01" (New Year's Day)
  • "2024-07-04" (Independence Day)

Closed All Day

PropertyValue
Field IDclosed
LabelClosed All Day
TypeToggle
Defaultfalse

Description: Whether the location is completely closed on this date.

Business Logic:

  • Closed = true: No ordering available
  • Closed = false: Use special hours

Customer Impact:

  • Online Ordering: Date not available for scheduling
  • Kiosk: May show "Closed" message

Special Hours

PropertyValue
Field IDspecial_hours
LabelSpecial Hours
TypeTime Range
RequiredYes (if not closed)
Depends Onclosed = false

Description: Modified operating hours for this date.

Structure:

json
{
  "from": "10:00",
  "to": "16:00"
}

Examples:

  • Christmas Eve: 10:00 - 16:00 (early close)
  • New Year's Eve: 11:00 - 02:00 (late night)
  • Holiday: 12:00 - 20:00 (late open)

Reason

PropertyValue
Field IDreason
LabelReason
TypeText
RequiredNo
Validationmax: 100 characters

Description: Why this date is restricted (for internal reference).

Examples:

  • "Christmas Day"
  • "Staff Party"
  • "Renovation"
  • "Public Holiday"

Recurring

PropertyValue
Field IDrecurring
LabelRepeat Yearly
TypeToggle
Defaultfalse

Description: Whether this restriction repeats every year.

Business Logic:

  • Recurring = true: Applies same date each year
  • Recurring = false: One-time restriction

Use Cases:

  • Christmas (recurring)
  • Easter (not recurring - date changes)
  • One-time event (not recurring)

Affects Online Ordering

PropertyValue
Field IDaffects_online
LabelAffects Online Ordering
TypeToggle
Defaulttrue

Description: Whether this restriction applies to online orders.


Affects In-House

PropertyValue
Field IDaffects_in_house
LabelAffects In-House
TypeToggle
Defaulttrue

Description: Whether this restriction applies to in-house/kiosk orders.


Business Logic

Date Check Flow

Customer selects date for order


Check restricted dates for location

        ├── Date not restricted → Use regular hours

        └── Date is restricted

            ├── Closed = true → Date unavailable

            └── Closed = false → Use special hours


                Check if requested time within special hours
                ├── Yes → Allow order
                └── No → Time unavailable

Priority Order

  1. Restricted dates (highest priority)
  2. Regular business hours

Recurring Date Matching

For recurring restriction:
- Stored date: 2024-12-25
- Current year: 2025
- Matches: 2025-12-25

Date comparison ignores year for recurring restrictions.

Customer Impact

Online Ordering

ScenarioCustomer Experience
Closed dateDate grayed out in calendar
Special hoursOnly times within special hours available
Partial closureLimited time slots shown

Kiosk

  • May display "Closed" message on restricted dates
  • Or operate with special hours

Scheduling

  • Customers cannot schedule orders for closed dates
  • Special hours reflected in available time slots

Relations

Depends On

  • Locations: Restrictions are per-location
  • Business Hours: Overrides regular hours

Affects

  • Online Ordering: Date/time availability
  • Order Capacity: Only applies during open hours
  • Kiosk: Operating hours

Business Rules

  • Restricted dates always take the highest priority; when a date matches a restricted entry, regular business hours are completely ignored for that date.
  • The location:update-restricted-dates Artisan command runs on a schedule to roll forward recurring (yearly: true) restricted dates whose date has already passed, updating the year to the current year while preserving the original date in an original_date field.
  • Dates are parsed in Y-m-d format and evaluated in the location's timezone using Carbon; a mismatch between the stored date format and the location timezone can cause unexpected behavior.
  • Setting affects_online: false while keeping affects_in_house: true allows the physical location to operate on special hours while blocking all online orders for that date (or vice versa).
  • If closed is false, the special_hours field with from and to times is required; omitting it leaves the system without valid hours for that date.

FAQs

  • "How do recurring restricted dates work across years?" A scheduled command automatically updates the year on past recurring dates so they apply in the current year; you do not need to re-enter them annually.
  • "Can I close online ordering but keep in-house open on a holiday?" Yes, set affects_online to false and affects_in_house to true (or vice versa) to control each channel independently.
  • "What about holidays with variable dates like Easter?" Do not mark these as recurring since the date changes each year; add them as one-time restricted dates and re-enter them for the next year.
  • "Can I have multiple time ranges on a restricted date?" The current model supports a single from/to time range per restricted date; for split hours on a special day, consider using two restricted date entries or adjusting business hours.
  • "Do restricted dates affect kiosk ordering?" Yes, when affects_in_house is true the kiosk respects the closure or special hours and may display a "Closed" message.

Troubleshooting

Problem: Date showing as available when should be closed

Causes:

  1. Restricted date not added
  2. Wrong date entered
  3. Wrong location
  4. Cache not updated

Solutions:

  1. Add restricted date
  2. Verify date is correct
  3. Check location assignment
  4. Clear cache

Problem: Can't order during special hours

Causes:

  1. Special hours not set correctly
  2. Time outside special hours
  3. Preparation time buffer

Solutions:

  1. Review special hours setting
  2. Check requested time
  3. Account for prep time

Problem: Recurring holiday not applying

Causes:

  1. Recurring not enabled
  2. Date format issue
  3. Year mismatch in logic

Solutions:

  1. Enable recurring toggle
  2. Verify date format
  3. Check system date handling

Examples

Christmas Day (Closed)

json
{
  "date": "2024-12-25",
  "closed": true,
  "reason": "Christmas Day",
  "recurring": true,
  "affects_online": true,
  "affects_in_house": true
}

Christmas Eve (Early Close)

json
{
  "date": "2024-12-24",
  "closed": false,
  "special_hours": {
    "from": "10:00",
    "to": "16:00"
  },
  "reason": "Christmas Eve - Early Close",
  "recurring": true
}

New Year's Eve (Late Night)

json
{
  "date": "2024-12-31",
  "closed": false,
  "special_hours": {
    "from": "11:00",
    "to": "02:00"
  },
  "reason": "New Year's Eve",
  "recurring": true
}

One-Time Event

json
{
  "date": "2024-07-15",
  "closed": true,
  "reason": "Private Event",
  "recurring": false
}

Public Holiday (Late Open)

json
{
  "date": "2024-04-27",
  "closed": false,
  "special_hours": {
    "from": "12:00",
    "to": "22:00"
  },
  "reason": "King's Day - Late Open",
  "recurring": true
}

Multiple Restricted Dates

json
{
  "restricted_dates": [
    {
      "date": "2024-12-25",
      "closed": true,
      "reason": "Christmas Day",
      "recurring": true
    },
    {
      "date": "2024-12-26",
      "closed": true,
      "reason": "Boxing Day",
      "recurring": true
    },
    {
      "date": "2024-12-24",
      "closed": false,
      "special_hours": { "from": "10:00", "to": "16:00" },
      "reason": "Christmas Eve",
      "recurring": true
    },
    {
      "date": "2024-12-31",
      "closed": false,
      "special_hours": { "from": "11:00", "to": "02:00" },
      "reason": "New Year's Eve",
      "recurring": true
    },
    {
      "date": "2024-01-01",
      "closed": true,
      "reason": "New Year's Day",
      "recurring": true
    }
  ]
}

Online Only Closure

json
{
  "date": "2024-08-15",
  "closed": false,
  "special_hours": { "from": "11:00", "to": "22:00" },
  "reason": "Busy Holiday - No Online Orders",
  "recurring": true,
  "affects_online": false,
  "affects_in_house": true
}

This closes online ordering but keeps in-house/kiosk operating.