NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Opening Hours for Laravel

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 kryptomien

Odoslaní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.