isAgentPortal() ? collect() : User::query()->orderBy('username')->get(['id', 'username']); return view('admin.dashboard.index', [ 'portal' => $this->portal(), 'agents' => $agents, ]); } public function data(Request $request) { $range = (string) $request->query('range', '30d'); [$from, $to] = $this->rangeBounds($range); $channelId = trim((string) $request->query('channel_id', '')); $agentUserId = $this->isAgentPortal() ? (int) ($this->agent()?->id ?? 0) : (int) $request->query('agent_user_id', 0); $base = Device::query(); AgentScope::applyDeviceChannelScope($base, $this->agent()); if (! $this->isAgentPortal() && $agentUserId > 0) { AgentScope::applyAgentUserFilter($base, $agentUserId); } if ($channelId !== '') { $base->where('channel_id', 'like', '%'.$channelId.'%'); } $total = (clone $base)->count(); $newCount = (clone $base)->whereBetween('created_at', [$from, $to])->count(); $activeCount = (clone $base)->whereBetween('updated_at', [$from, $to])->count(); return response()->json([ 'code' => 0, 'msg' => '', 'data' => [ 'total' => $total, 'new_count' => $newCount, 'active_count' => $activeCount, 'range' => $range, 'from' => $from->toDateTimeString(), 'to' => $to->toDateTimeString(), ], ]); } /** * @return array{0: Carbon, 1: Carbon} */ private function rangeBounds(string $range): array { $now = Carbon::now(); return match ($range) { 'today' => [$now->copy()->startOfDay(), $now->copy()->endOfDay()], 'yesterday' => [ $now->copy()->subDay()->startOfDay(), $now->copy()->subDay()->endOfDay(), ], '7d' => [$now->copy()->subDays(6)->startOfDay(), $now->copy()->endOfDay()], default => [$now->copy()->subDays(29)->startOfDay(), $now->copy()->endOfDay()], }; } }