perbaikan

perbaikan nilai guru
This commit is contained in:
Ryfandii 2026-05-21 11:04:25 +07:00
parent 7e3718f6a3
commit e4cae10aa5
3 changed files with 205 additions and 187 deletions

View File

@ -54,14 +54,51 @@ public function hitungRata(Request $request)
$user = auth()->user(); $user = auth()->user();
$mapel_id = $user->mapel_id; $mapel_id = $user->mapel_id;
// Ambil semua nilai siswa di kelas ini untuk mapel guru // ── BARU: Hitung nilai_tugas otomatis dari pengumpulan_tugas ──
$nilaiList = Nilai::with('siswa') // Ambil semua tugas mapel ini di kelas ini
$semuaTugas = \App\Models\Tugas::where('mapel_id', $mapel_id)
->where('kelas_id', $request->kelas_id)
->get();
// Ambil semua siswa di kelas ini
$siswaList = \App\Models\Siswa::where('kelas_id', $request->kelas_id)->get();
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;
}
}
$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) ->where('mapel_id', $mapel_id)
->whereHas('siswa', fn($q) => $q->where('kelas_id', $request->kelas_id)) ->whereHas('siswa', fn($q) => $q->where('kelas_id', $request->kelas_id))
->get(); ->get();
foreach ($nilaiList as $n) { foreach ($nilaiList as $n) {
// Hitung rata-rata dari tugas, uts, uas
$parts = []; $parts = [];
if ($n->nilai_tugas !== null) $parts[] = (float) $n->nilai_tugas; if ($n->nilai_tugas !== null) $parts[] = (float) $n->nilai_tugas;
if ($n->nilai_uts !== null) $parts[] = (float) $n->nilai_uts; if ($n->nilai_uts !== null) $parts[] = (float) $n->nilai_uts;
@ -76,35 +113,6 @@ public function hitungRata(Request $request)
return redirect()->route('guru.nilai.index', ['kelas_id' => $request->kelas_id]) return redirect()->route('guru.nilai.index', ['kelas_id' => $request->kelas_id])
->with('success', 'Rata-rata berhasil dihitung!'); ->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);
}
// ── HALAMAN INPUT NILAI PER KELAS ──────────────────────────────── // ── HALAMAN INPUT NILAI PER KELAS ────────────────────────────────
public function inputNilai() public function inputNilai()
{ {

View File

@ -30,86 +30,72 @@ public function index()
$tugasIds = $tugas->pluck('id'); $tugasIds = $tugas->pluck('id');
// ----------------------------------------------------------------- // Kelompokkan tugas berdasarkan kelas
// Rekap nilai dikelompokkan per KELAS (untuk filter JS di view) // Format: { "X IPA 1": [ {tugas_id, ...}, ... ], ... }
// Format: { "X IPA 1": [ {id, nama, inisial, jumlah_tugas, rata_rata}, … ], … } $tugasPerKelas = $tugas->groupBy(fn($t) => $t->kelas->nama_kelas ?? 'Tidak Diketahui');
// -----------------------------------------------------------------
$rekapPerKelas = \App\Models\PengumpulanTugas::with(['siswa', 'tugas.kelas']) // Ambil semua pengumpulan (termasuk yang belum dinilai)
$semuaPengumpulan = \App\Models\PengumpulanTugas::with(['siswa'])
->whereIn('tugas_id', $tugasIds) ->whereIn('tugas_id', $tugasIds)
->whereNotNull('nilai') ->get();
->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 [ $rekapPerKelas = collect();
'id' => $siswa->id ?? 0,
'nama' => $siswa->nama ?? '-', foreach ($tugasPerKelas as $namaKelas => $tugasDiKelas) {
'inisial' => strtoupper(substr($siswa->nama ?? 'S', 0, 1)) $tugasIdsKelas = $tugasDiKelas->pluck('id')->toArray();
. (isset(explode(' ', $siswa->nama ?? '')[1])
? strtoupper(substr(explode(' ', $siswa->nama)[1], 0, 1)) // Ambil semua siswa di kelas ini
: ''), $kelasId = $tugasDiKelas->first()->kelas_id;
'jumlah_tugas' => $kumpulan->count(), $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, 'rata_rata' => $rata,
]; ]);
}) }
->values(); // reset key jadi array numerik
});
// Juga tetap sediakan $rekapNilai (flat) kalau masih dipakai view lain $rekapPerKelas[$namaKelas] = $rekapSiswa->values();
}
// Flat list kalau masih dipakai
$rekapNilai = $rekapPerKelas->flatten(1)->values(); $rekapNilai = $rekapPerKelas->flatten(1)->values();
return view('guru.tugas.index', compact('tugas', 'rekapNilai', 'rekapPerKelas')); return view('guru.tugas.index', compact('tugas', 'rekapNilai', 'rekapPerKelas'));
} }
public function create()
{
$kelas = Kelas::all();
$guru = auth()->user()->guru;
$mapel = $guru->mapelRel;
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');
}
public function getMapelByKelas($id) public function getMapelByKelas($id)
{ {
$guruId = auth()->user()->guru->id; $guruId = auth()->user()->guru->id;

View File

@ -57,33 +57,54 @@ public function index()
*/ */
private function getRekapsLama($siswa_id): array private function getRekapsLama($siswa_id): array
{ {
$tugas = \App\Models\PengumpulanTugas::with('tugas.mapel') // Ambil data siswa untuk tahu kelas_id-nya
->where('siswa_id', $siswa_id)->get(); $siswa = \App\Models\Siswa::findOrFail($siswa_id);
// 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();
// 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
// Ambil hasil ujian
$ujian = \App\Models\Hasil::with('ujian.mapel') $ujian = \App\Models\Hasil::with('ujian.mapel')
->where('siswa_id', $siswa_id)->get(); ->where('siswa_id', $siswa_id)->get();
$data = []; $data = [];
foreach ($tugas as $t) { // Loop SEMUA tugas (termasuk yang belum dikumpul)
$mapel_id = $t->tugas->mapel->id ?? null; foreach ($semuaTugas as $t) {
$mapel_id = $t->mapel->id ?? null;
if (!$mapel_id) continue; if (!$mapel_id) continue;
if (!isset($data[$mapel_id])) { if (!isset($data[$mapel_id])) {
$data[$mapel_id] = [ $data[$mapel_id] = [
'mapel' => $t->tugas->mapel->nama_mapel, 'mapel' => $t->mapel->nama_mapel,
'tugas_arr' => [], 'tugas_arr' => [],
'uts' => null, 'uts' => null,
'uas' => null, 'uas' => null,
]; ];
} }
if ($t->nilai !== null) {
$data[$mapel_id]['tugas_arr'][] = $t->nilai; // 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) { foreach ($ujian as $u) {
$mapel_id = $u->ujian->mapel->id ?? null; $mapel_id = $u->ujian->mapel->id ?? null;
if (!$mapel_id) continue; if (!$mapel_id) continue;
if (!isset($data[$mapel_id])) { if (!isset($data[$mapel_id])) {
$data[$mapel_id] = [ $data[$mapel_id] = [
'mapel' => $u->ujian->mapel->nama_mapel, 'mapel' => $u->ujian->mapel->nama_mapel,
@ -92,14 +113,17 @@ private function getRekapsLama($siswa_id): array
'uas' => null, 'uas' => null,
]; ];
} }
if (strtoupper($u->ujian->jenis) === 'UTS') $data[$mapel_id]['uts'] = $u->nilai; if (strtoupper($u->ujian->jenis) === 'UTS') $data[$mapel_id]['uts'] = $u->nilai;
if (strtoupper($u->ujian->jenis) === 'UAS') $data[$mapel_id]['uas'] = $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) { foreach ($data as $k => $d) {
$rata_tugas = count($d['tugas_arr']) $rata_tugas = count($d['tugas_arr'])
? array_sum($d['tugas_arr']) / count($d['tugas_arr']) ? array_sum($d['tugas_arr']) / count($d['tugas_arr'])
: null; : null;
$uts = $d['uts'] ?? null; $uts = $d['uts'] ?? null;
$uas = $d['uas'] ?? null; $uas = $d['uas'] ?? null;
$parts = array_filter([$rata_tugas, $uts, $uas], fn($v) => $v !== null); $parts = array_filter([$rata_tugas, $uts, $uas], fn($v) => $v !== null);