siswa->kelas_id ?? null; if (!$kelas_id) { abort(403, 'User tidak memiliki kelas terkait.'); } $ujians = Ujian::where('terbit', true) ->whereHas('kelas', function ($q) use ($kelas_id) { $q->where('kelas.id', $kelas_id); }) ->with([ 'mapel', // Tambahkan relasi mapel 'kelas' => function ($q) use ($kelas_id) { $q->where('kelas.id', $kelas_id); } ]) ->get(); foreach ($ujians as $ujian) { $ujian->deadline = optional($ujian->kelas->first())->pivot->deadline; } return view('siswa.ujian.index', compact('ujians')); } public function show($id) { $ujian = Ujian::with('kelas')->findOrFail($id); $siswa = Auth::user()->siswa; $kelas_id = $siswa->kelas_id ?? null; if (!$kelas_id || !$ujian->kelas->contains('id', $kelas_id)) { abort(403); } // Cek apakah sudah mengerjakan $sudahDikerjakan = HasilUjian::where('ujian_id', $id) ->where('siswa_id', $siswa->id) ->exists(); // Ambil deadline dari pivot $kelas = $ujian->kelas->where('id', $kelas_id)->first(); $deadline = optional($kelas->pivot)->deadline; return view('siswa.ujian.show', compact('ujian', 'sudahDikerjakan', 'deadline')); } public function kerjakan($id) { $ujian = Ujian::with(['soalPilgan', 'soalEssay', 'kelas'])->findOrFail($id); $siswa = Auth::user()->siswa; if (!$siswa) abort(403, 'Data siswa tidak ditemukan.'); // Cek apakah kelas siswa ada di ujian dan ambil deadline $kelas = $ujian->kelas->where('id', $siswa->kelas_id)->first(); if (!$kelas) abort(403, 'Ujian tidak tersedia untuk kelas Anda.'); $deadline = $kelas->pivot->deadline; if ($deadline && now()->greaterThan($deadline)) { return redirect()->route('siswa.ujian.index') ->with('error', 'Waktu pengerjaan ujian sudah lewat.'); } $sudah = HasilUjian::where('ujian_id', $id) ->where('siswa_id', $siswa->id) ->exists(); if ($sudah) { return redirect()->route('siswa.ujian.hasil', $id) ->with('info', 'Sudah dikerjakan.'); } return view('siswa.ujian.kerjakan', compact('ujian')); } public function submit(Request $request, $id) { $ujian = Ujian::with(['soalPilgan'])->findOrFail($id); $jawaban_pg = $request->input('pg', []); $jawaban_essay = $request->input('essay', []); $jumlah_soal_pg = $ujian->soalPilgan->count(); $bobot_per_soal = $jumlah_soal_pg > 0 ? $ujian->bobot_pg / $jumlah_soal_pg : 0; $nilai_pg = 0; foreach ($ujian->soalPilgan as $soal) { $jawaban = $jawaban_pg[$soal->id] ?? null; if ($jawaban !== null && strcasecmp($jawaban, $soal->jawaban_benar) === 0) { $nilai_pg += $bobot_per_soal; } } $nilai_pg = round($nilai_pg, 2); $siswa_id = Auth::user()->siswa->id ?? null; if (!$siswa_id) { return redirect()->back()->with('error', 'Data siswa tidak ditemukan.'); } HasilUjian::create([ 'ujian_id' => $ujian->id, 'siswa_id' => $siswa_id, 'nilai_pg' => $nilai_pg, 'nilai_essay' => 0, 'nilai_total' => $nilai_pg, 'waktu_selesai' => now(), ]); return redirect()->route('siswa.ujian.hasil', $ujian->id) ->with('success', 'Berhasil dikumpulkan.'); } public function hasil($id) { $siswa_id = Auth::user()->siswa->id ?? null; if (!$siswa_id) abort(403, 'Data siswa tidak ditemukan.'); $hasil = HasilUjian::with('ujian') ->where('ujian_id', $id) ->where('siswa_id', $siswa_id) ->firstOrFail(); return view('siswa.ujian.hasil', compact('hasil')); } public function evaluasi() { $siswa_id = Auth::user()->siswa->id ?? null; if (!$siswa_id) abort(403, 'Data siswa tidak ditemukan.'); // Ambil semua hasil ujian milik siswa, dan ikutkan data ujian $nilaiUjian = HasilUjian::with('ujian') ->where('siswa_id', $siswa_id) ->get(); // Hitung total nilai $totalNilai = $nilaiUjian->sum('nilai_total'); return view('siswa.nilai.index', compact('nilaiUjian', 'totalNilai')); } }