Files
compras/tests/Feature/WarehouseAvailabilityTest.php
T
2026-11-02 08:08:05 +02:00

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();
});