1480 lines
60 KiB
PHP
1480 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', 'Saya Tidak Bersedia')
|
|
->count();
|
|
|
|
return response()->json([
|
|
'msg' => 'Berhasil',
|
|
'data' => $total_tidak
|
|
], 200);
|
|
}
|
|
|
|
public function data_total_responden(Request $request)
|
|
{
|
|
$total = DB::table('lms_mutu_jawaban as a')
|
|
->count();
|
|
|
|
return response()->json([
|
|
'msg' => 'Berhasil',
|
|
'data' => $total
|
|
], 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');
|
|
}
|
|
}
|