From 915d3d8f8a3d00802fdb92ca7de170894e5e4fde Mon Sep 17 00:00:00 2001 From: JokoPrasetio Date: Tue, 2 Dec 2025 15:24:26 +0700 Subject: [PATCH] (done) value dari smart dimasukin ke form sesuai dengan data form yang ada --- app/Http/Controllers/SoalController.php | 101 +++++++++- resources/views/soal/index.blade.php | 80 +++++--- resources/views/soal/list.blade.php | 20 +- session_pegawai.json | 239 ++++++++++++++++++++++++ 4 files changed, 406 insertions(+), 34 deletions(-) create mode 100644 session_pegawai.json 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
@@ -151,13 +154,18 @@
@endif + @if ($formLocked) +
+ Anda sudah mengisi kuesioner ini. Jawaban di bawah ditampilkan dalam mode baca. +
+ @endif
Daftar Pertanyaan
Halaman {{ $hal }} dari {{ $listHal->count() }}
-
+ @csrf @@ -174,15 +182,19 @@ $optionValues = collect($options)->map(function ($value) { return is_scalar($value) ? (string) $value : ''; })->all(); - $oldAnswer = old('jawaban.' . $detail->id); - $oldOtherAnswer = old('jawaban_lainnya.' . $detail->id); - $hasOldAnswer = $oldAnswer !== null && $oldAnswer !== ''; - $isCustomOldAnswer = $hasOldAnswer && !in_array($oldAnswer, $optionValues, true); - if (!$oldOtherAnswer && $isCustomOldAnswer) { - $oldOtherAnswer = $oldAnswer; + $existingAnswer = $existingJawaban[$detail->id] ?? null; + $prefillAnswer = $prefillJawaban[$detail->id] ?? null; + $currentAnswer = old('jawaban.' . $detail->id, $existingAnswer ?? $prefillAnswer); + $existingOtherAnswer = $existingAnswer && !in_array($existingAnswer, $optionValues, true) ? $existingAnswer : null; + $prefillOtherAnswer = $prefillAnswer && !in_array($prefillAnswer, $optionValues, true) ? $prefillAnswer : null; + $oldOtherAnswer = old('jawaban_lainnya.' . $detail->id, $existingOtherAnswer ?? $prefillOtherAnswer); + $hasCurrentAnswer = $currentAnswer !== null && $currentAnswer !== ''; + $isCustomCurrentAnswer = $hasCurrentAnswer && !in_array($currentAnswer, $optionValues, true); + if (!$oldOtherAnswer && $isCustomCurrentAnswer) { + $oldOtherAnswer = $currentAnswer; } - $showLainnya = $isCustomOldAnswer - || (is_string($oldAnswer) && stripos($oldAnswer, 'lainnya') !== false) + $showLainnya = $isCustomCurrentAnswer + || (is_string($currentAnswer) && stripos($currentAnswer, 'lainnya') !== false) || (!empty($oldOtherAnswer)); $detailHal = $detail->hal ?? $listHal->first(); $isVisible = $detailHal == $hal; @@ -200,11 +212,11 @@ $useDualForm = $type === 'dual_form' || (!empty($dualFormConfig) && $dualFormConfig !== false); $dualYearOld = null; $dualMonthOld = null; - if ($useDualForm && $oldAnswer) { - if (preg_match('/([0-9]+)\\s*\\(Tahun\\)/i', $oldAnswer, $matchYear)) { + if ($useDualForm && $currentAnswer) { + if (preg_match('/([0-9]+)\\s*\\(Tahun\\)/i', $currentAnswer, $matchYear)) { $dualYearOld = $matchYear[1]; } - if (preg_match('/([0-9]+)\\s*\\(Bulan\\)/i', $oldAnswer, $matchMonth)) { + if (preg_match('/([0-9]+)\\s*\\(Bulan\\)/i', $currentAnswer, $matchMonth)) { $dualMonthOld = $matchMonth[1]; } } @@ -237,6 +249,7 @@ data-dual-input="tahun" value="{{ $dualYearOld }}" data-field-hal="{{ $detailHal }}" + @if($formLocked) disabled @endif placeholder="Masukkan tahun">
@@ -245,16 +258,18 @@ data-dual-input="bulan" value="{{ $dualMonthOld }}" data-field-hal="{{ $detailHal }}" + @if($formLocked) disabled @endif placeholder="Masukkan bulan">
@elseif ($type === 'textarea') @@ -262,12 +277,14 @@ name="jawaban[{{ $detail->id }}]" rows="4" required data-field-hal="{{ $detailHal }}" @if ($isConsentQuestion) data-consent-input="1" @endif - placeholder="Tulis jawaban Anda di sini">{{ old('jawaban.' . $detail->id) }} + @if($formLocked) disabled @endif + placeholder="Tulis jawaban Anda di sini">{{ $currentAnswer }} @elseif ($type === 'text') @else @if (!empty($options)) @@ -276,16 +293,17 @@ name="jawaban[{{ $detail->id }}]" data-field-hal="{{ $detailHal }}" @if ($isConsentQuestion) data-consent-input="1" @endif - @if ($hasLainnyaOption) data-lainnya-select="{{ $detail->id }}" @endif + @if ($hasLainnyaOption || $type === 'option_with_other') data-lainnya-select="{{ $detail->id }}" @endif data-select-search="true" + @if($formLocked) disabled @endif required> - + @foreach ($options as $option) @php $optionLabel = is_scalar($option) ? (string) $option : ''; $isLainnya = stripos($optionLabel, 'lainnya') !== false; $optionValue = $isLainnya && $oldOtherAnswer ? $oldOtherAnswer : $optionLabel; - $shouldSelect = $oldAnswer === $optionValue || ($isLainnya && $shouldForceLainnyaSelection); + $shouldSelect = $currentAnswer === $optionValue || ($isLainnya && $shouldForceLainnyaSelection); @endphp