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

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