Appearance
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/totime range) that overrides the regular business hours. - Yearly Recurrence: A
yearlyflag 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_datesfield 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
| Property | Value |
|---|---|
| Field ID | date |
| Label | Date |
| Type | Date |
| Required | Yes |
| Validation | Must 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
| Property | Value |
|---|---|
| Field ID | closed |
| Label | Closed All Day |
| Type | Toggle |
| Default | false |
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
| Property | Value |
|---|---|
| Field ID | special_hours |
| Label | Special Hours |
| Type | Time Range |
| Required | Yes (if not closed) |
| Depends On | closed = 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
| Property | Value |
|---|---|
| Field ID | reason |
| Label | Reason |
| Type | Text |
| Required | No |
| Validation | max: 100 characters |
Description: Why this date is restricted (for internal reference).
Examples:
- "Christmas Day"
- "Staff Party"
- "Renovation"
- "Public Holiday"
Recurring
| Property | Value |
|---|---|
| Field ID | recurring |
| Label | Repeat Yearly |
| Type | Toggle |
| Default | false |
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
| Property | Value |
|---|---|
| Field ID | affects_online |
| Label | Affects Online Ordering |
| Type | Toggle |
| Default | true |
Description: Whether this restriction applies to online orders.
Affects In-House
| Property | Value |
|---|---|
| Field ID | affects_in_house |
| Label | Affects In-House |
| Type | Toggle |
| Default | true |
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 unavailablePriority Order
- Restricted dates (highest priority)
- 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
| Scenario | Customer Experience |
|---|---|
| Closed date | Date grayed out in calendar |
| Special hours | Only times within special hours available |
| Partial closure | Limited 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
Related Features
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-datesArtisan 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 anoriginal_datefield. - Dates are parsed in
Y-m-dformat 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: falsewhile keepingaffects_in_house: trueallows the physical location to operate on special hours while blocking all online orders for that date (or vice versa). - If
closedis false, thespecial_hoursfield withfromandtotimes 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_onlineto false andaffects_in_houseto 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/totime 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_houseis 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:
- Restricted date not added
- Wrong date entered
- Wrong location
- Cache not updated
Solutions:
- Add restricted date
- Verify date is correct
- Check location assignment
- Clear cache
Problem: Can't order during special hours
Causes:
- Special hours not set correctly
- Time outside special hours
- Preparation time buffer
Solutions:
- Review special hours setting
- Check requested time
- Account for prep time
Problem: Recurring holiday not applying
Causes:
- Recurring not enabled
- Date format issue
- Year mismatch in logic
Solutions:
- Enable recurring toggle
- Verify date format
- 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.