diff --git a/app/Http/Controllers/SoalController.php b/app/Http/Controllers/SoalController.php index daaf3a5..abcbeff 100644 --- a/app/Http/Controllers/SoalController.php +++ b/app/Http/Controllers/SoalController.php @@ -23,10 +23,18 @@ class SoalController extends Controller } $selectedSoalId = (int) $request->query('soal_id', $daftarSoal->first()->id); - + $pegawai = session('pegawai') ?? []; + $pegawaiId = is_array($pegawai) ? ($pegawai['id'] ?? null) : null; if (!$request->boolean('start')) { + $completedSoalIds = []; + if ($pegawaiId) { + $completedSoalIds = Jawaban::where('pegawai_id', $pegawaiId) + ->pluck('lms_mutu_soal_id') + ->toArray(); + } return view('soal.list', [ 'daftarSoal' => $daftarSoal, + 'completedSoalIds' => $completedSoalIds, ]); } @@ -70,8 +78,21 @@ class SoalController extends Controller $soal->setRelation('soalDetail', $detailSoal); $halPertama = $daftarHal->first() ?? $hal; - $pegawai = session('pegawai'); - dd($pegawai); + $existingJawaban = []; + $formLocked = false; + if ($pegawaiId) { + $jawabanTersimpan = Jawaban::where('pegawai_id', $pegawaiId) + ->where('lms_mutu_soal_id', $soal->id) + ->latest('tanggal_isi') + ->first(); + if ($jawabanTersimpan) { + $existingJawaban = $jawabanTersimpan->jawabanDetail + ->pluck('jawaban', 'lms_mutu_soal_detail_id') + ->toArray(); + $formLocked = true; + } + } + $prefillJawaban = $this->generatePrefillJawaban($detailSoal, $pegawai); return view('soal.index', [ 'soal' => $soal, 'hal' => $hal, @@ -80,6 +101,9 @@ class SoalController extends Controller 'totalHal' => $daftarHal->count(), 'soalId' => $soal->id, 'pegawai' => $pegawai, + 'prefillJawaban' => $prefillJawaban, + 'existingJawaban' => $existingJawaban, + 'formLocked' => $formLocked, ]); } @@ -119,11 +143,13 @@ class SoalController extends Controller $jawabanLainnya = $validated['jawaban_lainnya'] ?? []; $namaResponden = null; $unitKerja = null; + $pegawai = session('pegawai') ?? []; + $pegawaiId = is_array($pegawai) ? ($pegawai['id'] ?? null) : null; - DB::connection('dbLmsMutu')->transaction(function () use (&$jawabanBaru, $validated, $jawabanLainnya, $detailMeta, &$namaResponden, &$unitKerja) { + DB::connection('dbLmsMutu')->transaction(function () use (&$jawabanBaru, $validated, $jawabanLainnya, $detailMeta, &$namaResponden, &$unitKerja, $pegawaiId) { $jawabanBaru = Jawaban::create([ 'lms_mutu_soal_id' => $validated['lms_mutu_soal_id'], - 'pegawai_id' => 1, + 'pegawai_id' => $pegawaiId, 'tanggal_isi' => Carbon::now()->addHour(7), ]); @@ -192,4 +218,69 @@ class SoalController extends Controller session(['pegawai' => $array]); return redirect('/'); } + + protected function generatePrefillJawaban($detailSoal, $pegawai): array + { + if (!is_iterable($detailSoal) || !is_array($pegawai) || empty($pegawai)) { + return []; + } + + $prefill = []; + foreach ($detailSoal as $detail) { + $decoded = json_decode($detail->soal, true) ?? []; + $question = $decoded['soal'] ?? ''; + $value = $this->mapPegawaiValueToQuestion($question, $pegawai); + if ($value !== null && $value !== '') { + $prefill[$detail->id] = $value; + } + } + + return $prefill; + } + + protected function mapPegawaiValueToQuestion(?string $question, array $pegawai): ?string + { + if (!$question) { + return null; + } + + $normalized = Str::lower($question); + + if (Str::contains($normalized, 'nama/inisial responden')) { + return $pegawai['namaLengkap'] ?? $pegawai['nama'] ?? null; + } + + if (Str::contains($normalized, 'nomor telepon') || Str::contains($normalized, 'hp')) { + return $pegawai['noHandphone'] ?? null; + } + + if (Str::contains($normalized, 'jenis kelamin')) { + return $pegawai['jenisKelamin']['jenisKelamin'] ?? $pegawai['jenisKelamin']['namaExternal'] ?? null; + } + + if (Str::contains($normalized, 'unit/area kerja')) { + return $pegawai['ruangan']['namaRuangan'] ?? $pegawai['ruangan']['namaExternal'] ?? null; + } + + if (Str::contains($normalized, 'posisi kerja')) { + return $pegawai['jabatanInternal']['namaJabatan'] + ?? $pegawai['jabatanFungsional']['namaJabatan'] + ?? $pegawai['jenisPegawai']['jenisPegawai'] + ?? null; + } + + if (Str::contains($normalized, 'email')) { + return $pegawai['email'] ?? null; + } + + if (Str::contains($normalized, 'nip') || Str::contains($normalized, 'nomor identitas')) { + return $pegawai['nipPns'] ?? $pegawai['noIdentitas'] ?? null; + } + + if (Str::contains($normalized, 'nama faskes')) { + return $pegawai['ruangan']['namaExternal'] ?? 'RSAB HARAPAN KITA'; + } + + return null; + } } diff --git a/resources/views/soal/index.blade.php b/resources/views/soal/index.blade.php index d2dfcfe..da2b21f 100644 --- a/resources/views/soal/index.blade.php +++ b/resources/views/soal/index.blade.php @@ -100,6 +100,9 @@ $halSebelumnya = $posisiAktif > 0 ? $listHal[$posisiAktif - 1] : null; $halBerikut = ($posisiAktif < $listHal->count() - 1) ? $listHal[$posisiAktif + 1] : null; $isHalTerakhir = $halBerikut === null; + $formLocked = $formLocked ?? false; + $prefillJawaban = $prefillJawaban ?? []; + $existingJawaban = $existingJawaban ?? []; @endphp