parent
7e3718f6a3
commit
e4cae10aa5
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue