117 lines
4.0 KiB
PHP
117 lines
4.0 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Siswa;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Carbon\Carbon;
|
|
|
|
use App\Models\Tugas;
|
|
use App\Models\PengumpulanTugas;
|
|
use App\Models\Challenge;
|
|
use App\Models\PesertaChallenge;
|
|
use App\Models\Leaderboard;
|
|
use App\Models\Siswa;
|
|
|
|
class DashboardController extends Controller
|
|
{
|
|
public function __construct()
|
|
{
|
|
$this->middleware('auth:siswa');
|
|
}
|
|
|
|
public function index()
|
|
{
|
|
/** @var \App\Models\Siswa $siswa */
|
|
$siswa = Auth::guard('siswa')->user();
|
|
|
|
// =============================================
|
|
// 1. TUGAS — yang belum dikumpulkan siswa ini
|
|
// dan deadline belum lewat
|
|
// =============================================
|
|
|
|
// id_tugas yang sudah dikumpulkan siswa ini
|
|
$sudahDikumpulkan = PengumpulanTugas::where('id_siswa', $siswa->id_siswa)
|
|
->pluck('id_tugas');
|
|
|
|
// Tugas untuk kelas siswa yang belum dikumpulkan
|
|
$tugasRaw = Tugas::with(['mengajar.mapel'])
|
|
->whereNotIn('id_tugas', $sudahDikumpulkan)
|
|
->where('deadline', '>=', Carbon::now())
|
|
->whereHas('mengajar', function ($q) use ($siswa) {
|
|
$q->where('id_kelas', $siswa->id_kelas);
|
|
})
|
|
->orderBy('deadline', 'asc')
|
|
->take(5)
|
|
->get();
|
|
|
|
// Kelompokkan per tanggal deadline
|
|
$tugasList = [];
|
|
foreach ($tugasRaw as $tugas) {
|
|
$tgl = Carbon::parse($tugas->deadline)
|
|
->locale('id')
|
|
->isoFormat('dddd, D MMMM YYYY');
|
|
|
|
$namaMapel = optional(optional($tugas->mengajar)->mapel)->nama_mapel ?? '-';
|
|
|
|
$tugasList[$tgl][] = [
|
|
'jam' => Carbon::parse($tugas->deadline)->format('H.i'),
|
|
'nama' => $tugas->judul_tugas,
|
|
'mapel' => 'Belum · ' . $namaMapel,
|
|
];
|
|
}
|
|
|
|
// =============================================
|
|
// 2. CHALLENGE MINGGUAN
|
|
// =============================================
|
|
$startMinggu = Carbon::now()->startOfWeek();
|
|
$endMinggu = Carbon::now()->endOfWeek();
|
|
|
|
// Challenge untuk kelas siswa yang masih aktif minggu ini
|
|
$challengeTotal = Challenge::whereHas('kelas', function ($q) use ($siswa) {
|
|
$q->where('challenge_kelas.id_kelas', $siswa->id_kelas);
|
|
})
|
|
->where('tenggat_waktu', '>=', Carbon::now())
|
|
->whereBetween('created_at', [$startMinggu, $endMinggu])
|
|
->count();
|
|
|
|
// Challenge yang sudah selesai dikerjakan siswa minggu ini
|
|
$challengeDone = PesertaChallenge::where('id_siswa', $siswa->id_siswa)
|
|
->where('status', 'selesai')
|
|
->whereBetween('waktu_submit', [$startMinggu, $endMinggu])
|
|
->count();
|
|
|
|
// =============================================
|
|
// 3. TUGAS SELESAI MINGGU INI (mascot speech bubble)
|
|
// =============================================
|
|
$tugasSelesai = PengumpulanTugas::where('id_siswa', $siswa->id_siswa)
|
|
->whereIn('status', ['dikumpulkan', 'terlambat'])
|
|
->whereBetween('tanggal_submit', [$startMinggu, $endMinggu])
|
|
->count();
|
|
|
|
// =============================================
|
|
// 4. LEADERBOARD — top 3 kelas siswa yang login
|
|
// =============================================
|
|
$leaderboardRaw = Leaderboard::with('siswa')
|
|
->where('id_kelas', $siswa->id_kelas)
|
|
->orderBy('total_exp', 'desc')
|
|
->take(3)
|
|
->get();
|
|
|
|
$leaderboard = $leaderboardRaw->map(function ($item, $index) {
|
|
return [
|
|
'rank' => $index + 1,
|
|
'nama' => optional($item->siswa)->nama ?? '-',
|
|
'exp' => $item->total_exp,
|
|
];
|
|
})->toArray();
|
|
|
|
return view('siswa.dashboard', compact(
|
|
'tugasList',
|
|
'challengeDone',
|
|
'challengeTotal',
|
|
'tugasSelesai',
|
|
'leaderboard',
|
|
));
|
|
}
|
|
} |