233 lines
7.9 KiB
PHP
233 lines
7.9 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Guru;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Siswa;
|
|
use App\Models\Kelas;
|
|
use App\Models\NilaiSikap;
|
|
use App\Models\NilaiTotalMapel;
|
|
use App\Models\Mapel;
|
|
use App\Models\Tugas;
|
|
use App\Models\Ujian;
|
|
use App\Models\PengaturanBobot;
|
|
use App\Models\TahunAjaran;
|
|
use Illuminate\Http\Request;
|
|
|
|
class EvaluasiController extends Controller
|
|
{
|
|
public function index(Request $request)
|
|
{
|
|
$guru = auth()->user()->guru;
|
|
$kelas_id = $request->kelas_id;
|
|
$tahunAjaranAktif = TahunAjaran::where('status', 'aktif')->firstOrFail();
|
|
|
|
$pengaturan = PengaturanBobot::where('guru_id', $guru->id)
|
|
->where('kelas_id', $kelas_id)
|
|
->first();
|
|
|
|
$bobot_tugas = $request->bobot_tugas ?? $pengaturan->bobot_tugas ?? 20;
|
|
$bobot_ujian = $request->bobot_ujian ?? $pengaturan->bobot_ujian ?? 70;
|
|
$bobot_sikap = $request->bobot_sikap ?? $pengaturan->bobot_sikap ?? 10;
|
|
|
|
$daftarKelas = Kelas::all();
|
|
$siswaList = collect();
|
|
$tugasList = collect();
|
|
$ujianList = collect();
|
|
$mapelList = collect();
|
|
|
|
if ($kelas_id && $guru) {
|
|
$mapelList = Mapel::whereHas('guruMapel', function ($q) use ($guru, $kelas_id, $tahunAjaranAktif) {
|
|
$q->where('guru_id', $guru->id)
|
|
->where('kelas_id', $kelas_id)
|
|
->where('tahun_ajaran_id', $tahunAjaranAktif->id);
|
|
})->get();
|
|
|
|
$siswaList = Siswa::where('kelas_id', $kelas_id)
|
|
->with([
|
|
'pengumpulanTugas.tugas.materi.mapel',
|
|
'hasilUjian.ujian.mapel',
|
|
'nilaiSikap',
|
|
'nilaiTotalMapel.mapel',
|
|
])->get();
|
|
|
|
$tugasList = Tugas::whereHas('kelas', function ($q) use ($kelas_id) {
|
|
$q->where('kelas_id', $kelas_id);
|
|
})
|
|
->whereHas('materi.mapel', function ($q) use ($mapelList) {
|
|
$q->whereIn('id', $mapelList->pluck('id'));
|
|
})
|
|
->withCount('pengumpulan')
|
|
->get();
|
|
|
|
$ujianList = Ujian::whereHas('kelas', function ($q) use ($kelas_id) {
|
|
$q->where('kelas_id', $kelas_id);
|
|
})
|
|
->whereHas('mapel', function ($q) use ($mapelList) {
|
|
$q->whereIn('mapels.id', $mapelList->pluck('id'));
|
|
})
|
|
->with('hasilUjian')
|
|
->get();
|
|
|
|
foreach ($siswaList as $siswa) {
|
|
foreach ($mapelList as $mapel) {
|
|
$avg_tugas = $siswa->pengumpulanTugas
|
|
->where('tugas.materi.mapel_id', $mapel->id)
|
|
->avg('nilai') ?? 0;
|
|
|
|
$avg_ujian = $siswa->hasilUjian
|
|
->where('ujian.mapel_id', $mapel->id)
|
|
->avg('nilai_total') ?? 0;
|
|
|
|
$nilai_sikap = optional($siswa->nilaiSikap)->nilai ?? 0;
|
|
|
|
$nilai_total = round(
|
|
($avg_tugas * $bobot_tugas / 100) +
|
|
($avg_ujian * $bobot_ujian / 100) +
|
|
($nilai_sikap * $bobot_sikap / 100),
|
|
2
|
|
);
|
|
|
|
NilaiTotalMapel::updateOrCreate(
|
|
['siswa_id' => $siswa->id, 'mapel_id' => $mapel->id],
|
|
['nilai_total' => $nilai_total]
|
|
);
|
|
}
|
|
|
|
$siswa->nilai_total_per_mapel = $siswa->nilaiTotalMapel
|
|
->whereIn('mapel_id', $mapelList->pluck('id'))
|
|
->pluck('nilai_total', 'mapel_id')
|
|
->toArray();
|
|
|
|
$siswa->current_nilai_sikap = optional($siswa->nilaiSikap)->nilai;
|
|
}
|
|
}
|
|
|
|
return view('guru.evaluasi.index', compact(
|
|
'daftarKelas',
|
|
'siswaList',
|
|
'kelas_id',
|
|
'bobot_tugas',
|
|
'bobot_ujian',
|
|
'bobot_sikap',
|
|
'mapelList',
|
|
'tugasList',
|
|
'ujianList',
|
|
'tahunAjaranAktif'
|
|
));
|
|
}
|
|
|
|
public function simpanBobot(Request $request)
|
|
{
|
|
$request->validate([
|
|
'kelas_id' => 'required|exists:kelas,id',
|
|
'bobot_tugas' => 'required|numeric|min:0|max:100',
|
|
'bobot_ujian' => 'required|numeric|min:0|max:100',
|
|
'bobot_sikap' => 'required|numeric|min:0|max:100',
|
|
]);
|
|
|
|
$total = $request->bobot_tugas + $request->bobot_ujian + $request->bobot_sikap;
|
|
if ($total !== 100) {
|
|
return redirect()->back()->withErrors(['bobot' => 'Total bobot harus 100%.']);
|
|
}
|
|
|
|
$guru = auth()->user()->guru;
|
|
PengaturanBobot::updateOrCreate(
|
|
['guru_id' => $guru->id, 'kelas_id' => $request->kelas_id],
|
|
[
|
|
'bobot_tugas' => $request->bobot_tugas,
|
|
'bobot_ujian' => $request->bobot_ujian,
|
|
'bobot_sikap' => $request->bobot_sikap,
|
|
]
|
|
);
|
|
|
|
return redirect()->route('guru.evaluasi.index', ['kelas_id' => $request->kelas_id])
|
|
->with('success', 'Bobot berhasil disimpan.');
|
|
}
|
|
|
|
public function hitungNilaiTotal(Request $request)
|
|
{
|
|
$guru = auth()->user()->guru;
|
|
$kelas_id = $request->kelas_id;
|
|
$tahunAjaranAktif = TahunAjaran::where('status', 'aktif')->firstOrFail();
|
|
|
|
$pengaturan = PengaturanBobot::where('guru_id', $guru->id)
|
|
->where('kelas_id', $kelas_id)
|
|
->first();
|
|
|
|
if (!$pengaturan) {
|
|
return redirect()->back()->withErrors(['msg' => 'Pengaturan bobot belum diatur untuk kelas ini.']);
|
|
}
|
|
|
|
$bobot_tugas = $pengaturan->bobot_tugas;
|
|
$bobot_ujian = $pengaturan->bobot_ujian;
|
|
$bobot_sikap = $pengaturan->bobot_sikap;
|
|
|
|
$mapelList = Mapel::whereHas('guruMapel', function ($q) use ($guru, $kelas_id, $tahunAjaranAktif) {
|
|
$q->where('guru_id', $guru->id)
|
|
->where('kelas_id', $kelas_id)
|
|
->where('tahun_ajaran_id', $tahunAjaranAktif->id);
|
|
})->get();
|
|
|
|
$siswaList = Siswa::where('kelas_id', $kelas_id)
|
|
->with([
|
|
'tugasSiswa.tugas.materi.mapel',
|
|
'hasilUjian.ujian.mapel', // ini PENTING dan WAJIB
|
|
'nilaiSikap',
|
|
'nilaiTotalMapel.mapel',
|
|
])
|
|
->get();
|
|
|
|
|
|
foreach ($siswaList as $siswa) {
|
|
foreach ($mapelList as $mapel) {
|
|
$avg_tugas = $siswa->tugasSiswa
|
|
->filter(function ($tugasSiswa) use ($mapel) {
|
|
return optional(optional($tugasSiswa->tugas)->materi)->mapel_id == $mapel->id;
|
|
})
|
|
->avg('nilai') ?? 0;
|
|
|
|
$avg_ujian = $siswa->hasilUjian
|
|
->where('ujian.mapel_id', $mapel->id)
|
|
->avg('nilai_total') ?? 0;
|
|
|
|
|
|
$nilai_sikap = optional($siswa->nilaiSikap)->nilai ?? 0;
|
|
|
|
$nilai_total = round(
|
|
($avg_tugas * $bobot_tugas / 100) +
|
|
($avg_ujian * $bobot_ujian / 100) +
|
|
($nilai_sikap * $bobot_sikap / 100),
|
|
2
|
|
);
|
|
|
|
NilaiTotalMapel::updateOrCreate(
|
|
['siswa_id' => $siswa->id, 'mapel_id' => $mapel->id],
|
|
['nilai_total' => $nilai_total]
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
return redirect()->back()->with('success', 'Nilai total berhasil dihitung ulang.');
|
|
}
|
|
|
|
public function simpanNilaiSikap(Request $request)
|
|
{
|
|
$request->validate([
|
|
'kelas_id' => 'required|exists:kelas,id',
|
|
'nilai_sikap' => 'required|array',
|
|
'nilai_sikap.*' => 'required|numeric|min:0|max:100',
|
|
]);
|
|
|
|
foreach ($request->nilai_sikap as $siswa_id => $nilai) {
|
|
NilaiSikap::updateOrCreate(
|
|
['siswa_id' => $siswa_id],
|
|
['nilai' => $nilai]
|
|
);
|
|
}
|
|
|
|
return redirect()->back()->with('success', 'Nilai sikap berhasil disimpan.');
|
|
}
|
|
}
|