mutu-rsab/app/Http/Controllers/AdminController.php
2025-12-16 09:37:16 +07:00

1469 lines
60 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Exports\DashboardAnalisisExport;
use App\Exports\DashboardDemografiExport;
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();
$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('/\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'
);
$s = $s->replace(['&', '/', '-', '.', ',', ':', ';'], ' ');
$s = $s->replace(' dan ', ' ');
$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;
}
//
public function index()
{
$data['list_unit_kerja'] = [
"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 (Mahasiswa dan Outsourcing)"
];
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",
];
// 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);
}
$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();
// 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;
$totalKaryawan = $unitTotalMaps[$key] ?? null;
$display = ($totalKaryawan && $totalKaryawan > 0)
? "{$sudahIsi} / {$totalKaryawan}"
: "{$sudahIsi}";
return [
'unit' => $row->unit,
'total_unit' => $display
];
})
->values();
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(),
];
});
$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'))
->whereNotNull('unit');
if ($request->nama_pegawai) {
$query->where('nama', 'ILIKE', '%' . $request->nama_pegawai . '%');
}
if ($request->select_unit_kerja) {
$query->whereIn('unit', (array) $request->select_unit_kerja);
}
$jawabanRaw = $query->groupBy('unit')->get();
$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();
$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;
$rows[] = [
$row->unit,
$sudahIsi,
];
}
return Excel::download(new DashboardExport($rows), 'data pegawai yang sudah survey.xlsx');
}
public function data_tidak_mau_survey(Request $request)
{
$total_tidak = DB::table('lms_mutu_jawaban_detail as a')
->where('a.lms_mutu_soal_detail_id', 51)
->where('a.jawaban', 'TIDAK')
->count();
return response()->json([
'msg' => 'Berhasil',
'data' => $total_tidak
], 200);
}
public function dashboard_analisis()
{
$data['list_unit_kerja'] = [
"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 (Mahasiswa dan Outsourcing)"
];
return view('admin.dashboard_analisis', $data);
}
public function dashboard_jawaban()
{
$data['list_unit_kerja'] = [
"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 (Mahasiswa dan Outsourcing)"
];
return view('admin.dashboard_jawaban', $data);
}
public function get_data_dashboard_analisis(Request $request)
{
try {
$soal = SoalDetail::all()->sortBy('id')->values()->toArray();
$data = [];
$data_option_setuju = [];
$data_option_selalu = [];
$data_option_other = [];
$total = 0;
foreach ($soal as $key => $value) {
$jawaban = [];
$soal_json = json_decode($value['soal'], true);
if($soal_json['is_analitic'] != 1){
continue;
}
$sub = DB::table('lms_mutu_jawaban_detail')
->select('lms_mutu_soal_detail_id', DB::raw('COUNT(*) AS total_semua'))
->join(
'lms_mutu_jawaban',
'lms_mutu_jawaban_detail.lms_mutu_jawaban_id',
'=',
'lms_mutu_jawaban.id'
)
->where('lms_mutu_soal_detail_id', $value['id'])
->where('jawaban', '!=', null);
if($request->unit_kerja) {
$sub->whereIn('lms_mutu_jawaban.unit', $request->unit_kerja);
}
$sub->groupBy('lms_mutu_soal_detail_id');
$result = DB::table('lms_mutu_jawaban_detail AS d')
->joinSub($sub, 't', function($join) {
$join->on('t.lms_mutu_soal_detail_id', '=', 'd.lms_mutu_soal_detail_id');
})
->join(
'lms_mutu_jawaban',
'd.lms_mutu_jawaban_id',
'=',
'lms_mutu_jawaban.id'
)
->selectRaw(
'd.lms_mutu_soal_detail_id,
d.jawaban,
COUNT(*) AS total_jawaban,
t.total_semua,
ROUND((COUNT(*)::numeric / t.total_semua::numeric) * 100) AS percent'
)
->where('d.lms_mutu_soal_detail_id', $value['id'])
->where('d.jawaban', '!=', null)
->groupBy('d.lms_mutu_soal_detail_id', 'd.jawaban', 't.total_semua');
if($request->unit_kerja) {
$result->whereIn('lms_mutu_jawaban.unit', $request->unit_kerja);
}
$result->orderBy('d.lms_mutu_soal_detail_id', 'asc');
if(is_array($soal_json['options'])){
if(count($soal_json['options']) > 0){
foreach ($soal_json['options'] as $v) {
if($v != 'Tidak Berlaku/Tidak Tahu, Sebutkan Alasan'){
$row = (clone $result)->where('d.jawaban', $v)
->first();
if($row) {
if($total == 0){
$total = $row->total_semua;
}
$data_per_jawaban = [
'name' => $v,
'percent' => (float) $row->percent,
'value' => $row->total_jawaban,
'total' => $row->total_semua
];
array_push($jawaban, $data_per_jawaban);
} else {
$data_per_jawaban = [
'name' => $v,
'percent' => 0
];
array_push($jawaban, $data_per_jawaban);
}
} else {
$get_data = DB::table('lms_mutu_jawaban_detail AS d')
->joinSub($sub, 't', function($join) {
$join->on('t.lms_mutu_soal_detail_id', '=', 'd.lms_mutu_soal_detail_id');
})
->join(
'lms_mutu_jawaban',
'd.lms_mutu_jawaban_id',
'=',
'lms_mutu_jawaban.id'
)
->selectRaw(
"d.lms_mutu_soal_detail_id,
STRING_AGG(d.jawaban, ', ') AS jawaban_gabungan,
t.total_semua,
COUNT(*) AS total_jawaban,
ROUND((COUNT(*)::numeric / t.total_semua::numeric) * 100) AS percent"
)
->where('d.lms_mutu_soal_detail_id', $value['id'])
->where('jawaban', '!=', null)
->whereNotIn('d.jawaban', $soal_json['options'])
->groupBy('d.lms_mutu_soal_detail_id', 't.total_semua')->first();
// $get_data = (clone $result)->whereNotIn('d.jawaban', $soal_json['options'])
// ->get()
// ->toArray();
// foreach ($get_data as $val) {
if($get_data){
$data_per_jawaban = [
'name' => 'Tidak Berlaku/Tidak Tahu, Sebutkan Alasan',
'percent' => (float) $get_data->percent,
'value' => $get_data->total_jawaban,
'total' => $get_data->total_semua,
'jawaban' => $get_data->jawaban_gabungan
];
} else {
$data_per_jawaban = [
'name' => 'Tidak Berlaku/Tidak Tahu, Sebutkan Alasan',
'percent' => 0,
'value' => 0,
'jawaban' => '-'
];
}
// }
array_push($jawaban, $data_per_jawaban);
}
}
} else {
$get_data = $result->get()
->toArray();
foreach ($get_data as $val) {
$data_per_jawaban = [
'name' => $val->jawaban,
'percent' => (float) $val->percent,
'value' => $val->total_jawaban,
'total' => $val->total_semua
];
array_push($jawaban, $data_per_jawaban);
}
}
$data_persoal = [
'no_soal' => $soal_json['no'],
'soal' => $soal_json['soal'],
'jawaban' => $jawaban
];
if(in_array('Sangat Tidak Setuju', $soal_json['options'])) {
array_push($data_option_setuju, $data_persoal);
} else if(in_array('Selalu', $soal_json['options'])) {
array_push($data_option_selalu, $data_persoal);
} else {
array_push($data_option_other, $data_persoal);
}
}
}
$data = [
'option_setuju' => $data_option_setuju,
'option_other' => $data_option_other,
'option_selalu' => $data_option_selalu,
'total' => $total
];
return response()->json([
'msg' => 'Berhasil',
'data' => $data
], 200);
} catch (\ErrorException $th) {
dd($th);
return response()->json([
'msg' => 'Oops something wrong!',
'data' => null,
'msg_dev' => $th
], 500);
}
}
public function report_data_dashboard_analisis(Request $request)
{
try {
$soal = SoalDetail::all()->sortBy('id')->values()->toArray();
$data_option_setuju = [];
$data_option_selalu = [];
$data_option_other = [];
$total = 0;
foreach ($soal as $key => $value) {
$jawaban = [];
$soal_json = json_decode($value['soal'], true);
if($soal_json['is_analitic'] != 1){
continue;
}
$sub = DB::table('lms_mutu_jawaban_detail')
->select('lms_mutu_soal_detail_id', DB::raw('COUNT(*) AS total_semua'))
->join(
'lms_mutu_jawaban',
'lms_mutu_jawaban_detail.lms_mutu_jawaban_id',
'=',
'lms_mutu_jawaban.id'
)
->where('lms_mutu_soal_detail_id', $value['id']);
if($request->unit_kerja) {
$sub->whereIn('lms_mutu_jawaban.unit', $request->unit_kerja);
}
$sub->groupBy('lms_mutu_soal_detail_id');
$result = DB::table('lms_mutu_jawaban_detail AS d')
->joinSub($sub, 't', function($join) {
$join->on('t.lms_mutu_soal_detail_id', '=', 'd.lms_mutu_soal_detail_id');
})
->join(
'lms_mutu_jawaban',
'd.lms_mutu_jawaban_id',
'=',
'lms_mutu_jawaban.id'
)
->selectRaw(
'd.lms_mutu_soal_detail_id,
d.jawaban,
COUNT(*) AS total_jawaban,
t.total_semua,
ROUND((COUNT(*)::numeric / t.total_semua::numeric) * 100) AS percent'
)
->where('d.lms_mutu_soal_detail_id', $value['id'])
->groupBy('d.lms_mutu_soal_detail_id', 'd.jawaban', 't.total_semua');
if($request->unit_kerja) {
$result->whereIn('lms_mutu_jawaban.unit', $request->unit_kerja);
}
$result->orderBy('d.lms_mutu_soal_detail_id', 'asc');
if(is_array($soal_json['options'])){
if(count($soal_json['options']) > 0){
foreach ($soal_json['options'] as $v) {
if($v != 'Tidak Berlaku/Tidak Tahu, Sebutkan Alasan'){
$row = (clone $result)->where('d.jawaban', $v)
->first();
if($row) {
if($total == 0){
$total = $row->total_semua;
}
$data_per_jawaban = [
'name' => $v,
'percent' => (float) $row->percent,
'value' => $row->total_jawaban,
'total' => $row->total_semua
];
array_push($jawaban, $data_per_jawaban);
} else {
$data_per_jawaban = [
'name' => $v,
'percent' => 0
];
array_push($jawaban, $data_per_jawaban);
}
} else {
$get_data = DB::table('lms_mutu_jawaban_detail AS d')
->joinSub($sub, 't', function($join) {
$join->on('t.lms_mutu_soal_detail_id', '=', 'd.lms_mutu_soal_detail_id');
})
->join(
'lms_mutu_jawaban',
'd.lms_mutu_jawaban_id',
'=',
'lms_mutu_jawaban.id'
)
->selectRaw(
"d.lms_mutu_soal_detail_id,
STRING_AGG(d.jawaban, ', ') AS jawaban_gabungan,
t.total_semua,
COUNT(*) AS total_jawaban,
ROUND((COUNT(*)::numeric / t.total_semua::numeric) * 100) AS percent"
)
->where('d.lms_mutu_soal_detail_id', $value['id'])
->whereNotIn('d.jawaban', $soal_json['options'])
->groupBy('d.lms_mutu_soal_detail_id', 't.total_semua')->first();
// $get_data = (clone $result)->whereNotIn('d.jawaban', $soal_json['options'])
// ->get()
// ->toArray();
// foreach ($get_data as $val) {
if($get_data){
$data_per_jawaban = [
'name' => 'Tidak Berlaku/Tidak Tahu, Sebutkan Alasan',
'percent' => (float) $get_data->percent,
'value' => $get_data->total_jawaban,
'total' => $get_data->total_semua,
'jawaban' => $get_data->jawaban_gabungan
];
} else {
$data_per_jawaban = [
'name' => 'Tidak Berlaku/Tidak Tahu, Sebutkan Alasan',
'percent' => 0,
'value' => 0,
'jawaban' => '-'
];
}
// }
array_push($jawaban, $data_per_jawaban);
}
}
} else {
$get_data = $result->get()
->toArray();
foreach ($get_data as $val) {
$data_per_jawaban = [
'name' => $val->jawaban,
'percent' => (float) $val->percent,
'value' => $val->total_jawaban,
'total' => $val->total_semua
];
array_push($jawaban, $data_per_jawaban);
}
}
$data_persoal = [
'no_soal' => $soal_json['no'],
'soal' => $soal_json['soal'],
'jawaban' => $jawaban
];
if(in_array('Sangat Tidak Setuju', $soal_json['options'])) {
array_push($data_option_setuju, $data_persoal);
} else if(in_array('Selalu', $soal_json['options'])) {
array_push($data_option_selalu, $data_persoal);
} else {
array_push($data_option_other, $data_persoal);
}
}
}
$data_setuju_report = [];
$data_setuju_header = ['No', 'Soal'];
foreach ($data_option_setuju as $key => $value) {
$data['no'] = $value['no_soal'];
$data['soal'] = $value['soal'];
foreach ($value['jawaban'] as $k => $v) {
if(!in_array($v['name'], $data_setuju_header)){
array_push($data_setuju_header, $v['name']);
}
if($v['percent'] > 0){
$data[$v['name']] = $v['percent'] . '%/ '. $v['value']. ' Orang';
} else {
$data[$v['name']] = '-';
}
// if($v['name'] == 'Tidak Berlaku/Tidak Tahu, Sebutkan Alasan') {
// $data['jawaban_lainnya'] = $v['jawaban'];
// }
}
$data['total'] = $total;
array_push($data_setuju_report, $data);
}
// array_push($data_setuju_header, 'Jawaban Lainnya');
array_push($data_setuju_header, 'Total Responden');
array_unshift($data_setuju_report, $data_setuju_header);
$data_other_report = [];
$data_other_header = ['No', 'Soal'];
foreach ($data_option_other as $key => $value) {
$data_other['no'] = $value['no_soal'];
$data_other['soal'] = $value['soal'];
foreach ($value['jawaban'] as $k => $v) {
if(!in_array($v['name'], $data_other_header)){
array_push($data_other_header, $v['name']);
}
if($v['percent'] > 0){
$data_other[$v['name']] = $v['percent'] . '%/ '. $v['value']. ' Orang';
} else {
$data_other[$v['name']] = '-';
}
}
$data_other['total'] = $total;
array_push($data_other_report, $data_other);
}
array_push($data_other_header, 'Total Responden');
array_unshift($data_other_report, $data_other_header);
$data_selalu_report = [];
$data_selalu_header = ['No', 'Soal'];
foreach ($data_option_selalu as $key => $value) {
$data_selalu['no'] = $value['no_soal'];
$data_selalu['soal'] = $value['soal'];
foreach ($value['jawaban'] as $k => $v) {
if(!in_array($v['name'], $data_selalu_header)){
array_push($data_selalu_header, $v['name']);
}
if($v['percent'] > 0){
$data_selalu[$v['name']] = $v['percent'] . '%/ '. $v['value']. ' Orang';
} else {
$data_selalu[$v['name']] = '-';
}
// if($v['name'] == 'Tidak Berlaku/Tidak Tahu, Sebutkan Alasan') {
// $data_selalu['jawaban_lainnya'] = $v['jawaban'];
// }
}
$data_selalu['total'] = $total;
array_push($data_selalu_report, $data_selalu);
}
// array_push($data_selalu_header, 'Jawaban Lainnya');
array_push($data_selalu_header, 'Total Responden');
array_unshift($data_selalu_report, $data_selalu_header);
// $data = [
// 'option_setuju' => $data_option_setuju,
// 'option_other' => $data_option_other,
// 'option_selalu' => $data_option_selalu,
// 'total' => $total
// ];
return Excel::download(new DashboardAnalisisExport($data_setuju_report, $data_other_report, $data_selalu_report), 'data analisis.xlsx');
} catch (\ErrorException $th) {
dd($th);
return response()->json([
'msg' => 'Oops something wrong!',
'data' => null,
'msg_dev' => $th
], 500);
}
}
public function get_jawaban($jawaban_id)
{
try {
$data = JawabanDetail::where('lms_mutu_jawaban_id', $jawaban_id)->join('lms_mutu_soal_detail', 'lms_mutu_soal_detail_id', '=', 'lms_mutu_soal_detail.id')->orderBy('lms_mutu_soal_detail.id', 'asc')->get()->toArray();
return response()->json([
'msg' => 'Berhasil',
'data' => $data
], 200);
} catch (\ErrorException $th) {
return response()->json([
'msg' => 'Oops something wrong!',
'data' => null,
'msg_dev' => $th
], 500);
}
}
public function download_report_data_jawaban_pegawai(Request $request)
{
$query = Jawaban::query();
$query->select('id', 'nama', 'unit');
if ($request->nama_pegawai) {
$query->where('nama', 'ILIKE', '%' . $request->nama_pegawai . '%');
}
if ($request->select_unit_kerja) {
$query->whereIn('unit', $request->select_unit_kerja);
}
$data = $query->get()->toArray();
$data_header = ['Nama Pegawai', 'Unit Kerja'];
foreach ($data as $key => &$value) {
$data_jawaban = JawabanDetail::select(
'lms_mutu_jawaban_detail.*',
DB::raw("lms_mutu_soal_detail.soal->>'soal' as soal"),
DB::raw("lms_mutu_soal_detail.soal->>'no' as no")
)->where('lms_mutu_jawaban_id', $value['id'])->join('lms_mutu_soal_detail', 'lms_mutu_soal_detail_id', '=', 'lms_mutu_soal_detail.id')->orderBy('id', 'asc')->get()->toArray();
foreach ($data_jawaban as $k => $v) {
if(count($data_jawaban) > 10){
if(!in_array($v['soal'], $data_header)){
array_push($data_header, $v['soal']);
}
}
$data[$key][$v['soal']] = $v['jawaban'];
}
unset($value['id']);
unset($value['jawaban_detail']);
}
return Excel::download(new DashboardJawabanExport($data_header, $data), 'data jawaban pegawai.xlsx');
}
public function get_data_pegawai_jawaban(Request $request)
{
$query = Jawaban::query();
if ($request->nama_pegawai) {
$query->where('nama', 'ILIKE', '%' . $request->nama_pegawai . '%');
}
if ($request->unit_kerja) {
$query->whereIn('unit', $request->unit_kerja);
}
return DataTables::of($query)
->addColumn('nama_pegawai', function($row){
return $row?->pegawai?->nama ?? '-';
})
->addColumn('action', function ($row) {
return '
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#detail_jawaban" data-id="'. $row->id .'">
Detail
</button>
';
})
->make(true);
}
public function dashboard_demografi()
{
$data['list_unit_kerja'] = [
"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 (Mahasiswa dan Outsourcing)"
];
return view('admin.dashboard_demografi', $data);
}
public function get_data_dashboard_demografi(Request $request)
{
try {
$soal = SoalDetail::all()->sortBy('id')->values()->toArray();
$data = [];
$data_all = [];
$total = 0;
foreach ($soal as $key => $value) {
$jawaban = [];
$soal_json = json_decode($value['soal'], true);
if($soal_json['is_analitic'] != 2){
continue;
}
$sub = DB::table('lms_mutu_jawaban_detail')
->select('lms_mutu_soal_detail_id', DB::raw('COUNT(*) AS total_semua'))
->join(
'lms_mutu_jawaban',
'lms_mutu_jawaban_detail.lms_mutu_jawaban_id',
'=',
'lms_mutu_jawaban.id'
)
->where('lms_mutu_soal_detail_id', $value['id'])
->where('jawaban', '!=', null);
if($request->unit_kerja) {
$sub->whereIn('lms_mutu_jawaban.unit', $request->unit_kerja);
}
$sub->groupBy('lms_mutu_soal_detail_id');
$result = DB::table('lms_mutu_jawaban_detail AS d')
->joinSub($sub, 't', function($join) {
$join->on('t.lms_mutu_soal_detail_id', '=', 'd.lms_mutu_soal_detail_id');
})
->join(
'lms_mutu_jawaban',
'd.lms_mutu_jawaban_id',
'=',
'lms_mutu_jawaban.id'
)
->selectRaw(
'd.lms_mutu_soal_detail_id,
d.jawaban,
COUNT(*) AS total_jawaban,
t.total_semua,
ROUND((COUNT(*)::numeric / t.total_semua::numeric) * 100) AS percent'
)
->where('d.lms_mutu_soal_detail_id', $value['id'])
->where('d.jawaban', '!=', null)
->groupBy('d.lms_mutu_soal_detail_id', 'd.jawaban', 't.total_semua');
if($request->unit_kerja) {
$result->whereIn('lms_mutu_jawaban.unit', $request->unit_kerja);
}
$result->orderBy('d.lms_mutu_soal_detail_id', 'asc');
if(is_array($soal_json['options'])){
if(count($soal_json['options']) > 0){
foreach ($soal_json['options'] as $v) {
if($v != 'Lainnya'){
$row = (clone $result)->where('d.jawaban', $v)
->first();
if($row) {
if($total == 0){
$total = $row->total_semua;
}
$data_per_jawaban = [
'name' => $v,
'percent' => (float) $row->percent,
'value' => $row->total_jawaban,
'total' => $row->total_semua
];
array_push($jawaban, $data_per_jawaban);
} else {
$data_per_jawaban = [
'name' => $v,
'percent' => 0
];
array_push($jawaban, $data_per_jawaban);
}
} else {
$get_data = DB::table('lms_mutu_jawaban_detail AS d')
->joinSub($sub, 't', function($join) {
$join->on('t.lms_mutu_soal_detail_id', '=', 'd.lms_mutu_soal_detail_id');
})
->join(
'lms_mutu_jawaban',
'd.lms_mutu_jawaban_id',
'=',
'lms_mutu_jawaban.id'
)
->selectRaw(
"d.lms_mutu_soal_detail_id,
STRING_AGG(d.jawaban, ', ') AS jawaban_gabungan,
t.total_semua,
COUNT(*) AS total_jawaban,
ROUND((COUNT(*)::numeric / t.total_semua::numeric) * 100) AS percent"
)
->where('d.lms_mutu_soal_detail_id', $value['id'])
->where('jawaban', '!=', null)
->whereNotIn('d.jawaban', $soal_json['options'])
->groupBy('d.lms_mutu_soal_detail_id', 't.total_semua')->first();
// $get_data = (clone $result)->whereNotIn('d.jawaban', $soal_json['options'])
// ->get()
// ->toArray();
// foreach ($get_data as $val) {
if($get_data){
$data_per_jawaban = [
'name' => 'Lainnya',
'percent' => (float) $get_data->percent,
'value' => $get_data->total_jawaban,
'total' => $get_data->total_semua,
'jawaban' => $get_data->jawaban_gabungan
];
} else {
$data_per_jawaban = [
'name' => 'Lainnya',
'percent' => 0,
'value' => 0,
'jawaban' => '-'
];
}
// }
array_push($jawaban, $data_per_jawaban);
}
}
} else {
$get_data = $result->get()
->toArray();
foreach ($get_data as $val) {
$data_per_jawaban = [
'name' => $val->jawaban,
'percent' => (float) $val->percent,
'value' => $val->total_jawaban,
'total' => $val->total_semua
];
array_push($jawaban, $data_per_jawaban);
}
}
$data_persoal = [
'no_soal' => $soal_json['no'],
'soal' => $soal_json['soal'],
'jawaban' => $jawaban
];
array_push($data_all, $data_persoal);
}
}
$data = [
'data' => $data_all,
'total' => $total
];
return response()->json([
'msg' => 'Berhasil',
'data' => $data
], 200);
} catch (\ErrorException $th) {
dd($th);
return response()->json([
'msg' => 'Oops something wrong!',
'data' => null,
'msg_dev' => $th
], 500);
}
}
public function download_report_dashboard_demografi(Request $request)
{
$soal = SoalDetail::all()->sortBy('id')->values()->toArray();
$data = [];
$data_all = [];
$total = 0;
foreach ($soal as $key => $value) {
$jawaban = [];
$soal_json = json_decode($value['soal'], true);
if($soal_json['is_analitic'] != 2){
continue;
}
$sub = DB::table('lms_mutu_jawaban_detail')
->select('lms_mutu_soal_detail_id', DB::raw('COUNT(*) AS total_semua'))
->join(
'lms_mutu_jawaban',
'lms_mutu_jawaban_detail.lms_mutu_jawaban_id',
'=',
'lms_mutu_jawaban.id'
)
->where('lms_mutu_soal_detail_id', $value['id'])
->where('jawaban', '!=', null);
if($request->unit_kerja) {
$sub->whereIn('lms_mutu_jawaban.unit', $request->unit_kerja);
}
$sub->groupBy('lms_mutu_soal_detail_id');
$result = DB::table('lms_mutu_jawaban_detail AS d')
->joinSub($sub, 't', function($join) {
$join->on('t.lms_mutu_soal_detail_id', '=', 'd.lms_mutu_soal_detail_id');
})
->join(
'lms_mutu_jawaban',
'd.lms_mutu_jawaban_id',
'=',
'lms_mutu_jawaban.id'
)
->selectRaw(
'd.lms_mutu_soal_detail_id,
d.jawaban,
COUNT(*) AS total_jawaban,
t.total_semua,
ROUND((COUNT(*)::numeric / t.total_semua::numeric) * 100) AS percent'
)
->where('d.lms_mutu_soal_detail_id', $value['id'])
->where('d.jawaban', '!=', null)
->groupBy('d.lms_mutu_soal_detail_id', 'd.jawaban', 't.total_semua');
if($request->unit_kerja) {
$result->whereIn('lms_mutu_jawaban.unit', $request->unit_kerja);
}
$result->orderBy('d.lms_mutu_soal_detail_id', 'asc');
if(is_array($soal_json['options'])){
if(count($soal_json['options']) > 0){
foreach ($soal_json['options'] as $v) {
if($v != 'Lainnya'){
$row = (clone $result)->where('d.jawaban', $v)
->first();
if($row) {
if($total == 0){
$total = $row->total_semua;
}
$data_per_jawaban = [
'name' => $v,
'percent' => (float) $row->percent,
'value' => $row->total_jawaban,
'total' => $row->total_semua
];
array_push($jawaban, $data_per_jawaban);
} else {
$data_per_jawaban = [
'name' => $v,
'percent' => 0
];
array_push($jawaban, $data_per_jawaban);
}
} else {
$get_data = DB::table('lms_mutu_jawaban_detail AS d')
->joinSub($sub, 't', function($join) {
$join->on('t.lms_mutu_soal_detail_id', '=', 'd.lms_mutu_soal_detail_id');
})
->join(
'lms_mutu_jawaban',
'd.lms_mutu_jawaban_id',
'=',
'lms_mutu_jawaban.id'
)
->selectRaw(
"d.lms_mutu_soal_detail_id,
STRING_AGG(d.jawaban, ', ') AS jawaban_gabungan,
t.total_semua,
COUNT(*) AS total_jawaban,
ROUND((COUNT(*)::numeric / t.total_semua::numeric) * 100) AS percent"
)
->where('d.lms_mutu_soal_detail_id', $value['id'])
->where('jawaban', '!=', null)
->whereNotIn('d.jawaban', $soal_json['options'])
->groupBy('d.lms_mutu_soal_detail_id', 't.total_semua')->first();
// $get_data = (clone $result)->whereNotIn('d.jawaban', $soal_json['options'])
// ->get()
// ->toArray();
// foreach ($get_data as $val) {
if($get_data){
$data_per_jawaban = [
'name' => 'Lainnya',
'percent' => (float) $get_data->percent,
'value' => $get_data->total_jawaban,
'total' => $get_data->total_semua,
'jawaban' => $get_data->jawaban_gabungan
];
} else {
$data_per_jawaban = [
'name' => 'Lainnya',
'percent' => 0,
'value' => 0,
'jawaban' => '-'
];
}
// }
array_push($jawaban, $data_per_jawaban);
}
}
} else {
$get_data = $result->get()
->toArray();
foreach ($get_data as $val) {
$data_per_jawaban = [
'name' => $val->jawaban,
'percent' => (float) $val->percent,
'value' => $val->total_jawaban,
'total' => $val->total_semua
];
array_push($jawaban, $data_per_jawaban);
}
}
$data_persoal = [
'no_soal' => $soal_json['no'],
'soal' => $soal_json['soal'],
'jawaban' => $jawaban
];
array_push($data_all, $data_persoal);
}
}
$data_report = [];
foreach ($data_all as $index => $value) {
// SOAL → tandai sebagai 'title'
$data_report[] = [
'type' => 'title',
'row' => [$value['no_soal'] . ', ' . $value['soal']]
];
// HEADER TABLE → tandai sebagai 'header'
$data_report[] = [
'type' => 'header',
'row' => ['Jawaban', 'Persentase Responden', 'Jumlah Responden']
];
if($value['no_soal'] != 8 && $value['no_soal'] != 9) {
// ISI TABEL → tandai sebagai 'body'
foreach ($value['jawaban'] as $v) {
$data_report[] = [
'type' => 'body',
'row' => [$v['name'], $v['percent'] ?? '-', ($v['value'] ?? '0') .' Orang']
];
}
} else {
$total = array_reduce($value['jawaban'], function($acc, $item) {
return $acc + $item['value'];
}, 0);
$category = [
[
'name' => '0 - 1 Tahun',
'total' => $total,
'percent' => 0,
'value' => 0
],
[
'name' => '3 - 5 Tahun',
'total' => $total,
'percent' => 0,
'value' => 0
],
[
'name' => '6 - 10 Tahun',
'total' => $total,
'percent' => 0,
'value' => 0
],
[
'name' => '> 10 Tahun',
'total' => $total,
'percent' => 0,
'value' => 0
],
];
// set value
foreach ($value['jawaban'] as $v) {
$teks = $v['name'];
$parts = explode(" ", $teks);
$tahun = $parts[0] ?? 0;
$bulan = $parts[2] ?? 0;
$tahun = $tahun . '.' . $bulan;
if($tahun <= 1){
$category[0]['value'] += $v['value'];
} else if($tahun >= 2 && $tahun <= 5){
$category[1]['value'] += $v['value'];
} else if($tahun >= 6 && $tahun <= 10) {
$category[2]['value'] += $v['value'];
} else {
$category[3]['value'] += $v['value'];
}
}
$mappingPercent = array_map(
fn($val) => array_merge(
$val,
['percent' => $val['total'] > 0 ? intval(($val['value'] / $val['total']) * 100) : null]
),
$category
);
foreach ($mappingPercent as $i => $v) {
$data_report[] = [
'type' => 'body',
'row' => [$v['name'], $v['percent'] ?? '-', ($v['value'] ?? '0') .' Orang']
];
}
}
// SPASER
$data_report[] = ['type' => 'empty', 'row' => ['']];
$data_report[] = ['type' => 'empty', 'row' => ['']];
$data_report[] = ['type' => 'empty', 'row' => ['']];
}
return Excel::download(new DashboardDemografiExport($data_report, 'Dashboard Demografi'), 'data demografi.xlsx');
}
}