109 lines
3.9 KiB
PHP
109 lines
3.9 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Siswa;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Carbon\Carbon;
|
|
|
|
// Sesuaikan nama model-model ini dengan yang kamu punya
|
|
use App\Models\Tugas;
|
|
use App\Models\TugasSiswa; // tabel pengumpulan tugas
|
|
use App\Models\Challenge;
|
|
use App\Models\ChallengeSiswa; // tabel progress challenge siswa
|
|
use App\Models\Siswa;
|
|
|
|
class DashboardController extends Controller
|
|
{
|
|
/**
|
|
* Pastikan hanya siswa yang sudah login yang bisa akses.
|
|
*/
|
|
public function __construct()
|
|
{
|
|
$this->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',
|
|
));
|
|
}
|
|
} |