MIF_E31222846/app/Repositories/GuruDashboardRepository.php

243 lines
9.7 KiB
PHP

<?php
namespace App\Repositories;
use App\Models\Kelas;
use App\Models\MataPelajaran;
use App\Models\Materi;
use App\Models\QuizAttempts;
use App\Models\QuizLevelSetting;
use App\Models\Quizzes;
use App\Models\Siswa;
use App\Models\SubmitTugas;
use App\Models\TahunAjaran;
use App\Models\Tugas;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
class GuruDashboardRepository
{
public function getDashboardData($tahunAjaran = 'all', $kelas = 'all', $quizStatus = 'all')
{
$guru = Auth::user()->guru;
// Get all academic years for filter based on guru's subjects
$tahunAjaranList = MataPelajaran::where('guru_nip', $guru->nip)
->distinct('tahun_ajaran')
->pluck('tahun_ajaran')
->toArray();
// Get all classes for filter based on guru's subjects
$kelasList = MataPelajaran::where('guru_nip', $guru->nip)
->distinct('kelas')
->pluck('kelas')
->toArray();
// Get active academic year
$tahunAjaranAktif = TahunAjaran::where('status', 'aktif')->first();
// Get relevant MataPelajaran first based on guru_nip and tahun_ajaran
$guruMataPelajaranQuery = MataPelajaran::where('guru_nip', $guru->nip);
if ($tahunAjaran !== 'all') {
$guruMataPelajaranQuery->where('tahun_ajaran', $tahunAjaran);
}
if ($kelas !== 'all') {
$guruMataPelajaranQuery->where('kelas', $kelas);
}
$guruMataPelajaranIds = $guruMataPelajaranQuery->pluck('id')->toArray();
$guruMataPelajaranClasses = $guruMataPelajaranQuery->pluck('kelas')->unique()->toArray();
// Now build the kelasQuery based on these class names
$kelasQuery = Kelas::whereIn('nama', $guruMataPelajaranClasses);
// Get subjects taught by this teacher (this query already correctly uses guru_nip)
$mataPelajaranQuery = MataPelajaran::where('guru_nip', $guru->nip);
// Apply filters if not 'all'
if ($tahunAjaran !== 'all') {
$mataPelajaranQuery->where('tahun_ajaran', $tahunAjaran);
}
if ($kelas !== 'all') {
$kelasQuery->where('nama', $kelas);
$mataPelajaranQuery->where('kelas', $kelas);
}
// Get counts
$kelasCount = $kelasQuery->count();
$mataPelajaranCount = $mataPelajaranQuery->count();
// Get total students from these classes
$siswaCount = Siswa::whereIn('kelas', $kelasQuery->pluck('nama'))->count();
// New features: Total Tugas, Materi, Quiz
$totalTugas = Tugas::where('guru_nip', $guru->nip)
->when($tahunAjaran !== 'all', function ($query) use ($tahunAjaran) {
return $query->where('tahun_ajaran', $tahunAjaran);
})
->when($kelas !== 'all', function ($query) use ($kelas) {
return $query->where('kelas', $kelas);
})
->count();
$totalMateri = Materi::whereIn('matapelajaran_id', $guruMataPelajaranIds)
->when($tahunAjaran !== 'all', function ($query) use ($tahunAjaran) {
return $query->where('tahun_ajaran', $tahunAjaran);
})
->count();
$totalQuiz = Quizzes::whereIn('matapelajaran_id', $guruMataPelajaranIds)
->count();
// Quiz Results (Passed/Failed)
$passedQuizzes = 0;
$failedQuizzes = 0;
$quizAttempts = QuizAttempts::whereHas('quizzes.mataPelajaran', function ($query) use ($guru, $tahunAjaran, $kelas) {
$query->where('guru_nip', $guru->nip);
if ($tahunAjaran !== 'all') {
$query->where('tahun_ajaran', $tahunAjaran);
}
if ($kelas !== 'all') {
$query->where('kelas', $kelas);
}
})->get();
foreach ($quizAttempts as $attempt) {
$quizLevelSettings = QuizLevelSetting::where('quiz_id', $attempt->quiz_id)->first();
if ($quizLevelSettings) {
$jumlahSoalPerLevel = json_decode($quizLevelSettings->jumlah_soal_per_level, true);
$totalSkorLevel = 0;
foreach (json_decode($quizLevelSettings->skor_level) as $key => $value) {
$totalSkorLevel += $value * (int) $jumlahSoalPerLevel[$key];
}
$persentase = ($totalSkorLevel > 0) ? round(($attempt->skor / $totalSkorLevel) * 100) : 0;
$kkm = $quizLevelSettings->kkm;
if ($persentase >= $kkm) {
$passedQuizzes++;
} else {
$failedQuizzes++;
}
}
}
// Prepare data for Mata Pelajaran Distribution Chart
$mataPelajaranChartLabels = [];
$mataPelajaranChartData = [];
$mataPelajaranWithClasses = MataPelajaran::where('guru_nip', $guru->nip)
->when($tahunAjaran !== 'all', function ($query) use ($tahunAjaran) {
return $query->where('tahun_ajaran', $tahunAjaran);
})
->when($kelas !== 'all', function ($query) use ($kelas) {
return $query->where('kelas', $kelas);
})
->get();
foreach ($mataPelajaranWithClasses as $mp) {
$studentsInClass = Siswa::where('kelas', $mp->kelas)->count();
$mataPelajaranChartLabels[] = $mp->nama; // Assuming 'nama' is the subject name
$mataPelajaranChartData[] = $studentsInClass; // Count students in the associated class
}
// Prepare data for Siswa per Kelas Chart
$kelasChartLabels = [];
$kelasChartData = [];
$guruClasses = Kelas::whereIn('nama', $guruMataPelajaranClasses)
->when($kelas !== 'all', function ($query) use ($kelas) {
return $query->where('nama', $kelas);
})
->get();
foreach ($guruClasses as $k) {
$siswaInKelasCount = Siswa::where('kelas', $k->nama)->count();
$kelasChartLabels[] = $k->nama;
$kelasChartData[] = $siswaInKelasCount;
}
// Prepare data for Nilai Rata-rata Tugas per Mata Pelajaran dan Kelas Chart
$tugasChartLabels = [];
$tugasChartData = [];
$tugasChartDataPerTugas = [];
// Get all mata pelajaran that the teacher teaches with filters
$mataPelajaranQuery = MataPelajaran::where('guru_nip', $guru->nip)
->when($tahunAjaran !== 'all', function ($query) use ($tahunAjaran) {
return $query->where('tahun_ajaran', $tahunAjaran);
})
->when($kelas !== 'all', function ($query) use ($kelas) {
return $query->where('kelas', $kelas);
})
->orderBy('nama', 'asc');
$mataPelajaranList = $mataPelajaranQuery->get();
foreach ($mataPelajaranList as $matpel) {
// Get all tasks for this mata pelajaran and class
$tugasForMatpel = Tugas::where('guru_nip', $guru->nip)
->where('matapelajaran_id', $matpel->id)
->where('kelas', $matpel->kelas)
->when($tahunAjaran !== 'all', function ($query) use ($tahunAjaran) {
return $query->where('tahun_ajaran', $tahunAjaran);
})
->orderBy('created_at', 'desc')
->get();
foreach ($tugasForMatpel as $tugas) {
// Get average score for this task
$avgNilai = SubmitTugas::where('tugas_id', $tugas->id)
->whereNotNull('nilai')
->avg('nilai');
if ($avgNilai !== null) {
$tugasChartLabels[] = "{$matpel->nama} ({$matpel->kelas}) - {$tugas->nama}";
$tugasChartData[] = round($avgNilai, 1);
$tugasChartDataPerTugas[] = [
'id_tugas' => $tugas->id,
'nama_tugas' => $tugas->nama,
'mata_pelajaran' => $matpel->nama,
'kelas' => $matpel->kelas,
'rata_rata' => round($avgNilai, 1),
'jumlah_submit' => SubmitTugas::where('tugas_id', $tugas->id)->count(),
'jumlah_dinilai' => SubmitTugas::where('tugas_id', $tugas->id)->whereNotNull('nilai')->count(),
'tanggal_tugas' => $tugas->tanggal,
'tenggat_waktu' => $tugas->tenggat
];
}
}
}
return [
'selected_year' => $tahunAjaran,
'selected_kelas' => $kelas,
'selected_quiz_status' => $quizStatus,
'tahun_ajaran_list' => $tahunAjaranList,
'kelas_list' => $kelasList,
'tahun_ajaran_aktif' => $tahunAjaranAktif ? $tahunAjaranAktif->tahun : '-',
'kelas' => $kelasCount,
'mata_pelajaran' => $mataPelajaranCount,
'siswa' => $siswaCount,
'total_tugas' => $totalTugas,
'total_materi' => $totalMateri,
'total_quiz' => $totalQuiz,
'passed_quizzes' => $passedQuizzes,
'failed_quizzes' => $failedQuizzes,
'mata_pelajaran_chart' => [
'labels' => $mataPelajaranChartLabels,
'data' => $mataPelajaranChartData,
],
'kelas_chart' => [
'labels' => $kelasChartLabels,
'data' => $kelasChartData,
],
'tugas_chart' => [
'labels' => $tugasChartLabels,
'data' => $tugasChartData,
'data_per_tugas' => $tugasChartDataPerTugas,
],
];
}
}