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