d2d.emegrendeles.hu/app/Filament/Resources/PricelistFiles/Pages/CreatePricelistFile.php
E98Developer 8bcfeba0f9 ADD EV3-357 Árlista feldolgozás phase5/5 beszállítói blokkolás (PricelistGuard)
Egy beszállítóhoz egyszerre legfeljebb egy nyitott végrehajtás tartozhat: egy
execution_failed fájl után a termékek félig frissített állapotban vannak, egy új
import erre a kevert alapra rétegződne rá (és a validálás is ehhez számolná a
diffeket); két párhuzamos végrehajtás pedig nem determinisztikus eredményt adna.

- új PricelistGuard service: egyetlen igazságforrás a blokkoláshoz
- mind a NÉGY belépési pont véd: modern Filament create, régebbi
  PriceListProcessor oldal, legacy Admin\PriceListController import, konzol
  parancs. A legacy import a legfontosabb - az közvetlenül ír a products
  táblába, megkerülve a modult, és a beszállítókat ma még nagyrészt ott kezelik.
- az `inprogress` önmagában nem blokkol: az előfeldolgozás és a validálás
  egyetlen terméket sem ír, csak a már elindult végrehajtás számít
- a beszállító nem tűnik el a select listából, hanem konkrét magyarázatot kap a
  felhasználó arról, melyik fájl blokkol és miért
- blokkolt beszállítónál másik fájl jóváhagyása sem indítható

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-15 06:46:40 +02:00

45 lines
1.4 KiB
PHP

<?php
namespace App\Filament\Resources\PricelistFiles\Pages;
use App\Filament\Resources\PricelistFiles\PricelistFileResource;
use App\Services\PricelistGuard;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\CreateRecord;
use Filament\Support\Exceptions\Halt;
class CreatePricelistFile extends CreateRecord
{
protected static string $resource = PricelistFileResource::class;
/**
* A beszállító nem blokkolt-e egy befejezetlen végrehajtás miatt.
*
* A beszállító szándékosan választható marad az űrlapon: ha egyszerűen kivennénk a
* listából, a felhasználó csak annyit látna, hogy "eltűnt a beszállító", és keresné
* az okát. Így viszont konkrét magyarázatot kap arról, melyik fájl blokkol.
*/
protected function beforeCreate(): void
{
$blockingFile = app(PricelistGuard::class)->blockingFileFor($this->data['supplier_id'] ?? null);
if (! $blockingFile) {
return;
}
Notification::make()
->title('A beszállítóhoz jelenleg nem vihető fel árlista')
->body(app(PricelistGuard::class)->blockingMessage($blockingFile))
->danger()
->persistent()
->send();
throw new Halt;
}
protected function afterCreate(): void
{
app(\App\Services\PricelistFileProcessService::class)->dispatchInitialChain($this->record);
}
}