183 lines
5.4 KiB
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');
|
|
|
|
|
|
}
|
|
|
|
}
|