progress perbandingan selesai dan belum selesai di dashboard analisis
This commit is contained in:
parent
34776eb33a
commit
846eb4cbca
@ -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 = [
|
||||
|
||||
@ -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.');
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user