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>
45 lines
1.4 KiB
PHP
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);
|
|
}
|
|
}
|