From 5925422236b61b39fafccfc4c64ef82341406ce1 Mon Sep 17 00:00:00 2001 From: Muhammad Thoriq Date: Thu, 4 Dec 2025 17:16:28 +0700 Subject: [PATCH 1/3] dashboard demografi --- app/Exports/DashboardDemografiExport.php | 85 +++ app/Http/Controllers/AdminController.php | 510 +++++++++++++++++- .../views/admin/dashboard_demografi.blade.php | 310 +++++++++++ .../views/admin/dashboard_jawaban.blade.php | 2 +- .../views/layouts/template_admin.blade.php | 14 +- routes/web.php | 6 +- 6 files changed, 917 insertions(+), 10 deletions(-) create mode 100644 app/Exports/DashboardDemografiExport.php create mode 100644 resources/views/admin/dashboard_demografi.blade.php diff --git a/app/Exports/DashboardDemografiExport.php b/app/Exports/DashboardDemografiExport.php new file mode 100644 index 0000000..a50f453 --- /dev/null +++ b/app/Exports/DashboardDemografiExport.php @@ -0,0 +1,85 @@ +data = $data; + } + + public function array(): array + { + return array_map(fn($d) => $d['row'], $this->data); + } + + public function styles(Worksheet $sheet) + { + foreach ($this->data as $index => $item) { + $rowNumber = $index + 1; + $rowType = $item['type']; + + switch ($rowType) { + + case 'title': + $sheet->getStyle("A{$rowNumber}") + ->applyFromArray([ + 'font' => [ + 'bold' => true, + 'size' => 14, + ] + ]); + break; + + case 'header': + $sheet->getStyle("A{$rowNumber}:C{$rowNumber}") + ->applyFromArray([ + 'font' => [ + 'bold' => true, + 'size' => 12 + ], + 'fill' => [ + 'fillType' => 'solid', + 'color' => ['rgb' => 'FFFF99'] + ] + ]); + break; + + case 'body': + $sheet->getStyle("A{$rowNumber}:C{$rowNumber}") + ->applyFromArray([ + 'font' => [ + 'size' => 11 + ] + ]); + break; + } + } + + // APPLY BORDER HANYA UNTUK ROW NON-EMPTY + foreach ($this->data as $i => $item) { + if ($item['type'] === 'empty') continue; // ❌ skip border + + $row = $i + 1; + $sheet->getStyle("A{$row}:C{$row}") + ->applyFromArray([ + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => Border::BORDER_THIN, + 'color' => ['rgb' => '000000'] + ] + ] + ]); + } + + return []; + } +} diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index bf88fdc..2736903 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers; use App\Exports\DashboardAnalisisExport; +use App\Exports\DashboardDemografiExport; use App\Exports\DashboardExport; use App\Exports\DashboardJawabanExport; use App\Models\Jawaban; @@ -386,7 +387,7 @@ class AdminController extends Controller foreach ($soal as $key => $value) { $jawaban = []; $soal_json = json_decode($value['soal'], true); - if($soal_json['is_analitic'] == 0){ + if($soal_json['is_analitic'] != 1){ continue; } @@ -568,7 +569,7 @@ class AdminController extends Controller foreach ($soal as $key => $value) { $jawaban = []; $soal_json = json_decode($value['soal'], true); - if($soal_json['is_analitic'] == 0){ + if($soal_json['is_analitic'] != 1){ continue; } @@ -862,4 +863,509 @@ class AdminController extends Controller 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('action', function ($row) { + return ' + + '; + }) + ->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'] != 7 && $value['no_soal'] != 8) { + // 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 - 2 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) { + $tahun = intval($v['name']); + + if($tahun <= 2){ + $category[0]['value'] += $v['value']; + } else if($tahun >= 3 && $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'); + } } diff --git a/resources/views/admin/dashboard_demografi.blade.php b/resources/views/admin/dashboard_demografi.blade.php new file mode 100644 index 0000000..0ecd7f8 --- /dev/null +++ b/resources/views/admin/dashboard_demografi.blade.php @@ -0,0 +1,310 @@ +@extends('layouts.template_admin') + +@section('title', 'Dashboard | Mutu RSAB Harapan Kita') +@section('custom_css') +@endsection + +@section('content') +
+
+
Dashboard Demografi
+
+
+
+ + +
+
+
+ Cari +
+
+ @csrf + +
Download Excel
+
+
+
+
+ +
+
+
+
+@endsection + +@section('custom_js') + +@endsection \ No newline at end of file diff --git a/resources/views/admin/dashboard_jawaban.blade.php b/resources/views/admin/dashboard_jawaban.blade.php index def825a..6b73312 100644 --- a/resources/views/admin/dashboard_jawaban.blade.php +++ b/resources/views/admin/dashboard_jawaban.blade.php @@ -106,7 +106,7 @@ processing: true, serverSide: true, ajax: { - url: `{{ url('/admin/get_data_pegawai_sudah_survey') }}`, + url: `{{ url('/admin/get_data_pegawai_jawaban') }}`, type: 'POST', data: function (d) { d.nama_pegawai = $('#nama_pegawai').val(); diff --git a/resources/views/layouts/template_admin.blade.php b/resources/views/layouts/template_admin.blade.php index 3b5cda5..e3be3e8 100644 --- a/resources/views/layouts/template_admin.blade.php +++ b/resources/views/layouts/template_admin.blade.php @@ -110,21 +110,23 @@ diff --git a/routes/web.php b/routes/web.php index 93d1fb9..b4daa1d 100644 --- a/routes/web.php +++ b/routes/web.php @@ -17,7 +17,11 @@ Route::get('/redirect-smart', [SoalController::class, 'redirectSmart']); Route::post('/admin/report', [AdminController::class, 'download_report_data_pegawai_sudah_survey']); Route::get('/admin/dashboard_analisis', [AdminController::class, 'dashboard_analisis']); Route::get('/admin/dashboard_jawaban', [AdminController::class, 'dashboard_jawaban']); +Route::post('/admin/get_data_pegawai_jawaban', [AdminController::class, 'get_data_pegawai_jawaban']); Route::get('/admin/detail_jawaban/{jawaban_id}', [AdminController::class, 'get_jawaban']); Route::post('/admin/get_data_dashboard_analisis', [AdminController::class, 'get_data_dashboard_analisis']); Route::post('/admin/report_data_analisis', [AdminController::class, 'report_data_dashboard_analisis']); -Route::post('/admin/report_jawaban', [AdminController::class, 'download_report_data_jawaban_pegawai']); \ No newline at end of file +Route::post('/admin/report_jawaban', [AdminController::class, 'download_report_data_jawaban_pegawai']); +Route::get('/admin/dashboard_demografi', [AdminController::class, 'dashboard_demografi']); +Route::post('/admin/get_data_dashboard_demografi', [AdminController::class, 'get_data_dashboard_demografi']); +Route::post('/admin/report_data_demografi', [AdminController::class, 'download_report_dashboard_demografi']); \ No newline at end of file From 52dc255c628b36aadbd1a885b90e32dddf803bd1 Mon Sep 17 00:00:00 2001 From: Muhammad Thoriq Date: Fri, 5 Dec 2025 14:09:06 +0700 Subject: [PATCH 2/3] fix category dan tambah total tidak mau survey --- app/Http/Controllers/AdminController.php | 27 +++++++++++++++--- resources/views/admin/dashboard.blade.php | 25 +++++++++++++++++ .../views/admin/dashboard_demografi.blade.php | 28 ++++++++++++------- .../views/layouts/template_admin.blade.php | 10 +++---- routes/web.php | 1 + 5 files changed, 72 insertions(+), 19 deletions(-) diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index 2736903..0fa5d19 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -253,6 +253,19 @@ class AdminController extends Controller } + 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'] = [ @@ -1304,7 +1317,7 @@ class AdminController extends Controller $category = [ [ - 'name' => '0 - 2 Tahun', + 'name' => '0 - 1 Tahun', 'total' => $total, 'percent' => 0, 'value' => 0 @@ -1331,11 +1344,17 @@ class AdminController extends Controller // set value foreach ($value['jawaban'] as $v) { - $tahun = intval($v['name']); + $teks = $v['name']; - if($tahun <= 2){ + $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 >= 3 && $tahun <= 5){ + } else if($tahun >= 2 && $tahun <= 5){ $category[1]['value'] += $v['value']; } else if($tahun >= 6 && $tahun <= 10) { $category[2]['value'] += $v['value']; diff --git a/resources/views/admin/dashboard.blade.php b/resources/views/admin/dashboard.blade.php index 231d926..cb34ab1 100644 --- a/resources/views/admin/dashboard.blade.php +++ b/resources/views/admin/dashboard.blade.php @@ -13,6 +13,16 @@
Dashboard
+
+
+
+
+
Total Tidak Mau Survey
+
-
+
+
+
+
@@ -72,6 +82,7 @@ }) generateTable(); + getTotalTidakMauSurvey(); }); function generateTable() { @@ -92,5 +103,19 @@ ] }); } + + function getTotalTidakMauSurvey() { + $.ajax({ + url: "{{ url('/admin/get_data_pegawai_tidak_mau_survey') }}", + type: "POST", + data: { + unit_kerja: $('#select_unit_kerja').val(), + _token: "{{ csrf_token() }}" + }, + success: function(res) { + $('#total_tidak_mau').html((res.data ?? '-') + ' Orang'); + } + }); + } @endsection diff --git a/resources/views/admin/dashboard_demografi.blade.php b/resources/views/admin/dashboard_demografi.blade.php index 0ecd7f8..ce6a1c5 100644 --- a/resources/views/admin/dashboard_demografi.blade.php +++ b/resources/views/admin/dashboard_demografi.blade.php @@ -85,13 +85,13 @@ const jawabanCategory = [ { - name: '0 - 2 Tahun', + name: '0 - 1 Tahun', total: totalJawaban, percent: 0, value: 0 }, { - name: '3 - 5 Tahun', + name: '2 - 5 Tahun', total: totalJawaban, percent: 0, value: 0 @@ -112,11 +112,15 @@ // set value dataMappingLamaKerjaFaskes.jawaban.map(val => { - const tahun = parseInt(val.name); + const parts = val.name.split(" "); + const tahunParts = parts[0] ?? 0; + const bulanParts = parts[2] >> 0; - if(tahun <= 2){ + const tahun = `${tahunParts}.${bulanParts}`; + + if(tahun <= 1){ jawabanCategory[0]['value'] += val.value; - } else if(tahun >= 3 && tahun <= 5){ + } else if(tahun >= 2 && tahun <= 5){ jawabanCategory[1]['value'] += val.value; } else if(tahun >= 6 && tahun <= 10) { jawabanCategory[2]['value'] += val.value; @@ -153,13 +157,13 @@ const jawabanCategory = [ { - name: '0 - 2 Tahun', + name: '0 - 1 Tahun', total: totalJawaban, percent: 0, value: 0 }, { - name: '3 - 5 Tahun', + name: '2 - 5 Tahun', total: totalJawaban, percent: 0, value: 0 @@ -180,11 +184,15 @@ // set value dataMappingLamaKerjaUnit.jawaban.map(val => { - const tahun = parseInt(val.name); + const parts = val.name.split(" "); + const tahunParts = parts[0] ?? 0; + const bulanParts = parts[2] >> 0; - if(tahun <= 2){ + const tahun = `${tahunParts}.${bulanParts}`; + + if(tahun <= 1){ jawabanCategory[0]['value'] += val.value; - } else if(tahun >= 3 && tahun <= 5){ + } else if(tahun >= 2 && tahun <= 5){ jawabanCategory[1]['value'] += val.value; } else if(tahun >= 6 && tahun <= 10) { jawabanCategory[2]['value'] += val.value; diff --git a/resources/views/layouts/template_admin.blade.php b/resources/views/layouts/template_admin.blade.php index e3be3e8..6f304bf 100644 --- a/resources/views/layouts/template_admin.blade.php +++ b/resources/views/layouts/template_admin.blade.php @@ -113,16 +113,16 @@ Dashboard Per Unit
- -
- Analisis Per Soal -
-
Analisis Demografi
+ +
+ Analisis Per Soal +
+
Detail Jawaban Pegawai diff --git a/routes/web.php b/routes/web.php index b4daa1d..7589968 100644 --- a/routes/web.php +++ b/routes/web.php @@ -11,6 +11,7 @@ Route::post('/jawaban', [SoalController::class, 'store'])->name('soal.store'); Route::get('/jawaban/terima-kasih', [SoalController::class, 'thankYou'])->name('soal.thankyou'); Route::get('/admin', [AdminController::class, 'index']); Route::post('/admin/get_data_pegawai_sudah_survey', [AdminController::class, 'get_data_pegawai_sudah_survey']); +Route::post('/admin/get_data_pegawai_tidak_mau_survey', [AdminController::class, 'data_tidak_mau_survey']); Route::get('/admin/dashboard_jawaban', [AdminController::class, 'dashboard_analisis']); Route::post('/admin/get_data_dashboard_jawaban', [AdminController::class, 'get_data_dashboard_analisis']); Route::get('/redirect-smart', [SoalController::class, 'redirectSmart']); From b0ac03d2567c53ba7bbf7d6497cd00688398ff86 Mon Sep 17 00:00:00 2001 From: Muhammad Thoriq Date: Fri, 5 Dec 2025 14:11:55 +0700 Subject: [PATCH 3/3] fix category --- app/Http/Controllers/AdminController.php | 2 +- resources/views/admin/dashboard_demografi.blade.php | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index 0fa5d19..1d8fdbf 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -1302,7 +1302,7 @@ class AdminController extends Controller 'row' => ['Jawaban', 'Persentase Responden', 'Jumlah Responden'] ]; - if($value['no_soal'] != 7 && $value['no_soal'] != 8) { + if($value['no_soal'] != 8 && $value['no_soal'] != 9) { // ISI TABEL → tandai sebagai 'body' foreach ($value['jawaban'] as $v) { $data_report[] = [ diff --git a/resources/views/admin/dashboard_demografi.blade.php b/resources/views/admin/dashboard_demografi.blade.php index ce6a1c5..1cc302e 100644 --- a/resources/views/admin/dashboard_demografi.blade.php +++ b/resources/views/admin/dashboard_demografi.blade.php @@ -78,8 +78,8 @@ }, success: function(res) { const data = res.data.data; - const dataMappingLamaKerjaFaskes = data.find(v => v.no_soal == '7'); - const dataMappingLamaKerjaFaskesIndex = data.findIndex(v => v.no_soal == '7'); + const dataMappingLamaKerjaFaskes = data.find(v => v.no_soal == '8'); + const dataMappingLamaKerjaFaskesIndex = data.findIndex(v => v.no_soal == '8'); if(dataMappingLamaKerjaFaskes && dataMappingLamaKerjaFaskesIndex){ let totalJawaban = dataMappingLamaKerjaFaskes.jawaban.reduce((sum, item) => sum + item.value, 0); @@ -150,8 +150,8 @@ data[dataMappingLamaKerjaFaskesIndex] = dataPerCategory; } - const dataMappingLamaKerjaUnit = data.find(v => v.no_soal == '8'); - const dataMappingLamaKerjaUnitIndex = data.findIndex(v => v.no_soal == '8'); + const dataMappingLamaKerjaUnit = data.find(v => v.no_soal == '9'); + const dataMappingLamaKerjaUnitIndex = data.findIndex(v => v.no_soal == '9'); if(dataMappingLamaKerjaUnit && dataMappingLamaKerjaUnitIndex){ let totalJawaban = dataMappingLamaKerjaUnit.jawaban.reduce((sum, item) => sum + item.value, 0);