authorizeAbility($request, 'devices.view'); $organization = $this->organization($request); $devices = Device::owned($this->ownerRef($request)) ->where('organization_id', $organization->id) ->with(['branch', 'receptionDesk']) ->orderBy('name') ->paginate(25); $statsQuery = Device::owned($this->ownerRef($request)) ->where('organization_id', $organization->id); $heroStats = [ 'total' => (clone $statsQuery)->count(), 'online' => (clone $statsQuery) ->where('status', 'online') ->where('last_online_at', '>=', now()->subMinutes(10)) ->count(), 'kiosks' => (clone $statsQuery)->where('type', 'kiosk')->count(), ]; return view('frontdesk.devices.index', [ 'organization' => $organization, 'devices' => $devices, 'deviceTypes' => config('frontdesk.device_types'), 'heroStats' => $heroStats, 'canManage' => app(\App\Services\Frontdesk\FrontdeskPermissions::class) ->can($this->member($request), 'devices.manage'), ]); } public function create(Request $request): View { $this->authorizeAbility($request, 'devices.manage'); $organization = $this->organization($request); return view('frontdesk.devices.create', [ 'organization' => $organization, 'deviceTypes' => config('frontdesk.device_types'), 'branches' => $this->branches($request, $organization->id), 'desks' => $this->desks($request, $organization->id), ]); } public function store(Request $request, DeviceService $devices): RedirectResponse { $this->authorizeAbility($request, 'devices.manage'); $organization = $this->organization($request); $validated = $request->validate([ 'name' => ['required', 'string', 'max:255'], 'type' => ['required', 'string', 'in:'.implode(',', array_keys(config('frontdesk.device_types')))], 'branch_id' => ['nullable', 'integer'], 'reception_desk_id' => ['nullable', 'integer'], ]); if ($validated['type'] === 'kiosk' && ! app(\App\Services\Frontdesk\PlanService::class)->canAddKiosk($organization)) { return back()->withInput()->with('error', 'Your plan allows one kiosk device. Upgrade to Frontdesk Pro for unlimited kiosks.'); } $token = in_array($validated['type'], config('frontdesk.device_token_types', []), true) ? $devices->generateToken() : null; Device::create([ 'owner_ref' => $this->ownerRef($request), 'organization_id' => $organization->id, 'name' => $validated['name'], 'type' => $validated['type'], 'branch_id' => $validated['branch_id'] ?? null, 'reception_desk_id' => $validated['reception_desk_id'] ?? null, 'device_token' => $token, 'status' => 'offline', 'config' => $devices->defaultConfigForType($validated['type']), ]); return redirect()->route('frontdesk.devices.index')->with('success', 'Device registered.'); } public function edit(Request $request, Device $device): View { $this->authorizeAbility($request, 'devices.manage'); $this->authorizeOwner($request, $device); return view('frontdesk.devices.edit', [ 'device' => $device, 'deviceTypes' => config('frontdesk.device_types'), 'branches' => $this->branches($request, $device->organization_id), 'desks' => $this->desks($request, $device->organization_id), ]); } public function update(Request $request, Device $device): RedirectResponse { $this->authorizeAbility($request, 'devices.manage'); $this->authorizeOwner($request, $device); $validated = $request->validate([ 'name' => ['required', 'string', 'max:255'], 'type' => ['required', 'string', 'in:'.implode(',', array_keys(config('frontdesk.device_types')))], 'branch_id' => ['nullable', 'integer'], 'reception_desk_id' => ['nullable', 'integer'], 'status' => ['nullable', 'string', 'in:online,offline,maintenance'], ]); $device->update($validated); return redirect()->route('frontdesk.devices.index')->with('success', 'Device updated.'); } public function destroy(Request $request, Device $device): RedirectResponse { $this->authorizeAbility($request, 'devices.manage'); $this->authorizeOwner($request, $device); $device->delete(); return redirect()->route('frontdesk.devices.index')->with('success', 'Device removed.'); } public function regenerateToken(Request $request, Device $device, DeviceService $devices): RedirectResponse { $this->authorizeAbility($request, 'devices.manage'); $this->authorizeOwner($request, $device); $device->update(['device_token' => $devices->generateToken()]); return back()->with('success', 'Device token regenerated.'); } /** @return \Illuminate\Database\Eloquent\Collection */ protected function branches(Request $request, int $organizationId) { return Branch::owned($this->ownerRef($request)) ->where('organization_id', $organizationId) ->where('is_active', true) ->orderBy('name') ->get(); } /** @return \Illuminate\Database\Eloquent\Collection */ protected function desks(Request $request, int $organizationId) { return ReceptionDesk::owned($this->ownerRef($request)) ->whereHas('building.branch', fn ($q) => $q->where('organization_id', $organizationId)) ->where('is_active', true) ->orderBy('name') ->get(); } }