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

@ -46,65 +46,73 @@ public function index(Request $request)
// ── HITUNG RATA-RATA: simpan nilai_akhir ke kolom rata ────────── // ── HITUNG RATA-RATA: simpan nilai_akhir ke kolom rata ──────────
public function hitungRata(Request $request) public function hitungRata(Request $request)
{ {
$request->validate([ $request->validate([
'kelas_id' => 'required', 'kelas_id' => 'required',
]); ]);
$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
->where('mapel_id', $mapel_id) $semuaTugas = \App\Models\Tugas::where('mapel_id', $mapel_id)
->whereHas('siswa', fn($q) => $q->where('kelas_id', $request->kelas_id)) ->where('kelas_id', $request->kelas_id)
->get(); ->get();
foreach ($nilaiList as $n) { // Ambil semua siswa di kelas ini
// Hitung rata-rata dari tugas, uts, uas $siswaList = \App\Models\Siswa::where('kelas_id', $request->kelas_id)->get();
$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) { foreach ($siswaList as $siswa) {
$rata = round(array_sum($parts) / count($parts), 2); $totalNilai = 0;
$n->update(['nilai_akhir' => $rata]); $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]) $rata_tugas = round($totalNilai / $jumlahTugas, 2);
->with('success', 'Rata-rata berhasil dihitung!');
} // Simpan ke kolom nilai_tugas
\App\Models\Nilai::updateOrCreate(
// ── KIRIM NILAI KE SISWA (per kelas atau semua) ───────────────── ['siswa_id' => $siswa->id, 'mapel_id' => $mapel_id],
public function kirimKeSiswa(Request $request) ['nilai_tugas' => $rata_tugas]
{ );
$user = auth()->user(); }
$mapel_id = $user->mapel_id; }
// ── SELESAI hitung nilai_tugas otomatis ──
$query = Nilai::where('mapel_id', $mapel_id)
->whereNotNull('nilai_akhir'); // Sekarang hitung rata-rata akhir (tugas + uts + uas)
$nilaiList = \App\Models\Nilai::with('siswa')
// Kalau ada kelas_id, kirim per kelas saja ->where('mapel_id', $mapel_id)
if ($request->kelas_id) { ->whereHas('siswa', fn($q) => $q->where('kelas_id', $request->kelas_id))
$query->whereHas('siswa', fn($q) => $q->where('kelas_id', $request->kelas_id)); ->get();
}
foreach ($nilaiList as $n) {
$nilaiList = $query->get(); $parts = [];
if ($n->nilai_tugas !== null) $parts[] = (float) $n->nilai_tugas;
foreach ($nilaiList as $n) { if ($n->nilai_uts !== null) $parts[] = (float) $n->nilai_uts;
$n->update(['sudah_kirim' => 1]); if ($n->nilai_uas !== null) $parts[] = (float) $n->nilai_uas;
}
if (count($parts) > 0) {
$msg = $request->kelas_id $rata = round(array_sum($parts) / count($parts), 2);
? 'Nilai berhasil dikirim ke siswa kelas ini!' $n->update(['nilai_akhir' => $rata]);
: 'Nilai berhasil dikirim ke semua kelas!'; }
return redirect()->route('guru.nilai.index')
->with('success', $msg);
} }
return redirect()->route('guru.nilai.index', ['kelas_id' => $request->kelas_id])
->with('success', 'Rata-rata berhasil dihitung!');
}
// ── HALAMAN INPUT NILAI PER KELAS ──────────────────────────────── // ── HALAMAN INPUT NILAI PER KELAS ────────────────────────────────
public function inputNilai() public function inputNilai()
{ {

View File

@ -16,99 +16,85 @@
class TugasController extends Controller class TugasController extends Controller
{ {
public function index() public function index()
{ {
$guru = auth()->user()->guru; $guru = auth()->user()->guru;
$tugas = Tugas::with(['kelas', 'mapel']) $tugas = Tugas::with(['kelas', 'mapel'])
->withCount('pengumpulan') ->withCount('pengumpulan')
->where('guru_id', $guru->id) ->where('guru_id', $guru->id)
->get(); ->get();
foreach ($tugas as $t) { foreach ($tugas as $t) {
$t->total_siswa = Siswa::where('kelas_id', $t->kelas_id)->count(); $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'); $rekapPerKelas[$namaKelas] = $rekapSiswa->values();
// -----------------------------------------------------------------
// 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'));
} }
public function create() // Flat list kalau masih dipakai
{ $rekapNilai = $rekapPerKelas->flatten(1)->values();
$kelas = Kelas::all();
$guru = auth()->user()->guru;
$mapel = $guru->mapelRel;
return view('guru.tugas.create', compact('kelas', 'mapel')); return view('guru.tugas.index', compact('tugas', 'rekapNilai', 'rekapPerKelas'));
} }
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)
{ {

View File

@ -56,64 +56,88 @@ public function index()
* Fallback rekap dari PengumpulanTugas & Hasil (sistem lama) * Fallback rekap dari PengumpulanTugas & Hasil (sistem lama)
*/ */
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);
$ujian = \App\Models\Hasil::with('ujian.mapel') // Ambil SEMUA tugas di kelas siswa ini (bukan hanya yang sudah dikumpul)
->where('siswa_id', $siswa_id)->get(); $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) { // Ambil hasil ujian
$mapel_id = $t->tugas->mapel->id ?? null; $ujian = \App\Models\Hasil::with('ujian.mapel')
if (!$mapel_id) continue; ->where('siswa_id', $siswa_id)->get();
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;
}
}
foreach ($ujian as $u) { $data = [];
$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;
}
foreach ($data as $k => $d) { // Loop SEMUA tugas (termasuk yang belum dikumpul)
$rata_tugas = count($d['tugas_arr']) foreach ($semuaTugas as $t) {
? array_sum($d['tugas_arr']) / count($d['tugas_arr']) $mapel_id = $t->mapel->id ?? null;
: null; if (!$mapel_id) continue;
$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] = [ if (!isset($data[$mapel_id])) {
'mapel' => $d['mapel'], $data[$mapel_id] = [
'tugas' => $rata_tugas !== null ? round($rata_tugas) : null, 'mapel' => $t->mapel->nama_mapel,
'uts' => $uts !== null ? round($uts) : null, 'tugas_arr' => [],
'uas' => $uas !== null ? round($uas) : null, 'uts' => null,
'rata' => $rata, '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;
}
} }