MIF_E31221225/app/Http/Controllers/Siswa/UjianSiswaController.php

166 lines
4.6 KiB
PHP

<?php
namespace App\Http\Controllers\Siswa;
use App\Http\Controllers\Controller;
use App\Models\Ujian;
use App\Models\HasilUjian;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class UjianSiswaController extends Controller
{
public function index()
{
$user = Auth::user();
$kelas_id = $user->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'));
}
}