'integer', 'registered_at' => 'datetime', 'last_seen_at' => 'datetime', ]; public function scopeOnline(Builder $query): Builder { return $query->whereNotNull('last_seen_at') ->where('last_seen_at', '>=', now()->subMinutes((int) config('store.client_online_window_minutes', 15))); } public function getIsOnlineAttribute(): bool { if (!$this->last_seen_at) { return false; } return $this->last_seen_at->gte( now()->subMinutes((int) config('store.client_online_window_minutes', 15)) ); } public function getTokenSuffixAttribute(): string { $token = trim((string) $this->access_token); if ($token === '') { return ''; } return substr($token, -8); } }