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

Detekcia konfliktov

Ochranu pred dvojitou rezerváciou zapnete pre jedno volanie cez preventConflicts(). Ak má účastník prekrývajúcu sa rezerváciu, ešte pred akýmkoľvek zápisom sa vyhodí SchedulingConflictException, ktorá nesie kolidujúce termíny:

use RoundlyConsulting\Appointments\Exceptions\SchedulingConflictException;
use RoundlyConsulting\Appointments\Facades\Appointments;

try {
    Appointments::schedule('Follow-up')
        ->startingAt('2026-07-01 09:30')
        ->lasting(60)
        ->withParticipant($doctor)
        ->preventConflicts()
        ->create();
} catch (SchedulingConflictException $e) {
    $e->conflicts;      // Collection<int, Appointment> — the bookings this slot overlaps
    $e->getMessage();   // The requested time conflicts with 1 existing appointment(s).
}

Prípadne strážte každé vytvorenie, presun aj pridanie účastníka v celej aplikácii:

// config/appointments.php — guard every create, reschedule and participant add
'prevent_conflicts' => true,

Čo sa považuje za konflikt

  • Existujúci termín koliduje, ak začína pred novým koncom a končí po novom začiatku. Nadväzujúce intervaly — jeden končí presne vtedy, keď ďalší začína — nekolidujú.
  • Existujúci termín bez ends_at sa považuje za otvorený, bez konca.
  • Zrušené a odmietnuté termíny sa ignorujú; čakajúce, potvrdené, dokončené aj termíny s neprítomnosťou sa rátajú.
  • Pri vytvorení sa kontroluje každý účastník odovzdaný builderu alebo DTO. Pri presune sa kontrolujú aktuálni účastníci termínu a termín nikdy nekoliduje sám so sebou. Pri participants()->add() sa pridávaný model porovná s časom termínu.
  • Príznak pre jedno volanie ochranu len zapína — pri prevent_conflicts nastavenom na true je strážené každé vytvorenie, presun aj pridanie účastníka.
  • V opakovanej sérii sa kontroluje každý výskyt a jediný konflikt vráti späť celú sériu.

Bezpečné pri súbežnosti

Kontrola platí, aj keď dve požiadavky rezervujú tú istú osobu naraz. Prebieha v transakcii, ktorá zapisuje, po uzamknutí riadka každého účastníka — a pri presune či pridaní účastníka aj riadka termínu — takže dve súbežné rezervácie jednej osoby ňou nemôžu prejsť obe. Zámky sa berú vždy v rovnakom poradí, takže rezervácie so spoločnými účastníkmi sa navzájom nezablokujú. SQLite zámky riadkov nemá; zápisy namiesto toho radí za sebou.

Overenie dostupnosti

Opýtajte sa priamo fasády — napríklad na zašednutie obsadených slotov ešte predtým, ako si ich niekto vyberie. Obe metódy len čítajú a platia pre ne rovnaké pravidlá. $start a $end môžu byť inštancie Carbon v ľubovoľnom pásme; porovnávajú sa ako okamihy, ktoré predstavujú:

use RoundlyConsulting\Appointments\Facades\Appointments;

Appointments::isAvailable($doctor, $start, $end);                       // bool
Appointments::conflicts($doctor, $start, $end);                         // Collection<int, Appointment>
Appointments::conflicts($doctor, $start, $end, ignore: $appointment);   // leave one booking out

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.