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

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čí akoStav termínu bude
Approvedconfirmed
Rejecteddeclined
Cancelled / Expiredcancelled
Pendingbez 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 decided

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