---
title: "Viacstupňové schvaľovanie — Approvals for Laravel | Roundly"
description: "Schvaľujte v poradí stupňov — každý sa otvorí, až keď predchádzajúci prejde, s udalosťami stupňov a snímkou priebehu."
url: https://roundly-consulting.com/sk/open-source/navody/approvals-for-laravel/viacstupnove-schvalovanie
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Approvals for Laravel](https://roundly-consulting.com/sk/open-source/navody/approvals-for-laravel.md)

# 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ť:

```php
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:

```php
// 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:

```php
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í. Aj stiahnutie zasiahne len otvorený stupeň: rozhodnutia už uzavretého stupňa zostanú, ako sú. Keď je žiadosť uzavretá alebo jej uplynula platnosť, currentStage() vráti null.

## StageDefinition

```php
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, ak má pravidlo, ktoré sa dá splniť aj bez mien (Any, kvórum alebo requiredApprovers); inak otvorenie vyhodí InvalidApprovalRequestException.

## 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á:

```php
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 stupeň uzavrie, vyžiadania, ktoré v ňom ešte čakajú, sa zrušia — každé spustí ApprovalCancelled a ApprovalStatusChanged.
- Keď sa uzavrie posledný stupeň — alebo zamietnutie stupňa ukončí schvaľovanie — spustia sa pre žiadosť ApprovalRequestResolved a ApprovalStatusChanged.

## Model stupňa

```php
$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](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

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

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/approvals-for-laravel.md)
