make(Kernel::class)->bootstrap(); if (! app()->environment('testing') || DB::getDriverName() !== 'pgsql' || ! preg_match('/^compras_receipts_test_[a-f0-9]{12}$/D', DB::connection()->getDatabaseName())) { throw new LogicException('Apenas base descartável.'); } require_once dirname(__DIR__).'/Support/ReceiptFixture.php'; require_once dirname(__DIR__).'/Support/SupplyFixture.php'; if (($argv[1] ?? '') === 'prepare') { $f = receiptFixture('100.000'); $reviewer = User::factory()->create(['tenant_id' => $f['tenant']->id, 'department_id' => $f['issuer']->department_id]); supplyGrant($f['issuer'], ['warehouse_request_prepare']); supplyGrant($reviewer, ['warehouse_request_review']); supplyGrant($f['receiver'], ['warehouse', 'warehouse_request_deliver']); auth()->guard()->setUser($f['receiver']); app(ReceiptWorkflow::class)->confirm($f['receiver'], $f['order'], receiptPayload($f, '10.000')); auth()->guard()->setUser($f['issuer']); $r = app(WarehouseRequests::class)->draft($f['issuer'], ['operation_key' => (string) Str::uuid(), 'warehouse_id' => $f['warehouse']->id, 'cost_center_id' => $f['r']->cost_center_id, 'destination' => 'Oficina interna', 'reason' => 'Material para execução do ensaio.', 'priority' => 'normal', 'lines' => [['stock_item_id' => $f['stock']->id, 'quantity' => '4.000', 'use' => 'internal']]]); app(WarehouseFulfilment::class)->command($f['issuer'], $r->id, ['operation_key' => (string) Str::uuid(), 'version' => 0, 'action' => 'submit', 'reason' => 'Submissão da necessidade de ensaio.']); auth()->guard()->setUser($reviewer); app(WarehouseFulfilment::class)->command($reviewer, $r->id, ['operation_key' => (string) Str::uuid(), 'version' => 1, 'action' => 'authorize', 'reason' => 'Autorização independente de ensaio.']); echo json_encode(['user' => $f['receiver']->id, 'request' => $r->id, 'tenant' => $f['tenant']->id, 'stock' => $f['stock']->id, 'warehouse' => $f['warehouse']->id, 'input' => ['operation_key' => (string) Str::uuid(), 'version' => 2, 'action' => 'deliver', 'reason' => 'Entrega física efectivamente confirmada.', 'lines' => [['index' => 0, 'quantity' => '4.000']]]], JSON_THROW_ON_ERROR); exit; } $data = json_decode($argv[2], true, 32, JSON_THROW_ON_ERROR); $actor = User::query()->withoutGlobalScopes()->findOrFail($data['user']); auth()->guard()->setUser($actor); if (($argv[1] ?? '') === 'hold') { $held = false; DB::listen(function (QueryExecuted $query) use (&$held) { if (! $held && str_contains($query->sql, '"tenants"') && str_contains(strtolower($query->sql), 'for update')) { $held = true; echo "locked\n"; flush(); usleep(2000000); } }); } try { $event = app(WarehouseFulfilment::class)->command($actor, $data['request'], $data['input']); echo json_encode(['result' => 'saved', 'event' => $event->id], JSON_THROW_ON_ERROR); } catch (ValidationException $error) { echo json_encode(['result' => 'rejected'],JSON_THROW_ON_ERROR); }