Poskytovatelia obsadenosti
Obsadený čas pochádza z BusyPeriodProvider, z iterable s BusyPeriod::make($start, $end, weight: 1) alebo z closure. Balík obsahuje päť poskytovateľov: ArrayBusyPeriodProvider, ClosureBusyPeriodProvider, CompositeBusyPeriodProvider, NullBusyPeriodProvider a EloquentBusyPeriodProvider.
Z Eloquent dotazu
EloquentBusyPeriodProvider prevedie akýkoľvek dotaz na obsadené obdobia — namapujte stĺpce, ošetrite riadky bez konca a uveďte, v akom pásme sú surové hodnoty uložené:
use RoundlyConsulting\OpeningHours\Availability\Providers\EloquentBusyPeriodProvider;
use RoundlyConsulting\OpeningHours\Facades\OpeningHours;
$busy = EloquentBusyPeriodProvider::for(
Appointment::query()->where('vet_id', $vet->id)->whereNotIn('status', ['cancelled']),
)
->columns(start: 'starts_at', end: 'ends_at')
->durationColumn('duration_minutes') // rows with a NULL end last this many minutes
->defaultDuration(minutes: 30) // … or this, when the duration is NULL too
->maxNullEndMinutes(480) // optional: the longest possible duration
->weightColumn(null) // or a column with capacity units
->storedIn('UTC'); // timezone of the raw column values
OpeningHours::for($clinic)->availability()->withBusyPeriods($busy)->isAvailable($start, $end);- columns(start:, end:) — stĺpce začiatku a konca.
- durationColumn() — riadky s koncom NULL trvajú toľkoto minút; defaultDuration(), keď je NULL aj dĺžka (alebo stĺpec dĺžky chýba).
- weightColumn() — stĺpec s jednotkami kapacity na riadok (null = váha 1).
- maxNullEndMinutes() — voliteľne najdlhšia možná dĺžka. Riadok s koncom NULL môže zasiahnuť do okna, len ak začal najviac o svoju dĺžku skôr; bez tejto hranice ju provider zistí jedným dopytom MAX(duration) navyše pri každom čítaní (alebo použije defaultDuration(), ak stĺpec dĺžky chýba). Nastavte ju, aby ste tento dopyt ušetrili — nikdy nie nižšie, než je vaša najdlhšia dĺžka, inak sa dlhšie rezervácie prehliadnu a budú vyzerať ako voľné.
- storedIn() — časové pásmo surových hodnôt v stĺpcoch (predvolene app.timezone). Odporúčame ukladať časy rezervácií v UTC.
Názvy stĺpcov sa validujú voči povolenému vzoru a hodnoty sa viažu ako parametre. Poskytovateľ vyberá len uvedené stĺpce, čítanie obmedzí na limits.busy_periods a hodnoty miestneho času okolo zmeny času vyhodnotí rovnakým pravidlom hraníc ako engine.
Kombinovanie zdrojov
use RoundlyConsulting\OpeningHours\Availability\BusyPeriod;
use RoundlyConsulting\OpeningHours\Availability\Providers\ArrayBusyPeriodProvider;
use RoundlyConsulting\OpeningHours\Availability\Providers\CompositeBusyPeriodProvider;
use RoundlyConsulting\OpeningHours\Facades\OpeningHours;
$maintenance = new ArrayBusyPeriodProvider([
BusyPeriod::make($start, $end, weight: 2, reference: 'maintenance'),
]);
OpeningHours::for($clinic)->availability()
->withBusyPeriods(new CompositeBusyPeriodProvider($busy, $maintenance)) // the union of both
->isAvailable($from, $to);Vlastný poskytovateľ
Implementujte BusyPeriodProvider::busyPeriodsBetween() a vráťte obdobia, ktoré sa prekrývajú s oknom. Vrátiť viac nevadí — engine ich oreže:
use Carbon\CarbonImmutable;
use RoundlyConsulting\OpeningHours\Availability\BusyPeriod;
use RoundlyConsulting\OpeningHours\Contracts\BusyPeriodProvider;
final class MaintenanceWindows implements BusyPeriodProvider
{
public function busyPeriodsBetween(CarbonImmutable $start, CarbonImmutable $end): iterable
{
return MaintenanceWindow::query()
->where('starts_at', '<', $end)
->where('ends_at', '>', $start)
->get()
->map(fn (MaintenanceWindow $window) => BusyPeriod::make($window->starts_at, $window->ends_at));
}
}BusyPeriod musí končiť po svojom začiatku a mať váhu aspoň 1 (InvalidBusyPeriodException); viac ako limits.busy_periods pri jednom vyhodnotení vyhodí TooManyBusyPeriodsException.
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.