Compare commits

..

No commits in common. "a52d0ccc1423a0d1b44bcee735863f7347b70e5d" and "846eb4cbca06abb2d532d87a6685d64d75b6e4ac" have entirely different histories.

2 changed files with 90 additions and 89 deletions

View File

@ -24,6 +24,8 @@ class AdminController extends Controller
if (!$s) return ''; if (!$s) return '';
$s = Str::of($s)->lower()->trim(); $s = Str::of($s)->lower()->trim();
// buang teks dalam kurung: (SIMRS) dll
$s = $s->replaceMatches('/\s*\([^)]*\)\s*/u', ' '); $s = $s->replaceMatches('/\s*\([^)]*\)\s*/u', ' ');
// expand singkatan penting // expand singkatan penting
@ -32,26 +34,23 @@ class AdminController extends Controller
$s = $s->replaceMatches('/\bhumas\b/u', 'hubungan masyarakat'); $s = $s->replaceMatches('/\bhumas\b/u', 'hubungan masyarakat');
$s = $s->replaceMatches('/\bipt\b/u', 'instalasi perinatal terpadu'); $s = $s->replaceMatches('/\bipt\b/u', 'instalasi perinatal terpadu');
$s = $s->replaceMatches('/\bissb\b/u', 'instalasi sterilisasi sentral dan binatu'); $s = $s->replaceMatches('/\bissb\b/u', 'instalasi sterilisasi sentral dan binatu');
$s = $s->replaceMatches('/\bippb\b/u', 'instalasi pemasaran dan pengembangan bisnis');
$s = $s->replaceMatches('/\bipsprs\b/u', 'instalasi pemeliharaan sarana prasarana rumah sakit'); $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+rawat\s+intensif\s*\/\s*icu\b/u', 'instalasi rawat intensif');
$s = $s->replaceMatches( $s = $s->replaceMatches(
'/\binstalasi\s+kl\s*(?:&|\/)?\s*k3rs\b/u', '/\binstalasi\s+kl\s*(?:&|\/)?\s*k3rs\b/u',
'instalasi kesehatan lingkungan dan keselamatan dan kesehatan kerja rumah sakit' 'instalasi kesehatan lingkungan dan keselamatan dan kesehatan kerja rumah sakit'
); );
// samakan simbol
$s = $s->replace(['&', '/', '-', '.', ',', ':', ';'], ' '); $s = $s->replace(['&', '/', '-', '.', ',', ':', ';'], ' ');
// samakan kata penghubung
$s = $s->replace(' dan ', ' '); $s = $s->replace(' dan ', ' ');
// rapikan spasi
$s = $s->replaceMatches('/\s+/u', ' ')->trim(); $s = $s->replaceMatches('/\s+/u', ' ')->trim();
if (preg_match('/\bcl(ea|ae|e|a)?n(ing|er)?\s+ser(v|f)?(ice|is|vis|fis)\b/u', (string)$s)) {
return 'cleaning service';
}
// (opsional) kalau ada bentuk sangat sederhana
if (Str::contains((string)$s, ['cleaning service', 'cleaning servis', 'cleaner service', 'chelining servis'])) {
return 'cleaning service';
}
return (string) $s; return (string) $s;
} }
// //
@ -206,19 +205,7 @@ class AdminController extends Controller
$query->whereIn('unit', (array) $request->unit_kerja); $query->whereIn('unit', (array) $request->unit_kerja);
} }
$jawabanRaw = $query->groupBy('unit')->get(); $jawabanCounts = $query->groupBy('unit')->get();
$jawabanCounts = $jawabanRaw
->groupBy(fn($row) => $this->unitKey($row->unit)) // gabungkan berdasarkan key normalisasi
->map(function ($rows, $key) {
return (object) [
'unit_key' => $key,
// ambil nama display (pilih yang paling sering muncul)
'unit' => $rows->groupBy('unit')->sortByDesc(fn($g) => $g->sum('total_unit'))->keys()->first(),
'total_unit' => (int) $rows->sum('total_unit'),
];
})
->values();
// Map total karyawan: key(normalized) => total_karyawan (ini dari UnitKerja) // Map total karyawan: key(normalized) => total_karyawan (ini dari UnitKerja)
$unitTotalMaps = $unitTotals->mapWithKeys(function ($item) { $unitTotalMaps = $unitTotals->mapWithKeys(function ($item) {
@ -230,15 +217,18 @@ class AdminController extends Controller
$key = $this->unitKey($row->unit); $key = $this->unitKey($row->unit);
$sudahIsi = (int) $row->total_unit; $sudahIsi = (int) $row->total_unit;
$totalKaryawan = $unitTotalMaps[$key] ?? null;
$display = ($totalKaryawan && $totalKaryawan > 0)
? "{$sudahIsi} / {$totalKaryawan}"
: "{$sudahIsi}";
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 [ return [
'unit' => $row->unit, 'unit' => $row->unit,
'total_unit' => $display 'total_unit' => $progress
]; ];
}) })
->values(); ->values();
@ -246,40 +236,72 @@ class AdminController extends Controller
return DataTables::of($data)->make(true); return DataTables::of($data)->make(true);
} }
public function download_report_data_pegawai_sudah_survey(Request $request) public function download_report_data_pegawai_sudah_survey(Request $request)
{ {
$unitPegawai = UnitKerja::query() $masterUnits = [
->where('statusenabled', true) "Direktur Utama dan Direksi",
->with([ "Satuan Pengawas Internal",
'mappingPegawai' => function ($q) { "Komite Mutu",
$q->where('statusenabled', true) "Komite Medik",
->whereHas('pegawai', fn ($p) => $p->where('statusenabled', true)->where('kedudukanfk', 1)) "Komite Keperawatan",
->with([ "Komite PPI & PRA",
'pegawai' => fn ($p) => $p->where('statusenabled', true)->where('kedudukanfk', 1) "KTKL",
->select('id', 'namalengkap') "KFT",
]); "KEH",
} "ULP",
]) "Timker Yankep",
->get(); "Timker Yanjang",
"Timker Perencanaan, Evaluasi dan Program",
$unitTotals = $unitPegawai->map(function ($unit) { "Timker Hukum dan Humas",
$pegawaiUnik = $unit->mappingPegawai "Timker Yanmed",
->pluck('pegawai') "Timker Perencanaan dan Evaluasi Anggaran",
->filter() "Timker Akutansi dan BMN",
->unique('id'); "Timker Organisasi dan Sumber Daya Manusia",
"Timker TU & RT",
return [ "Timker Diklat",
'name' => $unit->name, "Timker Penelitian",
'total_karyawan' => $pegawaiUnik->count(), "Timker Pelaksanan Keuangan",
]; "Instalasi Rawat Inap",
}); "Instalasi Rawat Jalan Reguler",
"Instalasi Rawat Intensif / ICU",
$unitTotalMaps = $unitTotals->mapWithKeys(function ($item) { "Instalasi Rehabilitasi Medik",
return [$this->unitKey($item['name']) => (int) $item['total_karyawan']]; "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() $query = Jawaban::query()
->select('unit', DB::raw('COUNT(*) as total_unit')) ->select([
'unit',
DB::raw('COUNT(*) as total'),
])
->whereNotNull('unit'); ->whereNotNull('unit');
if ($request->nama_pegawai) { if ($request->nama_pegawai) {
@ -287,46 +309,29 @@ class AdminController extends Controller
} }
if ($request->select_unit_kerja) { if ($request->select_unit_kerja) {
$query->whereIn('unit', (array) $request->select_unit_kerja); $selectedUnits = (array) $request->select_unit_kerja;
$query->whereIn('unit', $selectedUnits);
$masterUnits = array_values(array_intersect($masterUnits, $selectedUnits));
} }
$jawabanRaw = $query->groupBy('unit')->get(); $query->groupBy('unit');
$jawabanCounts = $jawabanRaw $rekap = $query->get()->pluck('total', 'unit');
->groupBy(fn ($row) => $this->unitKey($row->unit))
->map(function ($rows, $key) {
return (object) [
'unit_key' => $key,
// nama display: pilih yang paling sering muncul
'unit' => $rows->groupBy('unit')
->sortByDesc(fn ($g) => (int) $g->sum('total_unit'))
->keys()
->first(),
'total_unit' => (int) $rows->sum('total_unit'),
];
})
->values();
$rows = []; $rows = [];
$rows[] = ['Unit Kerja', 'Total']; $rows[] = ['Unit Kerja', 'Total'];
foreach ($jawabanCounts as $row) { foreach ($masterUnits as $unit) {
$sudahIsi = (int) $row->total_unit;
// $totalKaryawan = $unitTotalMaps[$row->unit_key] ?? null;
// $display = ($totalKaryawan && $totalKaryawan > 0)
// ? "{$sudahIsi} / {$totalKaryawan}"
// : (string) $sudahIsi;
$rows[] = [ $rows[] = [
$row->unit, $unit,
$sudahIsi, (int) ($rekap[$unit] ?? 0),
]; ];
} }
return Excel::download(new DashboardExport($rows), 'data pegawai yang sudah survey.xlsx'); return Excel::download(new DashboardExport($rows), 'data pegawai yang sudah survey.xlsx');
}
}
public function data_tidak_mau_survey(Request $request) public function data_tidak_mau_survey(Request $request)
{ {

View File

@ -59,10 +59,6 @@
</thead> </thead>
</table> </table>
</div> </div>
<div class="mt-2 text-muted small">
<strong>Keterangan:</strong><br>
<span> Format <code>x / y</code> berarti <strong>x pegawai sudah mengisi</strong> dari <strong>total y pegawai aktif di SMART</strong>.</span><br>
</div>
</div> </div>
</div> </div>
</div> </div>