siswa()->with('kelas.mapel')->first(); if (!$siswa || !$siswa->kelas) { abort(404, 'Data kelas siswa tidak ditemukan.'); } $tahunAjaranAktif = TahunAjaran::where('status', 'aktif')->firstOrFail(); $mapelList = $siswa->kelas->mapel; $nilaiTugas = TugasSiswa::where('siswa_id', $siswa->id) ->whereNotNull('nilai') ->with('tugas.materi') ->get(); $nilaiUjian = HasilUjian::where('siswa_id', $siswa->id) ->whereNotNull('nilai_total') ->with('ujian') ->get(); $nilaiTotalMapel = NilaiTotalMapel::where('siswa_id', $siswa->id) ->whereIn('mapel_id', $mapelList->pluck('id')) ->pluck('nilai_total', 'mapel_id') ->toArray(); $rataNilai = []; $jumlahNilaiTotal = 0; $jumlahMapelAdaNilai = 0; foreach ($mapelList as $mapel) { $tugas = $nilaiTugas->filter(function ($item) use ($mapel) { return $item->tugas->materi->mapel_id == $mapel->id; }); $rataTugas = $tugas->count() ? round($tugas->avg('nilai'), 1) : null; $ujian = $nilaiUjian->filter(function ($item) use ($mapel) { return $item->ujian->mapel_id == $mapel->id; }); $rataUjian = $ujian->count() ? round($ujian->avg('nilai_total'), 1) : null; $nilaiTotal = $nilaiTotalMapel[$mapel->id] ?? null; if ($nilaiTotal !== null) { $jumlahNilaiTotal += $nilaiTotal; $jumlahMapelAdaNilai++; } $rataNilai[$mapel->id] = [ 'rata_tugas' => $rataTugas, 'rata_ujian' => $rataUjian, 'nilai_total' => $nilaiTotal, ]; } $nilaiTotalKeseluruhan = $jumlahMapelAdaNilai > 0 ? round($jumlahNilaiTotal / $jumlahMapelAdaNilai, 2) : null; return view('siswa.evaluasi.mapel', compact('mapelList', 'rataNilai', 'nilaiTotalKeseluruhan','tahunAjaranAktif')); } public function detailEvaluasi($mapelId) { $siswa = Auth::user()->siswa; // Ambil nilai ujian siswa khusus mapel ini $nilaiUjian = $siswa->hasilUjian() ->whereHas('ujian', function($q) use ($mapelId) { $q->where('mapel_id', $mapelId); }) ->with('ujian') ->get(); // Ambil nilai tugas siswa khusus mapel ini $nilaiTugas = $siswa->tugasSiswa() ->whereHas('tugas.materi', function ($query) use ($mapelId) { $query->where('mapel_id', $mapelId); }) ->with('tugas.materi') ->get(); // Hitung persentase pengerjaan $totalUjian = $nilaiUjian->count(); $totalTugas = $nilaiTugas->count(); $selesaiUjian = $nilaiUjian->whereNotNull('nilai_total')->count(); $selesaiTugas = $nilaiTugas->whereNotNull('nilai')->count(); $persenUjian = $totalUjian ? round(($selesaiUjian / $totalUjian) * 100, 1) : 0; $persenTugas = $totalTugas ? round(($selesaiTugas / $totalTugas) * 100, 1) : 0; return view('siswa.evaluasi.detail', compact( 'nilaiUjian', 'nilaiTugas', 'persenUjian', 'persenTugas' )); } // Import di atas controller public function exportPdf() { $siswa = Auth::user()->siswa()->with('kelas.mapel')->first(); if (!$siswa || !$siswa->kelas) { abort(404, 'Data kelas siswa tidak ditemukan.'); } $tahunAjaranAktif = TahunAjaran::where('status', 'aktif')->firstOrFail(); $mapelList = $siswa->kelas->mapel; $nilaiTugas = TugasSiswa::where('siswa_id', $siswa->id) ->whereNotNull('nilai') ->with('tugas.materi') ->get(); $nilaiUjian = HasilUjian::where('siswa_id', $siswa->id) ->whereNotNull('nilai_total') ->with('ujian') ->get(); $nilaiTotalMapel = NilaiTotalMapel::where('siswa_id', $siswa->id) ->whereIn('mapel_id', $mapelList->pluck('id')) ->pluck('nilai_total', 'mapel_id') ->toArray(); $rataNilai = []; $jumlahNilaiTotal = 0; $jumlahMapelAdaNilai = 0; foreach ($mapelList as $mapel) { $tugas = $nilaiTugas->filter(fn($item) => $item->tugas->materi->mapel_id == $mapel->id); $rataTugas = $tugas->count() ? round($tugas->avg('nilai'), 1) : null; $ujian = $nilaiUjian->filter(fn($item) => $item->ujian->mapel_id == $mapel->id); $rataUjian = $ujian->count() ? round($ujian->avg('nilai_total'), 1) : null; $nilaiTotal = $nilaiTotalMapel[$mapel->id] ?? null; if ($nilaiTotal !== null) { $jumlahNilaiTotal += $nilaiTotal; $jumlahMapelAdaNilai++; } $rataNilai[$mapel->id] = [ 'rata_tugas' => $rataTugas, 'rata_ujian' => $rataUjian, 'nilai_total' => $nilaiTotal, ]; } $nilaiTotalKeseluruhan = $jumlahMapelAdaNilai > 0 ? round($jumlahNilaiTotal / $jumlahMapelAdaNilai, 2) : null; $pdf = PDF::loadView('siswa.evaluasi.pdf', compact( 'mapelList', 'rataNilai', 'nilaiTotalKeseluruhan', 'tahunAjaranAktif', 'siswa' )); return $pdf->stream('evaluasi-nilai-' . $siswa->nama . '.pdf'); } }