definition($module); abort_unless($definition, 404); $organization = $this->organization($request); abort_unless($modules->isEnabled($organization, $module), 404); $roles = $definition['roles'] ?? []; $member = $this->member($request); if (is_array($roles) && $roles !== [] && $member && ! in_array($member->role, $roles, true)) { abort(403); } $owner = $this->ownerRef($request); $branchScope = app(OrganizationResolver::class)->branchScope($member); $departments = Department::owned($owner) ->where('type', $definition['department_type'] ?? 'general') ->where('is_active', true) ->when($branchScope, fn ($q) => $q->where('branch_id', $branchScope)) ->with('branch') ->orderBy('name') ->get(); $departmentIds = $departments->pluck('id')->all(); $waiting = Appointment::owned($owner) ->where('organization_id', $organization->id) ->whereIn('status', [Appointment::STATUS_WAITING, Appointment::STATUS_CHECKED_IN]) ->when($departmentIds !== [], fn ($q) => $q->whereIn('department_id', $departmentIds)) ->when($departmentIds === [], fn ($q) => $q->whereRaw('1 = 0')) ->when($branchScope, fn ($q) => $q->where('branch_id', $branchScope)) ->with(['patient', 'practitioner', 'department']) ->orderBy('queue_position') ->orderBy('checked_in_at') ->limit(25) ->get(); $branchId = (int) ($branchScope ?: $departments->first()?->branch_id); return view('care.specialty.show', [ 'organization' => $organization, 'moduleKey' => $module, 'definition' => $definition, 'departments' => $departments, 'waiting' => $waiting, 'queueStubs' => $modules->queueStubsFor($organization, $module), 'branchId' => $branchId, 'queueIntegration' => $branchId ? $queueBridge->listMeta($organization, $module, $branchId) : ['enabled' => false], ]); } public function callNext( Request $request, string $module, SpecialtyModuleService $modules, CareQueueBridge $queueBridge, ): RedirectResponse { $definition = $modules->definition($module); abort_unless($definition, 404); $organization = $this->organization($request); abort_unless($modules->isEnabled($organization, $module), 404); abort_unless($queueBridge->isEnabled($organization), 404); $member = $this->member($request); $branchScope = app(OrganizationResolver::class)->branchScope($member); $branchId = (int) ($request->input('branch_id') ?: $branchScope); abort_unless($branchId > 0, 422); $result = $queueBridge->callNext($organization, $module, $branchId); $ticket = $result['ticket'] ?? null; if (! $ticket) { return back()->with('info', 'No patients waiting in this specialty queue.'); } return back()->with('success', 'Called '.$ticket['ticket_number'].'.'); } }