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

Opakované termíny

Odovzdajte builderu pravidlo RecurrenceData a zavolajte createRecurring(). Každý výskyt sa vytvorí ako samostatný termín a výskyty spája spoločné UUID v recurrence_group:

use RoundlyConsulting\Appointments\DataTransferObjects\RecurrenceData;
use RoundlyConsulting\Appointments\Enums\Frequency;
use RoundlyConsulting\Appointments\Facades\Appointments;

$series = Appointments::schedule('Weekly standup')
    ->startingAt('2026-07-06 09:00')
    ->lasting(30)
    ->withParticipant($team)
    ->recurring(new RecurrenceData(Frequency::Weekly, count: 8, byWeekday: [1])) // Mondays
    ->createRecurring();                // Collection<int, Appointment>

Možnosti pravidla

PoleTypPredvolenéVýznam
frequencyFrequency—Frequency::Daily, Frequency::Weekly alebo Frequency::Monthly.
intervalint1Každý N-tý deň, týždeň či mesiac — aspoň 1.
until?CarbonImmutablenullPosledný povolený začiatok, vrátane. Hodnota o polnoci sa číta ako dátum a zahŕňa celý ten deň.
count?intnullMaximálny počet výskytov — aspoň 1; strop je recurrence.max_occurrences.
byWeekdayzoznam int[]ISO dni v týždni, ktoré nastanú v každom aktívnom dni, týždni či mesiaci — 1 = pondelok … 7 = nedeľa.

Príklady

use Carbon\CarbonImmutable;
use RoundlyConsulting\Appointments\DataTransferObjects\RecurrenceData;
use RoundlyConsulting\Appointments\Enums\Frequency;

new RecurrenceData(Frequency::Daily, count: 5);                   // five consecutive days
new RecurrenceData(Frequency::Daily, interval: 2, count: 3);      // every other day, three times
new RecurrenceData(Frequency::Weekly, interval: 2, until: CarbonImmutable::parse('2026-12-31 23:59'));
new RecurrenceData(Frequency::Monthly, count: 3);                 // from Jan 31: Feb 28, then Mar 31 — no overflow
new RecurrenceData(Frequency::Weekly, count: 4, byWeekday: [1, 3]); // Mondays and Wednesdays
new RecurrenceData(Frequency::Weekly, interval: 2, count: 6, byWeekday: [1, 3]); // Monday and Wednesday of every other week
new RecurrenceData(Frequency::Monthly, count: 8, byWeekday: [1]);  // every Monday of each month
new RecurrenceData(Frequency::Daily, until: CarbonImmutable::parse('2026-07-31')); // midnight: a date, July 31 included

new RecurrenceData(Frequency::Daily, interval: 0);                 // throws InvalidRecurrenceException

Ako sa séria vytvára

  • Každý výskyt nesie všetko, čo by nieslo samostatné create() — účastníkov, meta údaje, miesto, súradnice, kontakty hostí aj vlastnú žiadosť o schválenie.
  • Séria platí celá alebo vôbec: vytvára sa v jednej databázovej transakcii, takže ak ktorýkoľvek výskyt zlyhá — napríklad na SchedulingConflictException pri preventConflicts() — nezostane z nej nič, a keďže eventy čakajú na potvrdenie, nespustí sa pre ňu ani AppointmentCreated, ani event účastníka.
  • Pravidlo sa rozvíja v pásme termínu, takže týždenný termín o 9:00 zostane o 9:00 miestneho času aj po zmene letného času.
  • Bez filtra dní v týždni je prvým výskytom samotný začiatok a každý ďalší nasleduje o interval dní, týždňov či mesiacov neskôr. Mesačné kroky nikdy nepretečú: séria začínajúca 31. dňa pripadne v kratších mesiacoch na posledný deň.
  • S byWeekday nastane od začiatku každý uvedený deň v týždni v každom aktívnom období — obdobím je deň, týždeň (od pondelka) alebo mesiac podľa frekvencie a aktívne je každé interval-té obdobie. interval: 2 s byWeekday: [1, 3] je pondelok a streda každý druhý týždeň; Frequency::Monthly s byWeekday: [1] je každý pondelok každého aktívneho mesiaca.
  • until platí vrátane — výskyt začínajúci presne v čase until sa zachová. until o polnoci sa číta ako dátum a zahŕňa celý ten deň.
  • Interval či počet pod jedna alebo deň v týždni mimo 1–7 vyhodí InvalidRecurrenceException už pri vytvorení RecurrenceData.
  • Bez count aj until sa pravidlo rozvinie na recurrence.max_occurrences (predvolene 365) — otvorené pravidlá preto vždy ohraničte. Rovnaký strop platí aj pre count.

Z DTO

Appointments::createRecurring() prijme AppointmentData a pravidlo — alebo použije recurrence priamo z DTO. Bez akéhokoľvek pravidla vytvorí jediný termín:

use RoundlyConsulting\Appointments\DataTransferObjects\RecurrenceData;
use RoundlyConsulting\Appointments\Enums\Frequency;
use RoundlyConsulting\Appointments\Facades\Appointments;

$series = Appointments::createRecurring($appointmentData, new RecurrenceData(Frequency::Daily, count: 5));
$series = Appointments::createRecurring($appointmentData); // falls back to $appointmentData->recurrence

Práca so sériou

Sériu načítate podľa recurrence_group; začiatky, ktoré pravidlo vytvorí, si vopred pozriete cez Appointments::occurrences() — nič sa nezapíše a platí rovnaký strop max_occurrences:

use Carbon\CarbonImmutable;
use RoundlyConsulting\Appointments\Facades\Appointments;
use RoundlyConsulting\Appointments\Models\Appointment;

// every appointment of one series
Appointment::query()
    ->where('recurrence_group', $series->first()->recurrence_group)
    ->ordered()
    ->get();

// preview the start times a rule produces, without writing anything
Appointments::occurrences(CarbonImmutable::parse('2026-07-06 09:00'), $rule); // list<CarbonImmutable>

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.