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>
62 lines
1.9 KiB
PHP
62 lines
1.9 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Models\PricelistFile;
|
|
use App\Services\PricelistFileProcessService;
|
|
use Illuminate\Console\Command;
|
|
|
|
class PricelistProcessCommand extends Command
|
|
{
|
|
/**
|
|
* The name and signature of the console command.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $signature = 'pricelist:process {id}';
|
|
|
|
/**
|
|
* The console command description.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $description = 'Elindítja a megadott azonosítójú árlista fájl kezdeti feldolgozási láncát (Pre-process -> Validation)';
|
|
|
|
/**
|
|
* Execute the console command.
|
|
*/
|
|
public function handle(PricelistFileProcessService $service): int
|
|
{
|
|
$id = $this->argument('id');
|
|
$pricelistFile = PricelistFile::find($id);
|
|
|
|
if (!$pricelistFile) {
|
|
$this->error("A(z) {$id} ID-vel rendelkező árlista fájl nem található.");
|
|
return 1;
|
|
}
|
|
|
|
// A konzolos indítás ugyanúgy a termékadatokat érinti, mint a felületi - a
|
|
// beszállítói blokkolás itt sem kerülhető meg.
|
|
$guard = app(\App\Services\PricelistGuard::class);
|
|
|
|
if ($blockingFile = $guard->blockingFileFor($pricelistFile->supplier_id, $pricelistFile->id)) {
|
|
$this->error($guard->blockingMessage($blockingFile));
|
|
|
|
return 1;
|
|
}
|
|
|
|
$this->info("Folyamat elindítása: {$pricelistFile->filename} (ID: {$id})");
|
|
$this->info("Workflow állapotok alaphelyzetbe állítása...");
|
|
|
|
try {
|
|
$service->resetWorkflow($pricelistFile);
|
|
$service->dispatchInitialChain($pricelistFile);
|
|
$this->info("Az árlista feldolgozási lánc (Pre-process -> Validation) sikeresen ütemezve.");
|
|
return 0;
|
|
} catch (\Exception $e) {
|
|
$this->error("Hiba történt a folyamat indításakor: " . $e->getMessage());
|
|
return 1;
|
|
}
|
|
}
|
|
}
|