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

Viacstupňové schvaľovanie

Žiadosť môže prebiehať ako usporiadaný rad stupňov. Stupeň N sa otvorí, až keď stupeň N−1 prejde; predvolene zamietnutie v ktoromkoľvek stupni zamietne celú žiadosť:

use RoundlyConsulting\Approvals\DataTransferObjects\StageDefinition;
use RoundlyConsulting\Approvals\Enums\ApprovalRule;
use RoundlyConsulting\Approvals\Facades\Approvals;

Approvals::request($release)->stages([
    new StageDefinition([$eng1, $eng2], ApprovalRule::Unanimous, name: 'engineering'),
    new StageDefinition([$product],     ApprovalRule::Any,       name: 'product'),
])->expiringAt($deadline)->open();

Approvals::currentStage($release);   // ?ApprovalRequestStage — the open stage
Approvals::progress($release);       // ?ApprovalProgress — counts, current/total stages, percentage()

Ak jednému builderu odovzdáte from() aj stages(), vznikne InvalidApprovalRequestException. Na modeli s RequiresApproval má to isté schvaľovanie skratku:

// RequiresApproval shorthand — the same pipeline through the same manager
$release->requestStagedApproval($stages, rejectOnStageRejection: true, expiresAt: $deadline);

$release->currentStage();       // ?ApprovalRequestStage
$release->approvalProgress();   // ?ApprovalProgress

Priebeh krok za krokom

Schvaľovatelia rozhodujú o subjekte ako zvyčajne. Každé rozhodnutie sa pripojí k práve otvorenému stupňu a schvaľovanie sa posúva samo:

Approvals::for($release)->as($eng1)->approve();
Approvals::for($release)->as($eng2)->approve();   // engineering clears -> ApprovalStageCleared, product opens -> ApprovalStageOpened

Approvals::currentStage($release)->name;       // 'product'
Approvals::progress($release)->percentage();   // 50 — one of two stages cleared

Approvals::for($release)->as($product)->approve();   // the last stage clears -> the request is approved
Approvals::status($release);                         // ApprovalStatus::Approved

O otvorenom stupni rozhodujú len jeho schvaľovatelia — schvaľovateľ neskoršieho stupňa či ktokoľvek zvonka dostane UnauthorizedApprovalException, kým sa daný stupeň neotvorí.

StageDefinition

new StageDefinition(
    array $approvers,                              // list<Model> — the stage's named approvers; [] lets anyone decide
    ApprovalRule $rule = ApprovalRule::Unanimous,
    ?int $quorum = null,
    ?string $name = null,
    ?int $requiredApprovers = null,                // approvals the stage needs; one per named approver by default
);

// A stage that names nobody: any approver may decide it.
new StageDefinition([], ApprovalRule::Any, requiredApprovers: 1);

Každý stupeň má vlastné pravidlo, kvórum, názov a menovaných schvaľovateľov. Potrebuje jedno schválenie na menovaného schvaľovateľa, ak requiredApprovers neurčí inak, a nemusí vymenovať nikoho — vtedy oň môže rozhodnúť ktokoľvek.

Pokračovanie po zamietnutom stupni

S continueOnRejection() — alebo s rejectOnStageRejection: false v traite — schvaľovanie po zamietnutom stupni pokračuje. Keď sa uzavrú všetky stupne, žiadosť je schválená, ak aspoň jeden stupeň prešiel schválením, inak je zamietnutá:

Approvals::request($release)->stages([
    new StageDefinition([$legal], ApprovalRule::Any, name: 'legal'),
    new StageDefinition([$cfo, $ceo], ApprovalRule::Quorum, quorum: 1, name: 'executive'),
])->continueOnRejection()->open();

Stupne a udalosti

  • Prvý stupeň sa otvorí okamžite a spustí ApprovalStageOpened.
  • Keď stupeň prejde schválením, spustí sa ApprovalStageCleared a otvorí sa ďalší stupeň s ApprovalStageOpened — vrátane stupňa po zamietnutom, za ktorý schvaľovanie pokračuje.
  • Keď sa uzavrie posledný stupeň — alebo zamietnutie stupňa ukončí schvaľovanie — spustia sa pre žiadosť ApprovalRequestResolved a ApprovalStatusChanged.

Model stupňa

$stage = Approvals::currentStage($release);   // ?ApprovalRequestStage

$stage->position;             // 1-based order in the pipeline
$stage->name;                 // 'engineering'
$stage->rule;                 // ApprovalRule
$stage->required_approvers;   // approvals the stage needs
$stage->namedApprovers();     // list<NamedApprover> — empty when it names nobody
$stage->status;               // ApprovalStatus
$stage->opened_at;            // ?CarbonImmutable
$stage->cleared_at;           // ?CarbonImmutable — set when the stage settles
$stage->isOpen();             // pending and opened
$stage->decisions;            // decisions recorded against this stage
$stage->request;              // the ApprovalRequest

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.