diff --git a/app/Enums/PricelistFileStatusEnum.php b/app/Enums/PricelistFileStatusEnum.php index 783cb35..fcd586e 100644 --- a/app/Enums/PricelistFileStatusEnum.php +++ b/app/Enums/PricelistFileStatusEnum.php @@ -10,6 +10,13 @@ enum PricelistFileStatusEnum: string case done = 'done'; case waiting_for_approval = 'waiting_for_approval'; case closed = 'closed'; + /** + * A Végrehajtás (Execution) lépés futott hibára. Szándékosan külön áll a `fail`-től: + * a `fail` a validálásig tartó szakasz hibája, ahonnan a fájl újratöltésével (Edit) + * biztonságosan újraindítható a lánc - itt viszont már történhettek termék- és + * árírások, ezért csak a Folytatás vagy a Visszavonás akció indítható. + */ + case execution_failed = 'execution_failed'; public function label(): string { @@ -20,6 +27,24 @@ public function label(): string self::done => 'elkészült', self::waiting_for_approval => 'jóváhagyásra vár', self::closed => 'lezárva', + self::execution_failed => 'végrehajtási hiba', + }; + } + + /** + * Badge szín a felülethez (a PricelistFileLineStatusEnum mintáját követve, hogy a + * színek egy helyen legyenek, és egy új státusz ne törjön el minden match-et). + */ + public function color(): string + { + return match ($this) { + self::todo => 'gray', + self::inprogress => 'info', + self::done => 'success', + self::fail => 'danger', + self::waiting_for_approval => 'primary', + self::closed => 'warning', + self::execution_failed => 'danger', }; } } diff --git a/app/Filament/Resources/PricelistFiles/Schemas/PricelistFileInfolist.php b/app/Filament/Resources/PricelistFiles/Schemas/PricelistFileInfolist.php index b6f76f2..5f8309a 100644 --- a/app/Filament/Resources/PricelistFiles/Schemas/PricelistFileInfolist.php +++ b/app/Filament/Resources/PricelistFiles/Schemas/PricelistFileInfolist.php @@ -47,14 +47,7 @@ public static function configure(Schema $schema): Schema ->label('Státusz') ->badge() ->formatStateUsing(fn (PricelistFileStatusEnum $state): string => $state->label()) - ->color(fn (PricelistFileStatusEnum $state): string => match ($state) { - PricelistFileStatusEnum::todo => 'gray', - PricelistFileStatusEnum::inprogress => 'info', - PricelistFileStatusEnum::done => 'success', - PricelistFileStatusEnum::fail => 'danger', - PricelistFileStatusEnum::waiting_for_approval => 'primary', - PricelistFileStatusEnum::closed => 'warning', - }), + ->color(fn (PricelistFileStatusEnum $state): string => $state->color()), ]), Grid::make(3) ->schema([ diff --git a/app/Filament/Resources/PricelistFiles/Tables/PricelistFilesTable.php b/app/Filament/Resources/PricelistFiles/Tables/PricelistFilesTable.php index 0e0e125..91929e0 100644 --- a/app/Filament/Resources/PricelistFiles/Tables/PricelistFilesTable.php +++ b/app/Filament/Resources/PricelistFiles/Tables/PricelistFilesTable.php @@ -32,14 +32,7 @@ public static function configure(Table $table): Table ->label('Státusz') ->badge() ->formatStateUsing(fn (PricelistFileStatusEnum $state): string => $state->label()) - ->color(fn (PricelistFileStatusEnum $state): string => match ($state) { - PricelistFileStatusEnum::todo => 'gray', - PricelistFileStatusEnum::inprogress => 'info', - PricelistFileStatusEnum::done => 'success', - PricelistFileStatusEnum::fail => 'danger', - PricelistFileStatusEnum::waiting_for_approval => 'primary', - PricelistFileStatusEnum::closed => 'warning', - }) + ->color(fn (PricelistFileStatusEnum $state): string => $state->color()) ->sortable(), TextColumn::make('processing_current_step') ->label('Aktuális lépés') diff --git a/app/Models/PricelistFileLine.php b/app/Models/PricelistFileLine.php index b82d6b5..f7b897b 100644 --- a/app/Models/PricelistFileLine.php +++ b/app/Models/PricelistFileLine.php @@ -16,6 +16,8 @@ class PricelistFileLine extends BaseAuditable 'payload' => 'array', 'validation_messages' => 'array', 'diff' => 'array', + 'applied_snapshot' => 'array', + 'executed_at' => 'datetime', ]; public function pricelistFile(): BelongsTo diff --git a/database/migrations/2026_08_10_090000_add_execution_failed_to_pricelist_files_status_enum.php b/database/migrations/2026_08_10_090000_add_execution_failed_to_pricelist_files_status_enum.php new file mode 100644 index 0000000..f4f516a --- /dev/null +++ b/database/migrations/2026_08_10_090000_add_execution_failed_to_pricelist_files_status_enum.php @@ -0,0 +1,45 @@ + "'{$case->value}'", PricelistFileStatusEnum::cases()); + $statusesStr = implode(', ', $statuses); + + DB::statement("ALTER TABLE pricelist_files MODIFY COLUMN status ENUM({$statusesStr}) DEFAULT 'todo' NOT NULL"); + } + + /** + * Visszagörgetéskor az execution_failed státuszú rekordokat előbb `fail`-re állítjuk, + * különben a szűkített enum miatt az ALTER hibára futna (vagy némán ürítené a mezőt). + */ + public function down(): void + { + DB::table('pricelist_files') + ->where('status', PricelistFileStatusEnum::execution_failed->value) + ->update(['status' => PricelistFileStatusEnum::fail->value]); + + $statuses = array_map( + fn ($case) => "'{$case->value}'", + array_filter( + PricelistFileStatusEnum::cases(), + fn ($case) => $case !== PricelistFileStatusEnum::execution_failed, + ), + ); + $statusesStr = implode(', ', $statuses); + + DB::statement("ALTER TABLE pricelist_files MODIFY COLUMN status ENUM({$statusesStr}) DEFAULT 'todo' NOT NULL"); + } +}; diff --git a/database/migrations/2026_08_10_090100_add_execution_fields_to_pricelist_file_lines_table.php b/database/migrations/2026_08_10_090100_add_execution_fields_to_pricelist_file_lines_table.php new file mode 100644 index 0000000..e96ade8 --- /dev/null +++ b/database/migrations/2026_08_10_090100_add_execution_fields_to_pricelist_file_lines_table.php @@ -0,0 +1,37 @@ +json('applied_snapshot')->nullable()->after('diff'); + $table->timestamp('executed_at')->nullable()->after('applied_snapshot'); + }); + } + + public function down(): void + { + Schema::table('pricelist_file_lines', function (Blueprint $table) { + $table->dropColumn(['applied_snapshot', 'executed_at']); + }); + } +}; diff --git a/database/seeders/FeatureFlagSeeder.php b/database/seeders/FeatureFlagSeeder.php index 9a10c7b..f16a036 100644 --- a/database/seeders/FeatureFlagSeeder.php +++ b/database/seeders/FeatureFlagSeeder.php @@ -46,5 +46,19 @@ public function run(): void 'roles' => ['developer'], ], ); + + FeatureFlag::updateOrCreate( + ['name' => 'PricelistExecution'], + [ + 'label' => 'Árlista jóváhagyás és végrehajtás', + 'description' => 'Az árlista feldolgozó Jóváhagyás/Elutasítás, Végrehajtás folytatása és Visszavonás akcióit, valamint a tényleges árlista-importot szabályozza a rollout alatt. Átmeneti kapcsoló, a funkció élesítése után eltávolítható - a kényszerlezárás jogosultsági korlátozása viszont a flag megszűnése után is maradjon.', + // enabled=true + roles=['developer']: a developer felhasználók automatikusan + // megkapják, rajtuk kívül senki. Lásd a fenti magyarázatot arról, miért nem + // enabled=false-szal fejezzük ki a "csak developer lássa" állapotot. + 'enabled' => true, + 'stages' => null, + 'roles' => ['developer'], + ], + ); } }