Žiadosti pre viacerých schvaľovateľov
Žiadosť pre subjekt otvoríte cez Approvals::request(): schvaľovateľov vymenujete vo from(), zvolíte pravidlo a zavoláte open():
use RoundlyConsulting\Approvals\Facades\Approvals;
// Unanimous (the default): every approver must approve; one rejection rejects the request.
Approvals::request($release)->from([$lead, $qa, $pm])->open();
// Quorum: 2 of 3 approvals resolve it; it rejects once 2 approvals are no longer reachable.
Approvals::request($release)->from([$lead, $qa, $pm])->quorum(2)->open();
// Any: the first approval resolves it.
Approvals::request($release)->from([$lead, $qa, $pm])->any()->open();
// Weighted: resolves once the summed approver weight reaches 3.
Approvals::request($release)->from([$lead, $qa, $pm])->weighted(3)->open();Ak má subjekt trait RequiresApproval, requestApproval() je skratkou pre to isté volanie:
use RoundlyConsulting\Approvals\Enums\ApprovalRule;
// RequiresApproval shorthand — the same request through the same manager
$release->requestApproval([$lead, $qa, $pm], ApprovalRule::Quorum, quorum: 2);Schvaľovatelia rozhodujú o subjekte ako zvyčajne. Každé rozhodnutie sa započíta do otvorenej žiadosti a žiadosť sa sama vyhodnotí v momente, keď je pravidlo splnené:
Approvals::request($release)->from([$lead, $qa, $pm])->open(); // Unanimous by default
Approvals::for($release)->as($lead)->approve(); // decisions flow into the open request automatically
Approvals::for($release)->as($qa)->approve();
Approvals::status($release); // ApprovalStatus::Pending — one approval still missing
Approvals::for($release)->as($pm)->approve();
Approvals::status($release); // ApprovalStatus::Approved
$release->isApproved(); // true — RequiresApproval shorthandRozhodujú len menovaní schvaľovatelia
Schvaľovatelia, ktorých odovzdáte — do from(), requestApproval(), StageDefinition alebo open() šablóny workflow — sa uložia na žiadosť, pri viacstupňovej žiadosti ku každému stupňu. Rozhodovať môžu len oni alebo zástupca, ktorý koná za niektorého z nich. Ktokoľvek iný dostane z approve(), reject(), toggle() aj ask() výnimku UnauthorizedApprovalException a nič sa nezapíše:
use RoundlyConsulting\Approvals\Facades\Approvals;
$request = Approvals::request($release)->from([$lead, $qa, $pm])->quorum(2)->open();
Approvals::for($release)->as($intern)->approve(); // throws UnauthorizedApprovalException — not a named approver
$request->namedApprovers(); // list<NamedApprover>Žiadosť otvorená bez menovaných schvaľovateľov — from([]) alebo ApprovalRequest, ktorú vytvoríte sami len s required_approvers — si ponechá otvorený režim: započíta sa rozhodnutie ktoréhokoľvek schvaľovateľa, kým ich nerozhodne required_approvers. Každý schvaľovateľ sa uloží raz, žiadosť nemôže vyžadovať viac schválení, než vymenúva schvaľovateľov, a prah kvóra či váhy, ktorý by schvaľovatelia nikdy nedosiahli, sa odmietne už pri otvorení — vždy výnimkou InvalidApprovalRequestException.
Ako sa pravidlá vyhodnocujú
Unanimous a Any počítajú hlavy; Quorum a Weighted sčítavajú váhy rozhodnutí, čo je pri predvolenej váhe 1 tiež obyčajný počet hláv. required je počet schválení, ktoré žiadosť potrebuje — jedno na menovaného schvaľovateľa, ak nie je určené inak; prahom je kvórum, alebo required, ak kvórum nezadáte:
| Pravidlo | Schválené, keď | Zamietnuté, keď |
|---|---|---|
Unanimous | počet schválení ≥ required | príde akékoľvek zamietnutie |
Quorum | schválená váha ≥ prah | prah je nedosiahnuteľný: schválená váha + zostávajúca váha < prah |
Any | prvé schválenie | všetci schvaľovatelia rozhodli a nikto neschválil |
Weighted | schválená váha ≥ prah | ako Quorum — bez menovaných schvaľovateľov až keď rozhodnú všetci |
Ku ktorej žiadosti sa rozhodnutie pripojí
Rozhodnutie sa pripojí k poslednej otvorenej žiadosti schvaľovaného modelu. Ak ho chcete pripojiť ku konkrétnej žiadosti, pripnite ho cez within($request); žiadosť musí patriť schvaľovanému modelu, inak vznikne InvalidApprovalRequestException a nič sa nezapíše. Model, ktorý nikdy žiadosť nemal, naďalej prijíma samostatné rozhodnutia.
Uzavreté žiadosti
Keď je žiadosť uzavretá — schválená, zamietnutá, zrušená alebo expirovaná — jej kolo sa skončilo a nič ďalšie sa do nej nezapíše. Neskoré approve(), reject(), toggle() či ask() na jej subjekte (alebo pripnuté k nej cez within()) a cancel(), ktorý by stiahol niektoré z jej rozhodnutí, vyhodia ClosedApprovalRequestException — aj pri zástupcovi. Vlastnosť $request výnimky je uzavretá žiadosť. Zopakovanie rozhodnutia, ktoré tam aktér už má, zostane neškodné a vráti ho:
$release->requestApproval([$lead]);
$lead->approve($release); // resolves the request as approved
$lead->approve($release); // no-op: returns the same approval
$lead->reject($release); // throws ClosedApprovalRequestException
$lead->cancelApproval($release); // throws ClosedApprovalRequestException
$release->requestApproval([$lead]); // a new round: decisions count towards it againPriebeh
Approvals::progress() — alebo approvalProgress() na modeli s RequiresApproval — vráti nemennú snímku poslednej žiadosti:
$progress = Approvals::progress($release); // null when the subject has no request
$progress->status; // ApprovalStatus
$progress->approved; // approvals in — summed weight under Quorum and Weighted
$progress->required; // approvals the request needs
$progress->threshold; // quorum / weight threshold, or null
$progress->ratio(); // float 0.0–1.0
$progress->percentage(); // int 0–100| Člen | Význam |
|---|---|
status | ApprovalStatus žiadosti. |
approved / rejected | Schválenia / zamietnutia — pri Quorum a Weighted súčet váh, inak počet; pri viacstupňovej žiadosti za otvorený stupeň. |
required | Počet schválení, ktoré žiadosť potrebuje — pri viacstupňovej žiadosti za otvorený stupeň. |
threshold | Prah kvóra či váhy, alebo null. |
currentStage | Poradie otvoreného stupňa, alebo null. |
totalStages | Počet stupňov — 0 pri jednostupňovej žiadosti. |
clearedStages | Stupne, ktoré prešli schválením. |
ratio() | 0,0–1,0 — prejdené/všetky stupne pri viacstupňovej žiadosti, inak schválené/prah. |
percentage() | ratio() zaokrúhlené na celé percento. |
Model žiadosti
$request = Approvals::request($release)->from([$lead, $qa, $pm])->quorum(2)->open();
$request->rule; // ApprovalRule::Quorum
$request->quorum; // 2
$request->required_approvers; // 3
$request->namedApprovers(); // list<NamedApprover> — empty when opened without names
$request->status; // ApprovalStatus::Pending
$request->decisions; // decisions attached to this request
$request->resolved_at; // ?CarbonImmutable — set when it resolves
$request->isOverdue(); // bool — still pending, but past expires_at
$request->resolve(); // re-evaluate and persist; a final request is returned unchangedVyhodnotenie spustí ApprovalRequestResolved a zastrešujúcu ApprovalStatusChanged, a to práve raz — žiadosť sa uzavrie podmieneným updatom, takže ju súbežné rozhodnutia vyhodnotia len raz. Akcie rozhodnutí volajú resolve() za vás — sami ho volajte, len ak rozhodnutia pripájate mimo nich.
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.