Schvaľovanie rezervácií
Rezerváciu môžete podmieniť schválením cez approvals-for-laravel. Termín sa vytvorí v stave pending a otvorí sa žiadosť o schválenie; listener SyncAppointmentStatusFromApproval potom termín posúva podľa toho, ako sa žiadosť vyrieši:
use RoundlyConsulting\Appointments\Facades\Appointments;
use RoundlyConsulting\Approvals\Enums\ApprovalRule;
use RoundlyConsulting\Approvals\Facades\Approvals;
$appointment = Appointments::schedule('Booking request')
->startingAt('2026-07-01 09:00')
->requireApprovalFrom([$organiser, $clinician], ApprovalRule::Quorum, quorum: 1)
->create(); // created pending, approval request opened
Approvals::for($appointment)->as($organiser)->approve(); // → confirmed
// or: Approvals::for($appointment)->as($organiser)->reject(); → declined| Žiadosť o schválenie skončí ako | Stav termínu bude |
|---|---|
Approved | confirmed |
Rejected | declined |
Cancelled / Expired | cancelled |
Pending | bez zmeny |
Pravidlá a kvórum
requireApprovalFrom() prijme jedného alebo viacerých schvaľovateľov, pravidlo a voliteľné kvórum. Predvolené pravidlo je ApprovalRule::Unanimous; approvals-for-laravel ponúka aj Quorum, Any a Weighted:
use RoundlyConsulting\Appointments\Facades\Appointments;
use RoundlyConsulting\Approvals\Enums\ApprovalRule;
Appointments::schedule('Board review')
->startingAt('2026-07-01 09:00')
->requireApprovalFrom([$chair, $treasurer]) // ApprovalRule::Unanimous by default
->create();
Appointments::schedule('Team booking')
->startingAt('2026-07-01 09:00')
->requireApprovalFrom([$lead, $deputy])
->approvalRule(ApprovalRule::Quorum) // standalone setters
->approvalQuorum(1)
->create();Viacstupňové schvaľovanie a presety
Stupne sa otvárajú postupne — každý až po uzavretí predchádzajúceho. Pomenované presety pochádzajú z config('approvals.workflows'):
use RoundlyConsulting\Approvals\DataTransferObjects\StageDefinition;
Appointments::schedule('Two-desk booking')
->startingAt('2026-07-01 09:00')
->approvalStages([
new StageDefinition([$reception]),
new StageDefinition([$clinician]),
])
->rejectOnStageRejection() // default: a rejected stage declines the booking
->create();
Appointments::schedule('Preset booking')
->startingAt('2026-07-01 09:00')
->approvalWorkflow('clinic') // config('approvals.workflows.clinic')
->approvalStageApprovers([[$reception], [$clinician]])
->create();// config/approvals.php
'workflows' => [
'clinic' => [
'stages' => [
['rule' => 'unanimous', 'required_approvers' => 1, 'name' => 'reception'],
['rule' => 'any', 'required_approvers' => 1, 'name' => 'clinician'],
],
],
],- Prednosť: vyhráva pomenovaný preset workflow, potom explicitné stupne a napokon jednoduchá množina schvaľovateľov.
- rejectOnStageRejection() je predvolene zapnuté — zamietnutý stupeň odmietne celú rezerváciu.
- approvalStageApprovers() dodá pre viacstupňový preset jednu skupinu schvaľovateľov na stupeň; jednoduchý preset použije schvaľovateľov z requireApprovalFrom().
Modely schvaľovateľov
Rozhodovať môžu len menovaní schvaľovatelia. Modely, ktoré rozhodujú, používajú trait GivesApprovals z balíka approvals:
use Illuminate\Foundation\Auth\User as Authenticatable;
use RoundlyConsulting\Appointments\Concerns\HasAppointments;
use RoundlyConsulting\Approvals\Traits\GivesApprovals;
class User extends Authenticatable
{
use GivesApprovals;
use HasAppointments;
}Čo robí synchronizačný listener
- Spustí AppointmentStatusChanged ako každý iný prechod, takže vašim listenerom je jedno, akou cestou rozhodnutie prišlo.
- Rozhodujúceho aktéra zapíše do meta pod kľúčom approval_decided_by ako type (morph trieda) a id.
- Ignoruje opakované vyriešenia aj žiadosti, ktorých predmetom nie je termín.
- Konečný stav — cancelled, declined, completed či no_show — v žiadnom prípade neopustí: schválenie ešte otvorenej žiadosti rezervácie, ktorú zákazník už zrušil, nič nezmení.
- Pri zapnutom approvals.enforce_transitions preskočí namapovaný prechod, ktorý matica prechodov zakazuje. Pri vypnutom (predvolene) vynúti namapovaný stav medzi živými stavmi — vrátane confirmed → declined.
Stav schvaľovania na termíne
$appointment->isPendingApproval(); // bool
$appointment->isApproved(); // bool
$appointment->currentStage()?->name; // staged pipelines: the open stage, e.g. 'reception'
$appointment->approvalRequests()->count(); // the approval requests opened for this booking
$appointment->meta?->get('approval_decided_by'); // ['type' => …, 'id' => …] once decidedVypršanie rozhodnutí
appointments:expire-approvals spustí vypršanie v engine schvaľovania obmedzené na termíny — na nakonfigurovaný appointments.model, podľa jeho aliasu v morph mape, ak ho registrujete. Nechá vypršať len rozhodnutia a žiadosti termínov s uplynulou platnosťou, schvaľovanie iných subjektov nechá tak, a termíny, ktorých žiadosti sa tým vyriešia, prejdú cez listener do stavu cancelled:
php artisan appointments:expire-approvals
# Lapsed 3 expired approval decision(s).Spúšťajte ho pravidelne cez scheduler:
// routes/console.php
use Illuminate\Support\Facades\Schedule;
Schedule::command('appointments:expire-approvals')->everyFiveMinutes();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.