MIF_E31221420/app/Http/Controllers/Admin/CuVerificationController.php

152 lines
5.9 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\CuSubmission;
use App\Models\PenilaianAkhir;
use App\Models\CuSelection;
use App\Models\KategoriCu;
use App\Models\BobotKriteria;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class CuVerificationController extends Controller
{
public function index()
{
// Ringkasan CU yang sudah disetujui
$rows = DB::table('cu_submission as cs')
->join('kategori_cu as kc', 'cs.kategori_cu_id', '=', 'kc.id')
->join('peserta_profile as pp', 'cs.peserta_id', '=', 'pp.user_id')
->join('users as u', 'pp.user_id', '=', 'u.id')
->where('cs.status', CuSubmission::STATUS_APPROVED)
->select(
'cs.peserta_id',
'u.name',
DB::raw('COALESCE(SUM(CASE WHEN kc.bidang_id = 1 THEN cs.skor END),0) AS Kompetisi'),
DB::raw('COALESCE(SUM(CASE WHEN kc.bidang_id = 2 THEN cs.skor END),0) AS Pengakuan'),
DB::raw('COALESCE(SUM(CASE WHEN kc.bidang_id = 3 THEN cs.skor END),0) AS Penghargaan'),
DB::raw('COALESCE(SUM(CASE WHEN kc.bidang_id = 4 THEN cs.skor END),0) AS Karir_Organisasi'),
DB::raw('COALESCE(SUM(CASE WHEN kc.bidang_id = 5 THEN cs.skor END),0) AS Hasil_Karya'),
DB::raw('COALESCE(SUM(CASE WHEN kc.bidang_id = 6 THEN cs.skor END),0) AS PAK'),
DB::raw('COALESCE(SUM(CASE WHEN kc.bidang_id = 7 THEN cs.skor END),0) AS Kewirausahaan'),
DB::raw('SUM(cs.skor) AS total_mentah')
)
->groupBy('cs.peserta_id', 'u.name')
->get();
$maxRaw = $rows->max('total_mentah') ?: 1;
// Transformasi: sertakan semua bidang agar Blade dapat mengakses properti
$rows->transform(function ($r) use ($maxRaw) {
return (object) [
'peserta_id' => $r->peserta_id,
'name' => $r->name,
'Kompetisi' => $r->Kompetisi,
'Pengakuan' => $r->Pengakuan,
'Penghargaan' => $r->Penghargaan,
'Karir_Organisasi' => $r->Karir_Organisasi,
'Hasil_Karya' => $r->Hasil_Karya,
'PAK' => $r->PAK,
'Kewirausahaan' => $r->Kewirausahaan,
'total_mentah' => $r->total_mentah,
'normalized' => round($r->total_mentah / $maxRaw, 4),
];
});
// Ambil semua submission yang masih pending
$submissions = CuSubmission::with(['peserta', 'kategori'])
->where('status', CuSubmission::STATUS_PENDING)
->get();
return view('admin.verifikasiberkas', compact('rows', 'submissions'));
}
public function approve(CuSubmission $submission)
{
DB::transaction(function () use ($submission) {
// 1⃣ Tandai submission ini sebagai approved
$submission->update([
'status' => CuSubmission::STATUS_APPROVED,
'reviewed_at' => now(),
]);
// 2⃣ Kumpulkan semua CU yang sudah approved untuk peserta ini
$approved = CuSubmission::with('kategori')
->where('peserta_id', $submission->peserta_id)
->where('status', CuSubmission::STATUS_APPROVED)
->get();
// 3⃣ Ambil top 4 per bidang, lalu dari hasilnya ambil top 10 overall
$byBidang = $approved->groupBy(fn($item) => $item->kategori->bidang_id);
$selected = collect();
foreach ($byBidang as $group) {
$selected = $selected->merge($group->sortByDesc('skor')->take(4));
}
$final = $selected->sortByDesc('skor')->take(10);
// 4⃣ Hitung total skor mentah dari CU yang terpilih
$sumSkor = $final->sum('skor');
// 5⃣ Cari nilai tertinggi dari semua peserta (untuk normalisasi global)
$maxTotalSkor = CuSubmission::where('status', CuSubmission::STATUS_APPROVED)
->groupBy('peserta_id')
->selectRaw('SUM(skor) as total')
->orderByDesc('total')
->value('total') ?: 1;
// 6⃣ Hitung skor CU yang sudah dinormalisasi (maksimal = 1)
$normCu = round($sumSkor / $maxTotalSkor, 4);
// 7⃣ Ambil bobot kriteria untuk CU
$bobot = BobotKriteria::pluck('bobot', 'nama_kriteria');
$bCu = $bobot['CU'] ?? 0;
// 8⃣ Simpan/Update ke penilaian_akhir (PI & BI = 0 dulu)
PenilaianAkhir::updateOrCreate(
['peserta_id' => $submission->peserta_id],
[
'skor_cu_normal' => $normCu,
'skor_pi_normal' => 0.0000,
'skor_bi_normal' => 0.0000,
'total_akhir' => round($normCu * $bCu, 4),
]
);
// 9⃣ Buat record di cu_selection (pakai skor normalisasi)
CuSelection::create([
'submission_id' => $submission->id,
'peserta_id' => $submission->peserta_id,
'level_id' => $submission->kategori->level_id,
'selection_round' => 1,
'status_lolos' => 'pending',
'skor_cu' => $normCu,
'selected_at' => now(),
]);
});
return redirect()->route('admin.verification.index')
->with('success', 'Submission CU berhasil disetujui.');
}
public function reject(Request $request, CuSubmission $submission)
{
$request->validate([
'comment' => 'required|string',
]);
$submission->status = CuSubmission::STATUS_REJECTED;
$submission->comment = $request->comment;
$submission->reviewed_at = now();
$submission->save();
// ✅ Redirect untuk mencegah browser mengulang GET ke URL POST
return redirect()->route('admin.verification.index')->with('success', 'Submission berhasil ditolak.');
}
}