mutu-rsab/app/Http/Controllers/SoalController.php

196 lines
6.0 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Jawaban;
use App\Models\JawabanDetail;
use App\Models\Soal;
use App\Models\SoalDetail;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;
class SoalController extends Controller
{
public function index(Request $request)
{
$daftarSoal = Soal::orderBy('judul_soal')->get();
if ($daftarSoal->isEmpty()) {
abort(404, 'Data soal tidak ditemukan.');
}
$selectedSoalId = (int) $request->query('soal_id', $daftarSoal->first()->id);
if (!$request->boolean('start')) {
return view('soal.list', [
'daftarSoal' => $daftarSoal,
]);
}
$soal = Soal::with('soalDetail')->find($selectedSoalId);
if (!$soal) {
abort(404, 'Data soal tidak ditemukan.');
}
$detailSoal = $soal->soalDetail()
->orderBy('hal')
->orderBy('id')
->get();
$daftarHal = $detailSoal->pluck('hal')
->map(function ($value) {
return is_null($value) ? null : (int) $value;
})
->filter(function ($value) {
return !is_null($value);
})
->unique()
->sort()
->values();
if ($daftarHal->isEmpty()) {
$daftarHal = collect([1]);
}
$hal = (int) $request->query('hal', $daftarHal->first());
if (!$daftarHal->contains($hal)) {
$hal = $daftarHal->first();
}
$detailSoal = $detailSoal->map(function ($detail) use ($daftarHal) {
$detail->hal = $detail->hal ?? $daftarHal->first();
return $detail;
});
$soal->setRelation('soalDetail', $detailSoal);
$halPertama = $daftarHal->first() ?? $hal;
$pegawai = session('pegawai');
dd($pegawai);
return view('soal.index', [
'soal' => $soal,
'hal' => $hal,
'halPertama' => $halPertama,
'daftarHal' => $daftarHal,
'totalHal' => $daftarHal->count(),
'soalId' => $soal->id,
'pegawai' => $pegawai,
]);
}
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'lms_mutu_soal_id' => 'required|integer',
'hal' => 'nullable|integer|min:1',
'jawaban' => 'required|array',
'jawaban.*' => 'required',
'jawaban_lainnya' => 'nullable|array',
'jawaban_lainnya.*' => 'nullable|string',
]);
$validator->after(function ($validator) use ($request) {
$jawabanUtama = $request->input('jawaban', []);
$jawabanLainnya = $request->input('jawaban_lainnya', []);
foreach ($jawabanUtama as $detailId => $answer) {
if ($answer === 'Lainnya') {
$jawabanIsian = $jawabanLainnya[$detailId] ?? null;
if (!$jawabanIsian) {
$validator->errors()->add("jawaban_lainnya.$detailId", 'Jawaban lainnya wajib diisi.');
}
}
}
});
$validated = $validator->validate();
$detailIds = array_map('intval', array_keys($validated['jawaban']));
$detailMeta = SoalDetail::whereIn('id', $detailIds)
->get(['id', 'soal'])
->keyBy('id');
$jawabanBaru = null;
$jawabanLainnya = $validated['jawaban_lainnya'] ?? [];
$namaResponden = null;
$unitKerja = null;
DB::connection('dbLmsMutu')->transaction(function () use (&$jawabanBaru, $validated, $jawabanLainnya, $detailMeta, &$namaResponden, &$unitKerja) {
$jawabanBaru = Jawaban::create([
'lms_mutu_soal_id' => $validated['lms_mutu_soal_id'],
'pegawai_id' => 1,
'tanggal_isi' => Carbon::now()->addHour(7),
]);
foreach ($validated['jawaban'] as $detailId => $answer) {
if (is_array($answer)) {
$answer = json_encode($answer);
}
if ($answer === 'Lainnya' && !empty($jawabanLainnya[$detailId])) {
$answer = $jawabanLainnya[$detailId];
}
if ($answer === null || $answer === '') {
continue;
}
$detailIdInt = (int) $detailId;
$pertanyaan = null;
if ($detailMeta->has($detailIdInt)) {
$decoded = json_decode($detailMeta[$detailIdInt]->soal, true);
$pertanyaan = Str::lower(trim($decoded['soal'] ?? ''));
}
if ($pertanyaan) {
if (Str::contains($pertanyaan, 'nama/inisial responden')) {
$namaResponden = $answer;
}
if (Str::contains($pertanyaan, 'unit/area kerja anda saat ini')) {
$unitKerja = $answer;
}
}
JawabanDetail::create([
'lms_mutu_jawaban_id' => $jawabanBaru->id,
'lms_mutu_soal_detail_id' => $detailIdInt,
'jawaban' => $answer,
]);
}
$updatePayload = [];
if (!empty($namaResponden)) {
$updatePayload['nama'] = $namaResponden;
}
if (!empty($unitKerja)) {
$updatePayload['unit'] = $unitKerja;
}
if (!empty($updatePayload)) {
$jawabanBaru->update($updatePayload);
}
});
return redirect('/')
->with('success', 'Jawaban berhasil disimpan.');
}
public function redirectSmart()
{
$data = request()->input('data');
$json = base64_decode($data);
$array = json_decode($json, true);
session(['pegawai' => $array]);
return redirect('/');
}
}