- PricelistFile::canBeApproved() / hasExecutionStarted(): a jóváhagyás feltételei egy helyen, hogy a felületi gomb és a service ugyanazt ellenőrizze - approve(): a státusz MÉG A DISPATCH ELŐTT billen át, különben a queue-latency alatt a gomb látszana és egy második kattintás párhuzamos importot indítana - reject(): új 'rejected' lépésstátusz - nem 'failed', mert azt az updateStepStatus fail fájlstátuszra fordítaná, az elutasítás viszont closed - a döntés (ki, mikor, milyen indokkal) a file_meta.approval-ba kerül, mert a BaseAuditable a nevével ellentétben nem naplóz - Edit gomb szűkítése hasExecutionStarted()-tel három helyen, köztük az EditPricelistFile::afterSave()-ben, ami a teljes láncot újraindítja Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
78 lines
2.1 KiB
PHP
78 lines
2.1 KiB
PHP
<?php
|
|
|
|
namespace App\Enums;
|
|
|
|
use App\Jobs\PricelistPreProcessJob;
|
|
use App\Jobs\PricelistValidationJob;
|
|
use App\Jobs\PricelistExecutionJob;
|
|
|
|
enum PricelistWorkflowStep: string
|
|
{
|
|
case Preprocessing = 'preprocess';
|
|
case Validation = 'validation';
|
|
case Approval = 'approval';
|
|
case Execution = 'execution';
|
|
|
|
/**
|
|
* Magyar megnevezés (UI megjelenítéshez)
|
|
*/
|
|
public function label(): string
|
|
{
|
|
return match($this) {
|
|
self::Preprocessing => 'Előfeldolgozás',
|
|
self::Validation => 'Validálás',
|
|
self::Approval => 'Jóváhagyás',
|
|
self::Execution => 'Végrehajtás',
|
|
};
|
|
}
|
|
|
|
/**
|
|
* A lépéshez tartozó Job osztály neve
|
|
*/
|
|
public function jobClass(): ?string
|
|
{
|
|
return match($this) {
|
|
self::Preprocessing => PricelistPreProcessJob::class,
|
|
self::Validation => PricelistValidationJob::class,
|
|
self::Execution => PricelistExecutionJob::class,
|
|
self::Approval => null, // Manuális lépésnél nincs automatikus job
|
|
};
|
|
}
|
|
|
|
/**
|
|
* A lépéshez tartozó Job példány visszaadása
|
|
*/
|
|
public function getJob(\App\Models\PricelistFile $file): ?object
|
|
{
|
|
$jobClass = $this->jobClass();
|
|
return $jobClass ? new $jobClass($file) : null;
|
|
}
|
|
|
|
/**
|
|
* Státusz színek (UI megjelenítéshez)
|
|
*/
|
|
public function color(string $status): string
|
|
{
|
|
return match ($status) {
|
|
'pending' => 'gray',
|
|
'inprogress' => 'primary',
|
|
'completed' => 'success',
|
|
'failed' => 'danger',
|
|
'rejected' => 'warning', // manuális elutasítás - nem hiba, hanem szabályos lezárás
|
|
default => 'gray',
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Segédfüggvény az alapértelmezett workflow struktúra legenerálásához
|
|
*/
|
|
public static function defaultSteps(): array
|
|
{
|
|
return array_map(fn($step) => [
|
|
'name' => $step->value,
|
|
'label' => $step->label(),
|
|
'status' => 'pending',
|
|
], self::cases());
|
|
}
|
|
}
|