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.'); } }