Vytváranie termínov
Appointments::schedule($name) spustí fluentný builder — odporúčané API. Každá metóda je reťaziteľná; create() uloží termín, pripojí účastníkov a kontakty, otvorí prípadnú žiadosť o schválenie a vráti termín s načítanými účastníkmi:
use RoundlyConsulting\Appointments\Enums\ParticipantRole;
use RoundlyConsulting\Appointments\Facades\Appointments;
$appointment = Appointments::schedule('Project kickoff')
->startingAt('2026-07-01 17:30', timezone: 'Europe/Bratislava')
->lasting(90) // minutes; or ->until('2026-07-01 19:00')
->describedAs('Scope, milestones and owners for the new client portal.')
->withMeta(['agenda_url' => 'https://example.com/agenda'])
->withParticipant($host, ParticipantRole::Organiser, ['is_host' => true])
->withParticipant($guest)
->preventConflicts() // opt-in double-booking guard for this call
->create();Metódy buildera
| Metóda | Čo nastaví |
|---|---|
startingAt($at, ?$timezone) | Začiatok — Carbon si ponechá svoj okamih; reťazec bez posunu sa číta v $timezone, inak v appointments.timezone, inak v app.timezone. Toto pásmo sa uloží k termínu. |
lasting(int $minutes) | Trvanie v minútach — aspoň jedna, inak InvalidScheduleException. Nahradí skoršie until(). |
until($at) | Čas konca, meraný od začiatku bez ohľadu na to, či ho zavoláte pred startingAt() alebo po ňom; musí byť neskôr ako začiatok. Nahradí skoršie lasting(). |
describedAs(string $description) | Popis. |
withMeta(array $meta) | Ľubovoľné meta údaje (uložené ako JSON, čítané ako Collection). |
withStatus(Status $status) | Počiatočný stav — predvolene Status::Pending. |
withParticipant($model, ?$role, array $meta) | Pridá účastníka — akýkoľvek Eloquent model, s voliteľnou ParticipantRole a meta údajmi. |
located($lat, $lng, ?$venue) | Súradnice miesta konania a voliteľne jeho názov. |
at(Coordinates $coordinates) | Súradnice miesta z value objektu. |
venue(string $location) | Iba názov miesta konania. |
withContactEmail($email, ?$label, $primary) | E-mailový kontakt rezervácie — predvolene primárny. |
withContactPhone($phone, ?$label, $primary) | Telefonický kontakt rezervácie — predvolene primárny. |
requireApprovalFrom($approvers, $rule, ?$quorum) | Otvorí žiadosť o schválenie rezervácie — pozrite Schvaľovanie rezervácií. |
approvalRule() / approvalQuorum() | Samostatné settery pravidla schvaľovania a kvóra. |
approvalStages() / rejectOnStageRejection() | Viacstupňové schvaľovanie a či zamietnutý stupeň odmietne celú rezerváciu. |
approvalWorkflow() / approvalStageApprovers() | Pomenovaný preset schvaľovania a skupiny schvaľovateľov pre jednotlivé stupne. |
recurring(RecurrenceData $rule) | Pravidlo opakovania pre createRecurring(). |
preventConflicts(bool $prevent = true) | Ochrana pred dvojitou rezerváciou pre toto volanie. |
create() | Koncové volanie — uloží a vráti jeden Appointment. |
createRecurring() | Koncové volanie — vráti Collection: jeden termín na výskyt, bez pravidla kolekciu s jedným termínom. |
Predvolené hodnoty
- Bez startingAt() — termín začína teraz.
- Bez lasting() aj until() — použije sa default_duration_minutes (60, ak ste nenastavili inak).
- Bez withStatus() — termín sa vytvorí v stave pending.
- Bez pásma — začiatok sa prečíta v appointments.timezone, inak v app.timezone, a toto pásmo sa uloží k termínu.
- until() sa meria od začiatku bez ohľadu na to, či ho zavoláte pred startingAt() alebo po ňom. Ak zavoláte lasting() aj until(), platí to, ktoré zavoláte neskôr.
- withParticipant() bez roly uloží null — pre explicitnú rolu Attendee odovzdajte ParticipantRole::default().
Vytvorenie v inom stave
Návštevy bez objednania či importované rezervácie môžu stav pending preskočiť. Stav nastavený pri vytvorení sa zapíše priamo — nejde o prechod, takže AppointmentStatusChanged sa nespustí:
use RoundlyConsulting\Appointments\Enums\Status;
use RoundlyConsulting\Appointments\Facades\Appointments;
$appointment = Appointments::schedule('Walk-in consultation')
->startingAt(now())
->lasting(20)
->withStatus(Status::Confirmed) // created confirmed — no transition event fires
->withParticipant($patient)
->create();Jeden alebo viac termínov
createRecurring() vždy vráti Collection: jeden termín na výskyt, ak recurring() nastavilo pravidlo, inak kolekciu s jedným termínom — jedna vetva kódu tak pokryje oba prípady. Pozrite Opakované termíny.
Z typovaného DTO
Pri programových volaniach — importoch či API endpointoch — môžete Appointments::create() odovzdať AppointmentData; jeho polia nájdete v časti Typované DTO:
use Carbon\CarbonImmutable;
use RoundlyConsulting\Appointments\DataTransferObjects\AppointmentData;
use RoundlyConsulting\Appointments\DataTransferObjects\ParticipantData;
use RoundlyConsulting\Appointments\Enums\ParticipantRole;
use RoundlyConsulting\Appointments\Facades\Appointments;
$appointment = Appointments::create(new AppointmentData(
name: 'Project kickoff',
startsAt: CarbonImmutable::parse('2026-07-01 17:30'),
durationMinutes: 90,
participants: [
new ParticipantData($host, ParticipantRole::Organiser),
new ParticipantData($guest),
],
));Kontroly
Rezervácia sa zapíše v jednej transakcii a jej eventy sa spustia až po jej potvrdení. Odmietnutá či zlyhaná rezervácia — konflikt, dvakrát uvedený účastník, neplatný kontakt, neznáme workflow schvaľovania — preto nezanechá riadok ani nespustí event. Ak uvediete ten istý model dvakrát, vyhodí sa DuplicateParticipantException; prekryv pri preventConflicts() vyhodí SchedulingConflictException (pozrite Detekcia konfliktov); trvanie kratšie ako minúta alebo koniec, ktorý nie je neskôr ako začiatok, vyhodí InvalidScheduleException (pozrite Trvanie a časové pásma).
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.