authorizeAbility($request, 'service_queues.console'); // Natural Queue: counters live on role pages (clinical queue, pharmacy, lab, specialties). return redirect()->route('care.queue.index'); } public function console(Request $request, string $counterUuid, QueueClient $queue): View|RedirectResponse { $this->authorizeAbility($request, 'service_queues.console'); $organization = $this->organization($request); $owner = (string) $organization->owner_ref; if (! $this->integrationEnabled($organization)) { return redirect()->route('care.settings'); } try { $state = $queue->console($owner, $counterUuid); } catch (RequestException) { return redirect()->route('care.queue.index')->with('error', 'Counter console unavailable.'); } return view('care.service-queues.console', [ 'state' => $state, 'counterUuid' => $counterUuid, 'organization' => $organization, ]); } public function action(Request $request, string $counterUuid, QueueClient $queue): RedirectResponse { $this->authorizeAbility($request, 'service_queues.console'); $organization = $this->organization($request); $owner = (string) $organization->owner_ref; $validated = $request->validate([ 'action' => ['required', 'string'], 'queue_uuid' => ['nullable', 'uuid'], 'ticket_uuid' => ['nullable', 'uuid'], 'to_queue_uuid' => ['nullable', 'uuid'], 'reason' => ['nullable', 'string', 'max:500'], ]); try { $result = $queue->consoleAction($owner, $counterUuid, $validated); } catch (RequestException $e) { $message = $e->response?->json('message') ?: $e->response?->json('error') ?: 'Queue action failed. Try again.'; return back()->with('error', is_string($message) ? $message : 'Queue action failed. Try again.'); } $success = match ($validated['action']) { 'transfer' => sprintf( 'Handed off %s to %s. Ticket number unchanged.', (string) ($result['ticket_number'] ?? 'ticket'), (string) data_get($result, 'queue.name', 'next queue'), ), 'call_next' => ! empty($result['ticket_number']) ? "Called {$result['ticket_number']}." : 'No tickets waiting in that queue.', 'available' => 'Counter marked available.', 'offline' => 'Counter went offline.', default => 'Queue updated.', }; return back()->with('success', $success); } protected function integrationEnabled(\App\Models\Organization $organization): bool { return (bool) data_get($organization->settings, 'queue_integration_enabled', false); } }