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

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