From 846eb4cbca06abb2d532d87a6685d64d75b6e4ac Mon Sep 17 00:00:00 2001 From: JokoPrasetio Date: Mon, 15 Dec 2025 16:54:02 +0700 Subject: [PATCH] progress perbandingan selesai dan belum selesai di dashboard analisis --- app/Http/Controllers/AdminController.php | 162 +++++++++++++++++++++-- app/Http/Controllers/SoalController.php | 8 +- 2 files changed, 157 insertions(+), 13 deletions(-) diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index 644237d..1c41cb0 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -8,15 +8,51 @@ use App\Exports\DashboardExport; use App\Exports\DashboardJawabanExport; use App\Models\Jawaban; use App\Models\JawabanDetail; +use App\Models\MappingUnitPegawai; use App\Models\SoalDetail; use App\Models\UnitKerja; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Maatwebsite\Excel\Facades\Excel; use Yajra\DataTables\DataTables; +use Illuminate\Support\Str; class AdminController extends Controller { + private function unitKey(?string $s):string + { + if (!$s) return ''; + + $s = Str::of($s)->lower()->trim(); + + // buang teks dalam kurung: (SIMRS) dll + $s = $s->replaceMatches('/\s*\([^)]*\)\s*/u', ' '); + + // expand singkatan penting + $s = $s->replaceMatches('/\bksm\b/u', 'kelompok staf medik'); + $s = $s->replaceMatches('/\btimker\b/u', 'tim kerja'); + $s = $s->replaceMatches('/\bhumas\b/u', 'hubungan masyarakat'); + $s = $s->replaceMatches('/\bipt\b/u', 'instalasi perinatal terpadu'); + $s = $s->replaceMatches('/\bissb\b/u', 'instalasi sterilisasi sentral dan binatu'); + $s = $s->replaceMatches('/\bipsprs\b/u', 'instalasi pemeliharaan sarana prasarana rumah sakit'); + $s = $s->replaceMatches('/\binstalasi\s+rawat\s+intensif\s*\/\s*icu\b/u', 'instalasi rawat intensif'); + $s = $s->replaceMatches( + '/\binstalasi\s+kl\s*(?:&|\/)?\s*k3rs\b/u', + 'instalasi kesehatan lingkungan dan keselamatan dan kesehatan kerja rumah sakit' + ); + + + // samakan simbol + $s = $s->replace(['&', '/', '-', '.', ',', ':', ';'], ' '); + + // samakan kata penghubung + $s = $s->replace(' dan ', ' '); + + // rapikan spasi + $s = $s->replaceMatches('/\s+/u', ' ')->trim(); + + return (string) $s; + } // public function index() { @@ -78,23 +114,131 @@ class AdminController extends Controller return view('admin.dashboard', $data); } - public function get_data_pegawai_sudah_survey(Request $request) { - $masterUnits = ["Direktur Utama dan Direksi", "Satuan Pengawas Internal", "Komite Mutu", "Komite Medik", "Komite Keperawatan", "Komite PPI & PRA", "KTKL", "KFT", "KEH", "ULP", "Timker Yankep", "Timker Yanjang", "Timker Perencanaan, Evaluasi dan Program", "Timker Hukum dan Humas", "Timker Yanmed", "Timker Perencanaan dan Evaluasi Anggaran", "Timker Akutansi dan BMN", "Timker Organisasi dan Sumber Daya Manusia", "Timker TU & RT", "Timker Diklat", "Timker Penelitian", "Timker Pelaksanan Keuangan", "Instalasi Rawat Inap", "Instalasi Rawat Jalan Reguler", "Instalasi Rawat Intensif / ICU", "Instalasi Rehabilitasi Medik", "Instalasi Gizi", "Instalasi Laboratorium Terpadu", "Instalasi Sistem Informasi Manajemen Rumah Sakit (SIMRS)", "Instalasi Bedah Sentral", "Instalasi Radiologi", "Instalasi Farmasi", "Instalasi Rekam Medis", "Instalasi Gawat Darurat", "Instalasi Verifikasi dan Penjaminan Pasien", "Instalasi KL & K3RS", "ISSB", "IPT", "IPJNI", "IPSPRS", "IPPB", "IPPISGB", "Instalasi Rawat Jalan Eksekutif", "Instalasi Teknologi Berbantu (TRB)", "Klinik Utama Bintaro", "KSM Anak", "KSM Obstetri & Ginekologi", "KSM Bedah", "KSM Anestesi", "KSM Gigi & Mulut", "KSM Spesialis Lain", "KSM Umum", "Lainnya"]; + public function get_data_pegawai_sudah_survey(Request $request) + { + $masterUnits = [ + "Direktur Utama dan Direksi", + "Satuan Pengawas Internal", + "Komite Mutu", + "Komite Medik", + "Komite Keperawatan", + "Komite PPI & PRA", + "KTKL", "KFT", "KEH", "ULP", + "Timker Yankep", + "Timker Yanjang", + "Timker Perencanaan, Evaluasi dan Program", + "Timker Hukum dan Humas", + "Timker Yanmed", + "Timker Perencanaan dan Evaluasi Anggaran", + "Timker Akutansi dan BMN", + "Timker Organisasi dan Sumber Daya Manusia", + "Timker TU & RT", + "Timker Diklat", + "Timker Penelitian", + "Timker Pelaksanan Keuangan", + "Instalasi Rawat Inap", + "Instalasi Rawat Jalan Reguler", + "Instalasi Rawat Intensif / ICU", + "Instalasi Rehabilitasi Medik", + "Instalasi Gizi", + "Instalasi Laboratorium Terpadu", + "Instalasi Sistem Informasi Manajemen Rumah Sakit (SIMRS)", + "Instalasi Bedah Sentral", + "Instalasi Radiologi", + "Instalasi Farmasi", + "Instalasi Rekam Medis", + "Instalasi Gawat Darurat", + "Instalasi Verifikasi dan Penjaminan Pasien", + "Instalasi KL & K3RS", + "ISSB", "IPT", "IPJNI", "IPSPRS", "IPPB", "IPPISGB", + "Instalasi Rawat Jalan Eksekutif", + "Instalasi Teknologi Berbantu (TRB)", + "Klinik Utama Bintaro", + "KSM Anak", + "KSM Obstetri & Ginekologi", + "KSM Bedah", + "KSM Anestesi", + "KSM Gigi & Mulut", + "KSM Spesialis Lain", + "KSM Umum", + "Lainnya", + ]; - $query = Jawaban::query() ->select([ 'unit', DB::raw('COUNT(*) as total_unit'), ])->whereNotNull('unit'); - - if ($request->unit_kerja) { + // 1) Total karyawan per UnitKerja (unik pegawai) + $unitPegawai = UnitKerja::query() + ->where('statusenabled', true) + ->with([ + 'mappingPegawai' => function ($q) { + $q->where('statusenabled', true) + ->whereHas('pegawai', fn ($p) => $p->where('statusenabled', true)->where('kedudukanfk', 1)) + ->with([ + 'pegawai' => fn ($p) => $p->where('statusenabled', true)->where('kedudukanfk', 1) + ->select('id', 'namalengkap') + ]); + } + ]) + ->get(); + + $unitTotals = $unitPegawai->map(function ($unit) { + $pegawaiUnik = $unit->mappingPegawai + ->pluck('pegawai') + ->filter() + ->unique('id'); + + return [ + 'name' => $unit->name, + 'total_karyawan' => $pegawaiUnik->count(), + ]; + }); + + // map: key(normalized unit) => total_karyawan + $unitTotalMaps = $unitTotals->mapWithKeys(function ($item) { + return [$this->unitKey($item['name']) => (int)$item['total_karyawan']]; + }); + + // 2) Query Jawaban (ini yang nanti difilter) + $query = Jawaban::query() + ->select('unit', DB::raw('COUNT(*) as total_unit')) + ->whereNotNull('unit'); + + if ($request->unit_kerja) { $query->whereIn('unit', (array) $request->unit_kerja); - $masterUnits = array_intersect($masterUnits, $request->unit_kerja); } - $query->groupBy('unit') ->havingRaw('COUNT(*) > 0'); - $rekap = $query->get()->pluck('total_unit', 'unit'); - $data = collect($masterUnits)->filter(fn($unit) => ($rekap[$unit] ?? 0) > 0)->map(fn($unit) => [ 'unit' => $unit, 'total_unit' => $rekap[$unit], ])->values(); + + $jawabanCounts = $query->groupBy('unit')->get(); + + // Map total karyawan: key(normalized) => total_karyawan (ini dari UnitKerja) + $unitTotalMaps = $unitTotals->mapWithKeys(function ($item) { + return [$this->unitKey($item['name']) => (int) $item['total_karyawan']]; + }); + + // Build data dari JAWABAN langsung (bukan masterUnits) + $data = $jawabanCounts->map(function ($row) use ($unitTotalMaps) { + + $key = $this->unitKey($row->unit); + $sudahIsi = (int) $row->total_unit; + + if (isset($unitTotalMaps[$key]) && (int)$unitTotalMaps[$key] > 0) { + $totalKaryawan = (int) $unitTotalMaps[$key]; + $progress = $sudahIsi . ' / ' . $totalKaryawan; + } else { + $totalKaryawan = null; // tidak diketahui + $progress = (string) $sudahIsi; // hanya angka, tanpa /0 + } + + return [ + 'unit' => $row->unit, + 'total_unit' => $progress + ]; + }) + ->values(); + return DataTables::of($data)->make(true); } + public function download_report_data_pegawai_sudah_survey(Request $request) { $masterUnits = [ diff --git a/app/Http/Controllers/SoalController.php b/app/Http/Controllers/SoalController.php index 6ca4660..b95c59d 100644 --- a/app/Http/Controllers/SoalController.php +++ b/app/Http/Controllers/SoalController.php @@ -111,7 +111,7 @@ class SoalController extends Controller $formLocked = true; } } - + $prefillJawaban = []; return view('soal.index', [ 'soal' => $soal, @@ -194,7 +194,7 @@ class SoalController extends Controller $namaResponden = $answer; } - if (Str::contains($pertanyaan, 'unit/area kerja anda saat ini')) { + if (Str::contains($pertanyaan, 'apa unit/area kerja anda saat ini')) { $unitKerja = $answer; } } @@ -242,9 +242,9 @@ class SoalController extends Controller 'mengisi_tidak' => 0, ]); } - } + } + - return redirect()->route('soal.thankyou') ->with('success', 'Jawaban berhasil disimpan.');