59 lines
3.4 KiB
PHP
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);
|
|
}
|