MIF_E31221225/app/Http/Controllers/Guru/EvaluasiController.php

233 lines
7.9 KiB
PHP

<?php
namespace App\Http\Controllers\Guru;
use App\Http\Controllers\Controller;
use App\Models\Siswa;
use App\Models\Kelas;
use App\Models\NilaiSikap;
use App\Models\NilaiTotalMapel;
use App\Models\Mapel;
use App\Models\Tugas;
use App\Models\Ujian;
use App\Models\PengaturanBobot;
use App\Models\TahunAjaran;
use Illuminate\Http\Request;
class EvaluasiController extends Controller
{
public function index(Request $request)
{
$guru = auth()->user()->guru;
$kelas_id = $request->kelas_id;
$tahunAjaranAktif = TahunAjaran::where('status', 'aktif')->firstOrFail();
$pengaturan = PengaturanBobot::where('guru_id', $guru->id)
->where('kelas_id', $kelas_id)
->first();
$bobot_tugas = $request->bobot_tugas ?? $pengaturan->bobot_tugas ?? 20;
$bobot_ujian = $request->bobot_ujian ?? $pengaturan->bobot_ujian ?? 70;
$bobot_sikap = $request->bobot_sikap ?? $pengaturan->bobot_sikap ?? 10;
$daftarKelas = Kelas::all();
$siswaList = collect();
$tugasList = collect();
$ujianList = collect();
$mapelList = collect();
if ($kelas_id && $guru) {
$mapelList = Mapel::whereHas('guruMapel', function ($q) use ($guru, $kelas_id, $tahunAjaranAktif) {
$q->where('guru_id', $guru->id)
->where('kelas_id', $kelas_id)
->where('tahun_ajaran_id', $tahunAjaranAktif->id);
})->get();
$siswaList = Siswa::where('kelas_id', $kelas_id)
->with([
'pengumpulanTugas.tugas.materi.mapel',
'hasilUjian.ujian.mapel',
'nilaiSikap',
'nilaiTotalMapel.mapel',
])->get();
$tugasList = Tugas::whereHas('kelas', function ($q) use ($kelas_id) {
$q->where('kelas_id', $kelas_id);
})
->whereHas('materi.mapel', function ($q) use ($mapelList) {
$q->whereIn('id', $mapelList->pluck('id'));
})
->withCount('pengumpulan')
->get();
$ujianList = Ujian::whereHas('kelas', function ($q) use ($kelas_id) {
$q->where('kelas_id', $kelas_id);
})
->whereHas('mapel', function ($q) use ($mapelList) {
$q->whereIn('mapels.id', $mapelList->pluck('id'));
})
->with('hasilUjian')
->get();
foreach ($siswaList as $siswa) {
foreach ($mapelList as $mapel) {
$avg_tugas = $siswa->pengumpulanTugas
->where('tugas.materi.mapel_id', $mapel->id)
->avg('nilai') ?? 0;
$avg_ujian = $siswa->hasilUjian
->where('ujian.mapel_id', $mapel->id)
->avg('nilai_total') ?? 0;
$nilai_sikap = optional($siswa->nilaiSikap)->nilai ?? 0;
$nilai_total = round(
($avg_tugas * $bobot_tugas / 100) +
($avg_ujian * $bobot_ujian / 100) +
($nilai_sikap * $bobot_sikap / 100),
2
);
NilaiTotalMapel::updateOrCreate(
['siswa_id' => $siswa->id, 'mapel_id' => $mapel->id],
['nilai_total' => $nilai_total]
);
}
$siswa->nilai_total_per_mapel = $siswa->nilaiTotalMapel
->whereIn('mapel_id', $mapelList->pluck('id'))
->pluck('nilai_total', 'mapel_id')
->toArray();
$siswa->current_nilai_sikap = optional($siswa->nilaiSikap)->nilai;
}
}
return view('guru.evaluasi.index', compact(
'daftarKelas',
'siswaList',
'kelas_id',
'bobot_tugas',
'bobot_ujian',
'bobot_sikap',
'mapelList',
'tugasList',
'ujianList',
'tahunAjaranAktif'
));
}
public function simpanBobot(Request $request)
{
$request->validate([
'kelas_id' => 'required|exists:kelas,id',
'bobot_tugas' => 'required|numeric|min:0|max:100',
'bobot_ujian' => 'required|numeric|min:0|max:100',
'bobot_sikap' => 'required|numeric|min:0|max:100',
]);
$total = $request->bobot_tugas + $request->bobot_ujian + $request->bobot_sikap;
if ($total !== 100) {
return redirect()->back()->withErrors(['bobot' => 'Total bobot harus 100%.']);
}
$guru = auth()->user()->guru;
PengaturanBobot::updateOrCreate(
['guru_id' => $guru->id, 'kelas_id' => $request->kelas_id],
[
'bobot_tugas' => $request->bobot_tugas,
'bobot_ujian' => $request->bobot_ujian,
'bobot_sikap' => $request->bobot_sikap,
]
);
return redirect()->route('guru.evaluasi.index', ['kelas_id' => $request->kelas_id])
->with('success', 'Bobot berhasil disimpan.');
}
public function hitungNilaiTotal(Request $request)
{
$guru = auth()->user()->guru;
$kelas_id = $request->kelas_id;
$tahunAjaranAktif = TahunAjaran::where('status', 'aktif')->firstOrFail();
$pengaturan = PengaturanBobot::where('guru_id', $guru->id)
->where('kelas_id', $kelas_id)
->first();
if (!$pengaturan) {
return redirect()->back()->withErrors(['msg' => 'Pengaturan bobot belum diatur untuk kelas ini.']);
}
$bobot_tugas = $pengaturan->bobot_tugas;
$bobot_ujian = $pengaturan->bobot_ujian;
$bobot_sikap = $pengaturan->bobot_sikap;
$mapelList = Mapel::whereHas('guruMapel', function ($q) use ($guru, $kelas_id, $tahunAjaranAktif) {
$q->where('guru_id', $guru->id)
->where('kelas_id', $kelas_id)
->where('tahun_ajaran_id', $tahunAjaranAktif->id);
})->get();
$siswaList = Siswa::where('kelas_id', $kelas_id)
->with([
'tugasSiswa.tugas.materi.mapel',
'hasilUjian.ujian.mapel', // ini PENTING dan WAJIB
'nilaiSikap',
'nilaiTotalMapel.mapel',
])
->get();
foreach ($siswaList as $siswa) {
foreach ($mapelList as $mapel) {
$avg_tugas = $siswa->tugasSiswa
->filter(function ($tugasSiswa) use ($mapel) {
return optional(optional($tugasSiswa->tugas)->materi)->mapel_id == $mapel->id;
})
->avg('nilai') ?? 0;
$avg_ujian = $siswa->hasilUjian
->where('ujian.mapel_id', $mapel->id)
->avg('nilai_total') ?? 0;
$nilai_sikap = optional($siswa->nilaiSikap)->nilai ?? 0;
$nilai_total = round(
($avg_tugas * $bobot_tugas / 100) +
($avg_ujian * $bobot_ujian / 100) +
($nilai_sikap * $bobot_sikap / 100),
2
);
NilaiTotalMapel::updateOrCreate(
['siswa_id' => $siswa->id, 'mapel_id' => $mapel->id],
['nilai_total' => $nilai_total]
);
}
}
return redirect()->back()->with('success', 'Nilai total berhasil dihitung ulang.');
}
public function simpanNilaiSikap(Request $request)
{
$request->validate([
'kelas_id' => 'required|exists:kelas,id',
'nilai_sikap' => 'required|array',
'nilai_sikap.*' => 'required|numeric|min:0|max:100',
]);
foreach ($request->nilai_sikap as $siswa_id => $nilai) {
NilaiSikap::updateOrCreate(
['siswa_id' => $siswa_id],
['nilai' => $nilai]
);
}
return redirect()->back()->with('success', 'Nilai sikap berhasil disimpan.');
}
}