Compare commits
No commits in common. "a52d0ccc1423a0d1b44bcee735863f7347b70e5d" and "846eb4cbca06abb2d532d87a6685d64d75b6e4ac" have entirely different histories.
a52d0ccc14
...
846eb4cbca
@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user