definition($module); abort_unless($definition, 404); $organization = $this->organization($request); $member = $this->member($request); abort_unless($modules->memberCanAccess($organization, $member, $module), 403); $owner = $this->ownerRef($request); $resolver = app(OrganizationResolver::class); $branchScope = $resolver->branchScope($member); $practitionerScope = $resolver->practitionerScope($organization, $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)) ->when( $practitionerScope !== null, fn ($q) => $q->whereIn('practitioner_id', $practitionerScope ?: [0]), ) ->with(['patient', 'practitioner', 'department']) ->orderBy('queue_position') ->orderBy('checked_in_at') ->limit(25) ->get(); $branchId = (int) ($branchScope ?: $departments->first()?->branch_id); if ($practitionerScope !== null && $practitionerScope !== []) { $pracBranch = (int) \App\Models\Practitioner::owned($owner) ->whereKey($practitionerScope[0]) ->value('branch_id'); if ($pracBranch > 0) { $branchId = $pracBranch; } } 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); $member = $this->member($request); abort_unless($modules->memberCanAccess($organization, $member, $module), 403); abort_unless($queueBridge->isEnabled($organization), 404); $resolver = app(OrganizationResolver::class); $branchScope = $resolver->branchScope($member); $practitionerScope = $resolver->practitionerScope($organization, $member); $branchId = (int) ($request->input('branch_id') ?: $branchScope); $practitionerId = null; if ($practitionerScope !== null) { abort_unless($practitionerScope !== [], 422); $practitionerId = $practitionerScope[0]; $pracBranch = (int) \App\Models\Practitioner::owned($this->ownerRef($request)) ->whereKey($practitionerId) ->value('branch_id'); if ($pracBranch > 0) { $branchId = $pracBranch; } } abort_unless($branchId > 0, 422); $result = $queueBridge->callNext($organization, $module, $branchId, $member, $practitionerId); $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'].'.'); } }