Schvaľovanie odpovedí
Zapnite forms.approvals.enabled (FORMS_APPROVALS_ENABLED=true) a celú odpoveď — agregát FormSubmission — pošlite cez engine schvaľovania na schválenie schvaľovateľom, ktorých určíte. Schvaľovatelia sú modely s traitom GivesApprovals z balíka approvals-for-laravel:
use RoundlyConsulting\Approvals\Traits\GivesApprovals;
class User extends Authenticatable
{
use GivesApprovals; // approvals-for-laravel: lets the model approve and reject
}Otvorte schvaľovanie nad odpoveďou — odovzdajte jej model FormSubmission alebo jej uuid. Rozhodnutie sa na stav odpovede premietne automaticky:
use RoundlyConsulting\Forms\Facades\Forms;
$submission = Forms::submission($result->uuid)->model();
Forms::review($submission) // or Forms::review($uuid), Forms::submission($uuid)->review()
->requiring([$lead, $qa, $pm])
->quorum(2) // or ->unanimous(), ->any(), ->weighted($threshold)
->open(); // submission status -> Pending
$lead->approve($submission); // decisions flow into the open request
$qa->approve($submission); // quorum met -> status Approved, SubmissionApproved fired
$submission->refresh(); // the status moved in the database: reload this instance
$submission->isApproved(); // true
$submission->isPendingApproval(); // false- requiring() je povinné: rozhodovať môžu len schvaľovatelia, ktorých určí — alebo ich zástupcovia. Ktokoľvek iný, vrátane odosielateľa, dostane z balíka approvals UnauthorizedApprovalException a nič sa nezaznamená; schvaľovanie bez určených schvaľovateľov vyhodí SubmissionNotReviewableException.
- Pravidlá — unanimous() (predvolené), any(), quorum($n) alebo weighted($threshold); prípadne odovzdajte ApprovalRule do rule().
- open() vráti ApprovalRequest z balíka approvals a presunie odpoveď do stavu pending.
- Keď sa žiadosť uzavrie, stav prejde na approved alebo rejected a spustí sa SubmissionApproved / SubmissionRejected — raz za výsledok, aj keď o uzavretie súperia dve súbežné rozhodnutia; zamietnutie nesie aj zamietajúceho schvaľovateľa. Stav sa mení v databáze, preto model, ktorý držíte, obnovte cez refresh().
- Rozhodnutú odpoveď možno poslať na schválenie znova — vznikne nová žiadosť, stav sa vráti na pending a tí istí schvaľovatelia rozhodnú odznova.
- Otvorenie schvaľovania pri vypnutej funkcii vyhodí ReviewsDisabledException; nad konceptom SubmissionNotReviewableException.
- Pri vypnutom schvaľovaní (predvolené) majú odpovede bežný životný cyklus submit/finalize.
Agregát FormSubmission
$submission->isDraft(); // status is Draft
$submission->isPendingApproval(); // status is Pending
$submission->isApproved(); // status is Approved
$submission->isRejected(); // status is Rejected
FormSubmission::query()->pendingApproval()->get(); // everything awaiting sign-off
$submission->submissions; // the per-field Submission rows
$submission->sender; // morphTo — who submitted
$submission->form; // the FormŽivotný cyklus stavu
SubmissionStatus stráži každý prechod — listener schvaľovania uplatní len prechody, ktoré životný cyklus povoľuje, a ak je stav už cieľový, neurobí nič:
| Stav | Môže prejsť do | Význam |
|---|---|---|
draft | final | Uložené, zatiaľ nefinalizované. |
final | pending, approved, rejected | Finalizované; koncový stav, ak sa neschvaľuje. |
pending | approved, rejected | Odoslané na schválenie, čaká na rozhodnutie. |
approved | pending, rejected | Schvaľovanie skončilo kladne. |
rejected | pending, approved | Schvaľovanie skončilo zamietnutím. |
Enum obsahuje pomocné metódy z enums-for-laravel pre filtre a UI:
use RoundlyConsulting\Forms\Enums\SubmissionStatus;
SubmissionStatus::values(); // 'draft', 'final', 'pending', 'approved', 'rejected'
SubmissionStatus::toOptions(); // value => readable label, for selects
SubmissionStatus::validationRule(); // 'in:draft,final,pending,approved,rejected'
SubmissionStatus::Pending->readable(); // 'Pending'
SubmissionStatus::Final->canTransitionTo(SubmissionStatus::Pending); // true
SubmissionStatus::Draft->allowedTransitions(); // [SubmissionStatus::Final]
SubmissionStatus::Approved->isFinalized(); // truePrejavte 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.