42 lines
2.7 KiB
PHP
42 lines
2.7 KiB
PHP
<?php
|
|
|
|
use App\Enums\PurchasingRole;
|
|
use App\Models\User;
|
|
use App\Services\ReceiptWorkflow;
|
|
use App\Services\SupplyCoordination;
|
|
use App\Services\SupplyPlanning;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Inertia\Testing\AssertableInertia as Assert;
|
|
|
|
require_once __DIR__.'/../Support/ReceiptFixture.php';
|
|
require_once __DIR__.'/../Support/SupplyFixture.php';
|
|
|
|
test('availability reuses physical balance without treating planning needs as physical reservations', function () {
|
|
$f = receiptFixture('100.000');
|
|
supplyGrant($f['receiver'], ['warehouse', 'warehouse_availability_read', 'supply_reserve', 'supply_review']);
|
|
supplyGrant($f['issuer'], ['supply_prepare']);
|
|
$this->actingAs($f['receiver']);
|
|
app(ReceiptWorkflow::class)->confirm($f['receiver'], $f['order'], receiptPayload($f, '10.000'));
|
|
app(SupplyCoordination::class)->save($f['receiver'], 'reservation', supplyInput(['stock_item_id' => $f['stock']->id, 'warehouse_id' => $f['warehouse']->id,
|
|
'quantity_milli' => 20000, 'needed_on' => today()->toDateString(), 'additional' => true, 'reference' => 'Necessidade planeada de ensaio']));
|
|
$this->actingAs($f['issuer']);
|
|
$draft = app(SupplyPlanning::class)->save($f['issuer'], 'policy', supplyInput([...supplyPolicy($f), 'safety_milli' => 5000, 'minimum_stock_milli' => 10000]));
|
|
$this->actingAs($f['receiver']);
|
|
app(SupplyPlanning::class)->save($f['receiver'], 'policy', supplyInput([], 'approve', $draft));
|
|
$movements = DB::table('stock_movements')->count();
|
|
$this->get('/stock/disponibilidade?warehouse_id='.$f['warehouse']->id)->assertOk()->assertInertia(fn (Assert $p) => $p
|
|
->component('stock/availability')->where('rows.data.0.physical_milli', 10000)->where('rows.data.0.usable_milli', 10000)
|
|
->where('rows.data.0.planned_milli', 20000)->where('rows.data.0.physical_commitment_milli', 0)->where('rows.data.0.free_milli', 10000)->where('rows.data.0.at_minimum', true));
|
|
expect(DB::table('stock_movements')->count())->toBe($movements);
|
|
});
|
|
|
|
test('availability is tenant scoped and does not disclose planning without permission', function () {
|
|
$f = receiptFixture();
|
|
$this->actingAs($f['receiver'])->get('/stock/disponibilidade?warehouse_id='.$f['warehouse']->id)->assertOk()->assertInertia(fn (Assert $p) => $p
|
|
->where('planningVisible', false)->where('rows.data.0.physical_milli', 0)->where('rows.data.0.planned_milli', null));
|
|
$foreign = receiptFixture();
|
|
$this->actingAs($f['receiver'])->getJson('/stock/disponibilidade?warehouse_id='.$foreign['warehouse']->id)->assertUnprocessable();
|
|
$requester = User::factory()->create(['tenant_id' => $f['tenant']->id, 'purchasing_role' => PurchasingRole::Requester]);
|
|
$this->actingAs($requester)->get('/stock/disponibilidade')->assertForbidden();
|
|
});
|