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

Ž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 shorthand

Rozhodujú 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:

PravidloSchválené, keďZamietnuté, keď
Unanimouspočet schválení ≥ requiredpríde akékoľvek zamietnutie
Quorumschválená váha ≥ prahprah je nedosiahnuteľný: schválená váha + zostávajúca váha < prah
Anyprvé schválenievšetci schvaľovatelia rozhodli a nikto neschválil
Weightedschválená váha ≥ prahako 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 again

Priebeh

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
ČlenVýznam
statusApprovalStatus žiadosti.
approved / rejectedSchválenia / zamietnutia — pri Quorum a Weighted súčet váh, inak počet; pri viacstupňovej žiadosti za otvorený stupeň.
requiredPočet schválení, ktoré žiadosť potrebuje — pri viacstupňovej žiadosti za otvorený stupeň.
thresholdPrah kvóra či váhy, alebo null.
currentStagePoradie otvoreného stupňa, alebo null.
totalStagesPočet stupňov — 0 pri jednostupňovej žiadosti.
clearedStagesStupne, 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 unchanged

Vyhodnotenie 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 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.