d2d.emegrendeles.hu/app/Enums/PricelistWorkflowStep.php
E98Developer eee27aa659 ADD EV3-357 Árlista feldolgozás phase5/2 jóváhagyás/elutasítás akció
- 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>
2026-08-10 15:00:33 +02:00

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());
}
}