middleware('auth:siswa'); } public function index() { /** @var \App\Models\Siswa $siswa */ $siswa = Auth::guard('siswa')->user(); // ============================================= // 1. TUGAS — ambil tugas yang belum dikumpulkan // dan deadline-nya belum lewat, urutkan by deadline // ============================================= $tugasRaw = Tugas::with('mataPelajaran') // eager load relasi mapel ->whereDoesntHave('pengumpulan', function ($q) use ($siswa) { // tugas yang BELUM dikumpulkan oleh siswa ini $q->where('siswa_id', $siswa->id); }) ->where('deadline', '>=', Carbon::now()) ->orderBy('deadline', 'asc') ->take(5) // tampilkan maks 5 tugas di dashboard ->get(); // Kelompokkan tugas berdasarkan tanggal deadline $tugasList = []; foreach ($tugasRaw as $tugas) { $tgl = Carbon::parse($tugas->deadline) ->locale('id') ->isoFormat('dddd, D MMMM YYYY'); // contoh: "Sabtu, 10 Mei 2025" $tugasList[$tgl][] = [ 'jam' => Carbon::parse($tugas->deadline)->format('H.i'), 'nama' => $tugas->judul, // sesuaikan nama kolom dengan model kamu 'mapel' => 'Belum · ' . ($tugas->mataPelajaran->nama ?? '-'), ]; } // ============================================= // 2. CHALLENGE MINGGUAN // ============================================= $startMingguIni = Carbon::now()->startOfWeek(); $endMingguIni = Carbon::now()->endOfWeek(); // Total challenge aktif minggu ini $challengeTotal = Challenge::whereBetween('created_at', [$startMingguIni, $endMingguIni]) ->where('is_active', true) ->count(); // Challenge yang sudah diselesaikan siswa minggu ini $challengeDone = ChallengeSiswa::where('siswa_id', $siswa->id) ->where('status', 'selesai') ->whereBetween('created_at', [$startMingguIni, $endMingguIni]) ->count(); // ============================================= // 3. TUGAS SELESAI MINGGU INI (untuk speech bubble mascot) // ============================================= $tugasSelesai = TugasSiswa::where('siswa_id', $siswa->id) ->whereBetween('created_at', [$startMingguIni, $endMingguIni]) ->count(); // ============================================= // 4. LEADERBOARD — top 3 siswa berdasarkan total EXP // Asumsi: kolom 'exp' ada di tabel siswa // Sesuaikan jika EXP disimpan di tabel lain // ============================================= $leaderboardRaw = Siswa::orderBy('exp', 'desc') ->take(3) ->get(); $leaderboard = $leaderboardRaw->map(function ($item, $index) { return [ 'rank' => $index + 1, 'nama' => $item->nama, 'exp' => $item->exp, ]; })->toArray(); return view('siswa.dashboard', compact( 'tugasList', 'challengeDone', 'challengeTotal', 'tugasSelesai', 'leaderboard', )); } }