194 lines
5.9 KiB
PHP
194 lines
5.9 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;
|
|
|
|
return view('soal.index', [
|
|
'soal' => $soal,
|
|
'hal' => $hal,
|
|
'halPertama' => $halPertama,
|
|
'daftarHal' => $daftarHal,
|
|
'totalHal' => $daftarHal->count(),
|
|
'soalId' => $soal->id,
|
|
]);
|
|
}
|
|
|
|
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('/');
|
|
}
|
|
}
|