workouts()->count(); $sessionsQuery = WorkoutSession::where('user_id', $user->id); $sessionsCount = (clone $sessionsQuery)->count(); $completedSessions = (clone $sessionsQuery)->whereNotNull('completed_at')->count(); $completionRate = $sessionsCount > 0 ? round(($completedSessions / $sessionsCount) * 100) : 0; // Recent sessions with progress $recentSessions = (clone $sessionsQuery) ->latest('started_at') ->latest('id') ->with(['workout:id,title', 'items:id,session_id,done']) ->limit(5) ->get() ->map(function ($s) { $total = $s->items->count(); $done = $s->items->where('done', true)->count(); $pct = $total > 0 ? (int) round(($done / $total) * 100) : 0; return [ 'id' => $s->id, 'workout_title' => optional($s->workout)->title ?? 'Workout', 'started_at' => $s->started_at, 'completed_at' => $s->completed_at, 'done' => $done, 'total' => $total, 'pct' => $pct, ]; }); // Activity in the last 30 days (number of sessions per day) $since = now()->subDays(29)->startOfDay(); $dailyActivity = (clone $sessionsQuery) ->where('created_at', '>=', $since) ->get(['id', 'created_at']) ->groupBy(function ($s) { return $s->created_at->format('Y-m-d'); }) ->map->count(); return view('dashboard', compact( 'workoutsCount', 'sessionsCount', 'completedSessions', 'completionRate', 'recentSessions', 'dailyActivity' )); } }