Files
2026-11-02 08:08:05 +02:00

59 lines
3.4 KiB
PHP

<?php
use App\Models\User;
use App\Services\ReceiptWorkflow;
use App\Services\WarehouseFulfilment;
use App\Services\WarehouseRequests;
use Illuminate\Contracts\Console\Kernel;
use Illuminate\Database\Events\QueryExecuted;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use Illuminate\Validation\ValidationException;
require dirname(__DIR__, 2).'/vendor/autoload.php';
$app = require dirname(__DIR__, 2).'/bootstrap/app.php';
$app->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);
}