>|null */ public function page(User $actor, Equipment $equipment): ?LengthAwarePaginator { $canRead = $actor->hasFunctions(['admin', 'warehouse_request_read', 'warehouse_request_prepare']) || ($actor->hasFunctions(['warehouse_request_review']) && $actor->department_id !== null) || ($actor->hasFunctions(['warehouse_request_deliver']) && $actor->hasFunctions(['warehouse'])); if (! $canRead || ! Schema::hasTable('warehouse_requests')) { return null; } $query = app(WarehouseWorkdesk::class)->visible($actor); if (DB::getDriverName() === 'pgsql') { $query->whereRaw("EXISTS (SELECT 1 FROM json_array_elements(warehouse_requests.snapshot->'lines') AS line(value) WHERE line.value->'equipment'->>'id' = ?)", [(string) $equipment->id]); } elseif (DB::getDriverName() === 'sqlite') { $query->whereRaw("EXISTS (SELECT 1 FROM json_each(json_extract(warehouse_requests.snapshot, '$.lines')) AS line WHERE json_extract(line.value, '$.equipment.id') = ?)", [$equipment->id]); } else { return null; } return $query->oldest('id')->paginate(15, ['id', 'snapshot'], 'requests_page')->withQueryString()->through(function ($record) use ($equipment) { $p = app(WarehouseFulfilment::class)->progress($record); $lines = []; foreach ($record->snapshot['lines'] as $index => $line) { if (($line['equipment']['id'] ?? null) !== $equipment->id) { continue; } $lines[] = ['line' => $index + 1, 'item' => $line['item'], 'destination' => $line['destination'], 'requested_milli' => $line['quantity_milli'], 'reserved_milli' => $p['reserved'][$index], 'delivered_milli' => $p['delivered'][$index], 'remaining_milli' => $p['remaining'][$index], 'cancelled_milli' => $p['cancelled'][$index]]; } return ['id' => $record->id, 'state' => $p['state'], 'version' => $p['version'], 'reservation_ready' => $p['reservation_ready'], 'lines' => $lines]; }); } }