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