MIF_E31221225/app/Http/Controllers/Siswa/EvaluasiSiswaController.php

183 lines
5.4 KiB
PHP

<?php
namespace App\Http\Controllers\Siswa;
use PDF;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use App\Models\HasilUjian;
use App\Models\TugasSiswa;
use App\Models\TahunAjaran;
use App\Models\NilaiTotalMapel;
class EvaluasiSiswaController extends Controller
{
public function mapel()
{
$siswa = Auth::user()->siswa()->with('kelas.mapel')->first();
if (!$siswa || !$siswa->kelas) {
abort(404, 'Data kelas siswa tidak ditemukan.');
}
$tahunAjaranAktif = TahunAjaran::where('status', 'aktif')->firstOrFail();
$mapelList = $siswa->kelas->mapel;
$nilaiTugas = TugasSiswa::where('siswa_id', $siswa->id)
->whereNotNull('nilai')
->with('tugas.materi')
->get();
$nilaiUjian = HasilUjian::where('siswa_id', $siswa->id)
->whereNotNull('nilai_total')
->with('ujian')
->get();
$nilaiTotalMapel = NilaiTotalMapel::where('siswa_id', $siswa->id)
->whereIn('mapel_id', $mapelList->pluck('id'))
->pluck('nilai_total', 'mapel_id')
->toArray();
$rataNilai = [];
$jumlahNilaiTotal = 0;
$jumlahMapelAdaNilai = 0;
foreach ($mapelList as $mapel) {
$tugas = $nilaiTugas->filter(function ($item) use ($mapel) {
return $item->tugas->materi->mapel_id == $mapel->id;
});
$rataTugas = $tugas->count() ? round($tugas->avg('nilai'), 1) : null;
$ujian = $nilaiUjian->filter(function ($item) use ($mapel) {
return $item->ujian->mapel_id == $mapel->id;
});
$rataUjian = $ujian->count() ? round($ujian->avg('nilai_total'), 1) : null;
$nilaiTotal = $nilaiTotalMapel[$mapel->id] ?? null;
if ($nilaiTotal !== null) {
$jumlahNilaiTotal += $nilaiTotal;
$jumlahMapelAdaNilai++;
}
$rataNilai[$mapel->id] = [
'rata_tugas' => $rataTugas,
'rata_ujian' => $rataUjian,
'nilai_total' => $nilaiTotal,
];
}
$nilaiTotalKeseluruhan = $jumlahMapelAdaNilai > 0 ? round($jumlahNilaiTotal / $jumlahMapelAdaNilai, 2) : null;
return view('siswa.evaluasi.mapel', compact('mapelList', 'rataNilai', 'nilaiTotalKeseluruhan','tahunAjaranAktif'));
}
public function detailEvaluasi($mapelId)
{
$siswa = Auth::user()->siswa;
// Ambil nilai ujian siswa khusus mapel ini
$nilaiUjian = $siswa->hasilUjian()
->whereHas('ujian', function($q) use ($mapelId) {
$q->where('mapel_id', $mapelId);
})
->with('ujian')
->get();
// Ambil nilai tugas siswa khusus mapel ini
$nilaiTugas = $siswa->tugasSiswa()
->whereHas('tugas.materi', function ($query) use ($mapelId) {
$query->where('mapel_id', $mapelId);
})
->with('tugas.materi')
->get();
// Hitung persentase pengerjaan
$totalUjian = $nilaiUjian->count();
$totalTugas = $nilaiTugas->count();
$selesaiUjian = $nilaiUjian->whereNotNull('nilai_total')->count();
$selesaiTugas = $nilaiTugas->whereNotNull('nilai')->count();
$persenUjian = $totalUjian ? round(($selesaiUjian / $totalUjian) * 100, 1) : 0;
$persenTugas = $totalTugas ? round(($selesaiTugas / $totalTugas) * 100, 1) : 0;
return view('siswa.evaluasi.detail', compact(
'nilaiUjian',
'nilaiTugas',
'persenUjian',
'persenTugas'
));
}
// Import di atas controller
public function exportPdf()
{
$siswa = Auth::user()->siswa()->with('kelas.mapel')->first();
if (!$siswa || !$siswa->kelas) {
abort(404, 'Data kelas siswa tidak ditemukan.');
}
$tahunAjaranAktif = TahunAjaran::where('status', 'aktif')->firstOrFail();
$mapelList = $siswa->kelas->mapel;
$nilaiTugas = TugasSiswa::where('siswa_id', $siswa->id)
->whereNotNull('nilai')
->with('tugas.materi')
->get();
$nilaiUjian = HasilUjian::where('siswa_id', $siswa->id)
->whereNotNull('nilai_total')
->with('ujian')
->get();
$nilaiTotalMapel = NilaiTotalMapel::where('siswa_id', $siswa->id)
->whereIn('mapel_id', $mapelList->pluck('id'))
->pluck('nilai_total', 'mapel_id')
->toArray();
$rataNilai = [];
$jumlahNilaiTotal = 0;
$jumlahMapelAdaNilai = 0;
foreach ($mapelList as $mapel) {
$tugas = $nilaiTugas->filter(fn($item) => $item->tugas->materi->mapel_id == $mapel->id);
$rataTugas = $tugas->count() ? round($tugas->avg('nilai'), 1) : null;
$ujian = $nilaiUjian->filter(fn($item) => $item->ujian->mapel_id == $mapel->id);
$rataUjian = $ujian->count() ? round($ujian->avg('nilai_total'), 1) : null;
$nilaiTotal = $nilaiTotalMapel[$mapel->id] ?? null;
if ($nilaiTotal !== null) {
$jumlahNilaiTotal += $nilaiTotal;
$jumlahMapelAdaNilai++;
}
$rataNilai[$mapel->id] = [
'rata_tugas' => $rataTugas,
'rata_ujian' => $rataUjian,
'nilai_total' => $nilaiTotal,
];
}
$nilaiTotalKeseluruhan = $jumlahMapelAdaNilai > 0 ? round($jumlahNilaiTotal / $jumlahMapelAdaNilai, 2) : null;
$pdf = PDF::loadView('siswa.evaluasi.pdf', compact(
'mapelList',
'rataNilai',
'nilaiTotalKeseluruhan',
'tahunAjaranAktif',
'siswa'
));
return $pdf->stream('evaluasi-nilai-' . $siswa->nama . '.pdf');
}
}