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(); // ?ApprovalProgressPriebeh 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::ApprovedO 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 ApprovalRequestPrejavte 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.