166 lines
4.6 KiB
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'));
|
|
}
|
|
}
|