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 '';
$s = Str::of($s)->lower()->trim();
// buang teks dalam kurung: (SIMRS) dll
$s = $s->replaceMatches('/\s*\([^)]*\)\s*/u', ' ');
// expand singkatan penting
@ -32,26 +34,23 @@ class AdminController extends Controller
$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('/\bippb\b/u', 'instalasi pemasaran dan pengembangan bisnis');
$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();
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;
}
//
@ -206,19 +205,7 @@ class AdminController extends Controller
$query->whereIn('unit', (array) $request->unit_kerja);
}
$jawabanRaw = $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();
$jawabanCounts = $query->groupBy('unit')->get();
// Map total karyawan: key(normalized) => total_karyawan (ini dari UnitKerja)
$unitTotalMaps = $unitTotals->mapWithKeys(function ($item) {
@ -230,15 +217,18 @@ class AdminController extends Controller
$key = $this->unitKey($row->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 [
'unit' => $row->unit,
'total_unit' => $display
'total_unit' => $progress
];
})
->values();
@ -246,40 +236,72 @@ class AdminController extends Controller
return DataTables::of($data)->make(true);
}
public function download_report_data_pegawai_sudah_survey(Request $request)
{
$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(),
$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",
];
});
$unitTotalMaps = $unitTotals->mapWithKeys(function ($item) {
return [$this->unitKey($item['name']) => (int) $item['total_karyawan']];
});
$query = Jawaban::query()
->select('unit', DB::raw('COUNT(*) as total_unit'))
->select([
'unit',
DB::raw('COUNT(*) as total'),
])
->whereNotNull('unit');
if ($request->nama_pegawai) {
@ -287,46 +309,29 @@ class AdminController extends Controller
}
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
->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();
$rekap = $query->get()->pluck('total', 'unit');
$rows = [];
$rows[] = ['Unit Kerja', 'Total'];
foreach ($jawabanCounts as $row) {
$sudahIsi = (int) $row->total_unit;
// $totalKaryawan = $unitTotalMaps[$row->unit_key] ?? null;
// $display = ($totalKaryawan && $totalKaryawan > 0)
// ? "{$sudahIsi} / {$totalKaryawan}"
// : (string) $sudahIsi;
foreach ($masterUnits as $unit) {
$rows[] = [
$row->unit,
$sudahIsi,
$unit,
(int) ($rekap[$unit] ?? 0),
];
}
return Excel::download(new DashboardExport($rows), 'data pegawai yang sudah survey.xlsx');
}
}
public function data_tidak_mau_survey(Request $request)
{

View File

@ -59,10 +59,6 @@
</thead>
</table>
</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>