Definovanie otváracích hodín
OpeningHours::sync() — alebo setOpeningHours() na vlastníkovi — prijíma pole v rovnakom tvare ako validačné pravidlo. Kľúč week na najvyššej úrovni je skratka pre jeden základný rozvrh:
use RoundlyConsulting\OpeningHours\Facades\OpeningHours;
OpeningHours::sync($clinic, [
'timezone' => 'Europe/Bratislava',
'week' => [
'monday' => ['08:00-12:00', '13:00-17:00'],
'friday' => ['08:00-15:00'],
'saturday' => [['from' => '09:00', 'to' => '12:00', 'label' => 'Short day', 'capacity' => 2]],
],
'exceptions' => [['date' => '12-25', 'label' => 'Christmas']],
]);
OpeningHours::sync($clinic, ['week' => ['monday' => ['14:00-16:00']]], 'pickup'); // a second calendar
// The owner trait is shorthand for the same call:
$clinic->setOpeningHours(['week' => ['monday' => ['14:00-16:00']]], 'pickup');Každý zápis sa zvaliduje, prebehne v transakcii, nahradí definíciu kalendára a zvýši jeho revíziu presne raz.
Kanonický tvar
Úplný tvar podporuje viac rozvrhov — jeden základný bez okna a sezónne s oknom a prioritou — a výnimky pre jednotlivé dátumy, obdobia a každoročné dátumy:
[
'timezone' => 'Europe/Bratislava', // optional, IANA only
'label' => 'Reception', // optional
'schedules' => [
['label' => 'Regular', 'week' => [
'monday' => ['08:00-12:00', '13:00-17:00'],
'friday' => ['22:00-03:00'], // overnight: ends 03:00 on Saturday
'sunday' => ['00:00-24:00'], // 24 hours
]],
['label' => 'Summer', 'priority' => 10,
'window' => ['from' => '07-01', 'until' => '08-31'], // m-d = every year
'week' => ['monday' => ['07:00-14:00']]],
['label' => 'New hours',
'window' => ['from' => '2026-11-01'], // Y-m-d = one-off, open-ended
'week' => ['monday' => ['09:00-18:00']]],
],
'exceptions' => [
['date' => '12-25', 'label' => 'Christmas'], // yearly, closed
['from' => '12-24', 'until' => '01-02', 'label' => 'Holidays'], // yearly, wraps the year
['from' => '2026-08-03', 'until' => '2026-08-14', 'label' => 'Break'], // one-off span, closed
['date' => '2026-10-17', 'ranges' => ['10:00-12:00'], 'label' => 'Short day'],
],
]Pravidlá formátu
- Kľúče dní akceptujú monday, Monday, mon alebo 1–7 (ISO; 0 sa odmietne).
- Rozsahy sú reťazce HH:MM-HH:MM alebo polia {from, to, label?, capacity?, meta?}; kapacita je od 1 do 1000.
- Koniec 00:00 znamená polnoc (24:00). Koniec rovnaký alebo skorší ako začiatok robí z rozsahu nočný — končí na druhý deň. 12:00-12:00 je prázdny rozsah a odmietne sa.
- Dátumy m-d sa opakujú každý rok, dátumy Y-m-d sú jednorazové. Explicitné recurrence musí s formátom súhlasiť.
- Výnimka bez rozsahov znamená zatvorené; s rozsahmi nahradí hodiny daného dňa. Pri výnimkách je until predvolene rovné from.
- Každoročné okná môžu prechádzať cez koniec roka (12-24 → 01-02). Priorita rozvrhu je od −1000 do 1000.
- Neznáme kľúče sa ignorujú; key, revision a updated_at (vracia ich CalendarResource) sa akceptujú, takže definíciu môžete odoslať späť bez úprav.
Rozvrhy a priestupné dni
Rozvrh bez okna (null, {} alebo samé null) je základný — môže byť najviac jeden. Sezónne rozvrhy s rovnakou prioritou sa nesmú prekrývať. Každoročný dátum 02-29 platí len v priestupných rokoch; ako začiatok okna v nepriestupnom roku začína 03-01 a ako koniec okna končí 02-28.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.