diff --git a/app/Http/Controllers/guru/NilaiController.php b/app/Http/Controllers/guru/NilaiController.php index 91805e0..a3684dd 100644 --- a/app/Http/Controllers/guru/NilaiController.php +++ b/app/Http/Controllers/guru/NilaiController.php @@ -46,65 +46,73 @@ public function index(Request $request) // ── HITUNG RATA-RATA: simpan nilai_akhir ke kolom rata ────────── public function hitungRata(Request $request) - { - $request->validate([ - 'kelas_id' => 'required', - ]); +{ + $request->validate([ + 'kelas_id' => 'required', + ]); - $user = auth()->user(); - $mapel_id = $user->mapel_id; + $user = auth()->user(); + $mapel_id = $user->mapel_id; - // Ambil semua nilai siswa di kelas ini untuk mapel guru - $nilaiList = Nilai::with('siswa') - ->where('mapel_id', $mapel_id) - ->whereHas('siswa', fn($q) => $q->where('kelas_id', $request->kelas_id)) - ->get(); + // ── BARU: Hitung nilai_tugas otomatis dari pengumpulan_tugas ── + // Ambil semua tugas mapel ini di kelas ini + $semuaTugas = \App\Models\Tugas::where('mapel_id', $mapel_id) + ->where('kelas_id', $request->kelas_id) + ->get(); - foreach ($nilaiList as $n) { - // Hitung rata-rata dari tugas, uts, uas - $parts = []; - if ($n->nilai_tugas !== null) $parts[] = (float) $n->nilai_tugas; - if ($n->nilai_uts !== null) $parts[] = (float) $n->nilai_uts; - if ($n->nilai_uas !== null) $parts[] = (float) $n->nilai_uas; + // Ambil semua siswa di kelas ini + $siswaList = \App\Models\Siswa::where('kelas_id', $request->kelas_id)->get(); - if (count($parts) > 0) { - $rata = round(array_sum($parts) / count($parts), 2); - $n->update(['nilai_akhir' => $rata]); + foreach ($siswaList as $siswa) { + $totalNilai = 0; + $jumlahTugas = count($semuaTugas); + + if ($jumlahTugas > 0) { + foreach ($semuaTugas as $tugas) { + $pengumpulan = \App\Models\PengumpulanTugas::where('tugas_id', $tugas->id) + ->where('siswa_id', $siswa->id) + ->first(); + + // Sudah kumpul dan dinilai → pakai nilainya, selain itu → 0 + if ($pengumpulan && $pengumpulan->nilai !== null) { + $totalNilai += $pengumpulan->nilai; + } else { + $totalNilai += 0; + } } - } - return redirect()->route('guru.nilai.index', ['kelas_id' => $request->kelas_id]) - ->with('success', 'Rata-rata berhasil dihitung!'); - } - - // ── KIRIM NILAI KE SISWA (per kelas atau semua) ───────────────── - public function kirimKeSiswa(Request $request) - { - $user = auth()->user(); - $mapel_id = $user->mapel_id; - - $query = Nilai::where('mapel_id', $mapel_id) - ->whereNotNull('nilai_akhir'); - - // Kalau ada kelas_id, kirim per kelas saja - if ($request->kelas_id) { - $query->whereHas('siswa', fn($q) => $q->where('kelas_id', $request->kelas_id)); - } - - $nilaiList = $query->get(); - - foreach ($nilaiList as $n) { - $n->update(['sudah_kirim' => 1]); - } - - $msg = $request->kelas_id - ? 'Nilai berhasil dikirim ke siswa kelas ini!' - : 'Nilai berhasil dikirim ke semua kelas!'; - - return redirect()->route('guru.nilai.index') - ->with('success', $msg); + $rata_tugas = round($totalNilai / $jumlahTugas, 2); + + // Simpan ke kolom nilai_tugas + \App\Models\Nilai::updateOrCreate( + ['siswa_id' => $siswa->id, 'mapel_id' => $mapel_id], + ['nilai_tugas' => $rata_tugas] + ); + } + } + // ── SELESAI hitung nilai_tugas otomatis ── + + // Sekarang hitung rata-rata akhir (tugas + uts + uas) + $nilaiList = \App\Models\Nilai::with('siswa') + ->where('mapel_id', $mapel_id) + ->whereHas('siswa', fn($q) => $q->where('kelas_id', $request->kelas_id)) + ->get(); + + foreach ($nilaiList as $n) { + $parts = []; + if ($n->nilai_tugas !== null) $parts[] = (float) $n->nilai_tugas; + if ($n->nilai_uts !== null) $parts[] = (float) $n->nilai_uts; + if ($n->nilai_uas !== null) $parts[] = (float) $n->nilai_uas; + + if (count($parts) > 0) { + $rata = round(array_sum($parts) / count($parts), 2); + $n->update(['nilai_akhir' => $rata]); + } } + return redirect()->route('guru.nilai.index', ['kelas_id' => $request->kelas_id]) + ->with('success', 'Rata-rata berhasil dihitung!'); +} // ── HALAMAN INPUT NILAI PER KELAS ──────────────────────────────── public function inputNilai() { diff --git a/app/Http/Controllers/guru/TugasController.php b/app/Http/Controllers/guru/TugasController.php index cd5a0c8..4084ddc 100644 --- a/app/Http/Controllers/guru/TugasController.php +++ b/app/Http/Controllers/guru/TugasController.php @@ -16,99 +16,85 @@ class TugasController extends Controller { public function index() - { - $guru = auth()->user()->guru; +{ + $guru = auth()->user()->guru; - $tugas = Tugas::with(['kelas', 'mapel']) - ->withCount('pengumpulan') - ->where('guru_id', $guru->id) - ->get(); + $tugas = Tugas::with(['kelas', 'mapel']) + ->withCount('pengumpulan') + ->where('guru_id', $guru->id) + ->get(); - foreach ($tugas as $t) { - $t->total_siswa = Siswa::where('kelas_id', $t->kelas_id)->count(); + foreach ($tugas as $t) { + $t->total_siswa = Siswa::where('kelas_id', $t->kelas_id)->count(); + } + + $tugasIds = $tugas->pluck('id'); + + // Kelompokkan tugas berdasarkan kelas + // Format: { "X IPA 1": [ {tugas_id, ...}, ... ], ... } + $tugasPerKelas = $tugas->groupBy(fn($t) => $t->kelas->nama_kelas ?? 'Tidak Diketahui'); + + // Ambil semua pengumpulan (termasuk yang belum dinilai) + $semuaPengumpulan = \App\Models\PengumpulanTugas::with(['siswa']) + ->whereIn('tugas_id', $tugasIds) + ->get(); + + $rekapPerKelas = collect(); + + foreach ($tugasPerKelas as $namaKelas => $tugasDiKelas) { + $tugasIdsKelas = $tugasDiKelas->pluck('id')->toArray(); + + // Ambil semua siswa di kelas ini + $kelasId = $tugasDiKelas->first()->kelas_id; + $semuaSiswa = Siswa::where('kelas_id', $kelasId)->get(); + + $rekapSiswa = collect(); + + foreach ($semuaSiswa as $siswa) { + $totalNilai = 0; + $jumlahTugas = count($tugasIdsKelas); // total tugas di kelas ini + + foreach ($tugasIdsKelas as $tid) { + $pengumpulan = $semuaPengumpulan + ->where('tugas_id', $tid) + ->where('siswa_id', $siswa->id) + ->first(); + + if ($pengumpulan && $pengumpulan->nilai !== null) { + // Sudah kumpul dan sudah dinilai + $totalNilai += $pengumpulan->nilai; + } else { + // Belum kumpul ATAU sudah kumpul tapi belum dinilai → 0 + $totalNilai += 0; + } + } + + $rata = $jumlahTugas > 0 + ? round($totalNilai / $jumlahTugas, 1) + : 0; + + // Buat inisial nama + $nameParts = explode(' ', $siswa->nama ?? 'S'); + $inisial = strtoupper(substr($nameParts[0], 0, 1)) + . (isset($nameParts[1]) ? strtoupper(substr($nameParts[1], 0, 1)) : ''); + + $rekapSiswa->push([ + 'id' => $siswa->id, + 'nama' => $siswa->nama, + 'inisial' => $inisial, + 'jumlah_tugas' => $jumlahTugas, + 'rata_rata' => $rata, + ]); } - $tugasIds = $tugas->pluck('id'); - - // ----------------------------------------------------------------- - // Rekap nilai dikelompokkan per KELAS (untuk filter JS di view) - // Format: { "X IPA 1": [ {id, nama, inisial, jumlah_tugas, rata_rata}, … ], … } - // ----------------------------------------------------------------- - $rekapPerKelas = \App\Models\PengumpulanTugas::with(['siswa', 'tugas.kelas']) - ->whereIn('tugas_id', $tugasIds) - ->whereNotNull('nilai') - ->get() - ->groupBy(function ($p) { - // Kelompokkan berdasarkan nama kelas siswa - return $p->tugas->kelas->nama_kelas ?? 'Tidak Diketahui'; - }) - ->map(function ($kelasGroup) { - // Di dalam setiap kelas, kelompokkan lagi per siswa - return $kelasGroup - ->groupBy('siswa_id') - ->map(function ($kumpulan) { - $siswa = $kumpulan->first()->siswa; - $nilaiList = $kumpulan->pluck('nilai')->map(fn ($n) => (float) $n); - $rata = round($nilaiList->avg(), 1); - - return [ - 'id' => $siswa->id ?? 0, - 'nama' => $siswa->nama ?? '-', - 'inisial' => strtoupper(substr($siswa->nama ?? 'S', 0, 1)) - . (isset(explode(' ', $siswa->nama ?? '')[1]) - ? strtoupper(substr(explode(' ', $siswa->nama)[1], 0, 1)) - : ''), - 'jumlah_tugas' => $kumpulan->count(), - 'rata_rata' => $rata, - ]; - }) - ->values(); // reset key jadi array numerik - }); - - // Juga tetap sediakan $rekapNilai (flat) kalau masih dipakai view lain - $rekapNilai = $rekapPerKelas->flatten(1)->values(); - - return view('guru.tugas.index', compact('tugas', 'rekapNilai', 'rekapPerKelas')); + $rekapPerKelas[$namaKelas] = $rekapSiswa->values(); } - public function create() - { - $kelas = Kelas::all(); - $guru = auth()->user()->guru; - $mapel = $guru->mapelRel; + // Flat list kalau masih dipakai + $rekapNilai = $rekapPerKelas->flatten(1)->values(); - return view('guru.tugas.create', compact('kelas', 'mapel')); - } - - public function store(Request $request) - { - $guru = auth()->user()->guru; - - $request->validate([ - 'kelas_id' => 'required', - 'judul' => 'required', - 'deadline' => 'required', - 'file' => 'nullable|max:10240', - ]); - - $filePath = null; - if ($request->hasFile('file')) { - $filePath = $request->file('file')->store('tugas_file', 'public'); - } - - Tugas::create([ - 'guru_id' => $guru->id, - 'kelas_id' => $request->kelas_id, - 'mapel_id' => $guru->mapel_id, - 'judul' => $request->judul, - 'deskripsi' => $request->deskripsi, - 'file' => $filePath, - 'deadline' => str_replace('T', ' ', $request->deadline), - ]); - - return redirect()->route('guru.tugas.index') - ->with('success', 'Tugas berhasil dibuat'); - } + return view('guru.tugas.index', compact('tugas', 'rekapNilai', 'rekapPerKelas')); +} public function getMapelByKelas($id) { diff --git a/app/Http/Controllers/siswa/NilaiController.php b/app/Http/Controllers/siswa/NilaiController.php index 70f6c44..be64b42 100644 --- a/app/Http/Controllers/siswa/NilaiController.php +++ b/app/Http/Controllers/siswa/NilaiController.php @@ -56,64 +56,88 @@ public function index() * Fallback rekap dari PengumpulanTugas & Hasil (sistem lama) */ private function getRekapsLama($siswa_id): array - { - $tugas = \App\Models\PengumpulanTugas::with('tugas.mapel') - ->where('siswa_id', $siswa_id)->get(); +{ + // Ambil data siswa untuk tahu kelas_id-nya + $siswa = \App\Models\Siswa::findOrFail($siswa_id); - $ujian = \App\Models\Hasil::with('ujian.mapel') - ->where('siswa_id', $siswa_id)->get(); + // Ambil SEMUA tugas di kelas siswa ini (bukan hanya yang sudah dikumpul) + $semuaTugas = \App\Models\Tugas::with('mapel') + ->where('kelas_id', $siswa->kelas_id) + ->get(); - $data = []; + // Ambil pengumpulan siswa ini saja (untuk cek nilai) + $dikumpulkan = \App\Models\PengumpulanTugas::where('siswa_id', $siswa_id) + ->get() + ->keyBy('tugas_id'); // key by tugas_id supaya mudah dicari - foreach ($tugas as $t) { - $mapel_id = $t->tugas->mapel->id ?? null; - if (!$mapel_id) continue; - if (!isset($data[$mapel_id])) { - $data[$mapel_id] = [ - 'mapel' => $t->tugas->mapel->nama_mapel, - 'tugas_arr' => [], - 'uts' => null, - 'uas' => null, - ]; - } - if ($t->nilai !== null) { - $data[$mapel_id]['tugas_arr'][] = $t->nilai; - } - } + // Ambil hasil ujian + $ujian = \App\Models\Hasil::with('ujian.mapel') + ->where('siswa_id', $siswa_id)->get(); - foreach ($ujian as $u) { - $mapel_id = $u->ujian->mapel->id ?? null; - if (!$mapel_id) continue; - if (!isset($data[$mapel_id])) { - $data[$mapel_id] = [ - 'mapel' => $u->ujian->mapel->nama_mapel, - 'tugas_arr' => [], - 'uts' => null, - 'uas' => null, - ]; - } - if (strtoupper($u->ujian->jenis) === 'UTS') $data[$mapel_id]['uts'] = $u->nilai; - if (strtoupper($u->ujian->jenis) === 'UAS') $data[$mapel_id]['uas'] = $u->nilai; - } + $data = []; - foreach ($data as $k => $d) { - $rata_tugas = count($d['tugas_arr']) - ? array_sum($d['tugas_arr']) / count($d['tugas_arr']) - : null; - $uts = $d['uts'] ?? null; - $uas = $d['uas'] ?? null; - $parts = array_filter([$rata_tugas, $uts, $uas], fn($v) => $v !== null); - $rata = count($parts) ? round(array_sum($parts) / count($parts)) : null; + // Loop SEMUA tugas (termasuk yang belum dikumpul) + foreach ($semuaTugas as $t) { + $mapel_id = $t->mapel->id ?? null; + if (!$mapel_id) continue; - $data[$k] = [ - 'mapel' => $d['mapel'], - 'tugas' => $rata_tugas !== null ? round($rata_tugas) : null, - 'uts' => $uts !== null ? round($uts) : null, - 'uas' => $uas !== null ? round($uas) : null, - 'rata' => $rata, + if (!isset($data[$mapel_id])) { + $data[$mapel_id] = [ + 'mapel' => $t->mapel->nama_mapel, + 'tugas_arr' => [], + 'uts' => null, + 'uas' => null, ]; } - return $data; + // Cek apakah tugas ini sudah dikumpul + if (isset($dikumpulkan[$t->id]) && $dikumpulkan[$t->id]->nilai !== null) { + // Sudah dikumpul dan sudah dinilai → pakai nilainya + $data[$mapel_id]['tugas_arr'][] = $dikumpulkan[$t->id]->nilai; + } else { + // Belum dikumpul atau belum dinilai → nilai 0 + $data[$mapel_id]['tugas_arr'][] = 0; + } } + + // Loop hasil ujian + foreach ($ujian as $u) { + $mapel_id = $u->ujian->mapel->id ?? null; + if (!$mapel_id) continue; + + if (!isset($data[$mapel_id])) { + $data[$mapel_id] = [ + 'mapel' => $u->ujian->mapel->nama_mapel, + 'tugas_arr' => [], + 'uts' => null, + 'uas' => null, + ]; + } + + if (strtoupper($u->ujian->jenis) === 'UTS') $data[$mapel_id]['uts'] = $u->nilai; + if (strtoupper($u->ujian->jenis) === 'UAS') $data[$mapel_id]['uas'] = $u->nilai; + } + + // Hitung rata-rata akhir per mapel + foreach ($data as $k => $d) { + $rata_tugas = count($d['tugas_arr']) + ? array_sum($d['tugas_arr']) / count($d['tugas_arr']) + : null; + + $uts = $d['uts'] ?? null; + $uas = $d['uas'] ?? null; + $parts = array_filter([$rata_tugas, $uts, $uas], fn($v) => $v !== null); + $rata = count($parts) ? round(array_sum($parts) / count($parts)) : null; + + $data[$k] = [ + 'mapel' => $d['mapel'], + 'tugas' => $rata_tugas !== null ? round($rata_tugas) : null, + 'uts' => $uts !== null ? round($uts) : null, + 'uas' => $uas !== null ? round($uas) : null, + 'rata' => $rata, + ]; + } + + return $data; +} } \ No newline at end of file