68 lines
2.2 KiB
PHP
68 lines
2.2 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\QuizAttempts;
|
|
use App\Models\QuizLevelSetting;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
class QuizAnalysisController extends Controller
|
|
{
|
|
static function getSkor($first)
|
|
{
|
|
$quizId = $first->quiz_id;
|
|
$quizLevelSettings = QuizLevelSetting::where('quiz_id', $quizId)->first();
|
|
$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];
|
|
}
|
|
return $totalSkorLevel;
|
|
}
|
|
|
|
public function analisis(Request $request)
|
|
{
|
|
$user = Auth::user()->siswa;
|
|
|
|
// Ambil semua attempt dengan relasi quizzes dan mata pelajaran
|
|
$attempts = QuizAttempts::where('nisn', $user->nisn)
|
|
->with(['quizzes.mataPelajaran'])
|
|
->get();
|
|
|
|
// Kelompokkan berdasarkan mata_pelajaran_id dan hitung rata-rata skor
|
|
$grouped = $attempts->groupBy(function ($item) {
|
|
return $item->quizzes->mataPelajaran->id;
|
|
});
|
|
|
|
$avgScores = $grouped->map(function ($items) {
|
|
$first = $items->first(); // untuk ambil info nama mapel
|
|
$avg = $items->avg('skor');
|
|
|
|
return [
|
|
'mapel_id' => $first->quizzes->mataPelajaran->id,
|
|
'mapel' => $first->quizzes->mataPelajaran->nama,
|
|
'rata_rata_skor' => $avg,
|
|
'persentase' => round(($avg / $this->getSkor($first)) * 100),
|
|
];
|
|
});
|
|
|
|
// Urutkan berdasarkan skor rata-rata (desc dan asc)
|
|
$kelebihan = $avgScores->sortByDesc('rata_rata_skor')->take(2);
|
|
$kelebihanMapelIds = $kelebihan->pluck('mapel_id')->toArray();
|
|
|
|
$kekurangan = $avgScores->whereNotIn('mapel_id', $kelebihanMapelIds)
|
|
->sortBy('rata_rata_skor')
|
|
->take(2);
|
|
|
|
return response()->json([
|
|
'kelebihan' => array_values($kelebihan->toArray()),
|
|
'kekurangan' => array_values($kekurangan->toArray())
|
|
]);
|
|
}
|
|
|
|
|
|
}
|