This commit is contained in:
JokoPrasetio 2025-12-05 15:35:09 +07:00
commit d98c87bc08
7 changed files with 970 additions and 10 deletions

View File

@ -0,0 +1,85 @@
<?php
namespace App\Exports;
use Maatwebsite\Excel\Concerns\FromArray;
use Maatwebsite\Excel\Concerns\WithStyles;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
class DashboardDemografiExport implements FromArray, WithStyles
{
protected $data;
public function __construct($data)
{
$this->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 [];
}
}

View File

@ -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;
@ -252,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'] = [
@ -386,7 +400,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 +582,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 +876,515 @@ 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 '
<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');
}
}

View File

@ -13,6 +13,16 @@
<div class="card">
<div class="card-body">
<div class="card-title fs-4 fw-bold">Dashboard</div>
<div class="mt-5">
<div class="card w-50 text-bg-danger">
<div class="card-body">
<div class="card-title fs-4 fw-bold d-flex justify-content-between">
<div class="text-white">Total Tidak Mau Survey</div>
<div class="text-white" id="total_tidak_mau">-</div>
</div>
</div>
</div>
</div>
<div class="mt-5">
<div class="d-flex gap-2 align-items-end">
<div class="form-group w-75">
@ -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');
}
});
}
</script>
@endsection

View File

@ -0,0 +1,318 @@
@extends('layouts.template_admin')
@section('title', 'Dashboard | Mutu RSAB Harapan Kita')
@section('custom_css')
@endsection
@section('content')
<div class="card">
<div class="card-body">
<div class="card-title fs-4 fw-bold">Dashboard Demografi</div>
<div class="mt-5">
<div class="d-flex gap-2 align-items-end">
<div class="form-group w-75">
<label for="select_unit_kerja" class="form-label">Unit Kerja</label>
<select id="select_unit_kerja" class="select2 form-select" multiple>
@foreach ($list_unit_kerja as $item)
<option value="{{ $item }}">{{ $item }}</option>
@endforeach
</select>
</div>
<div class="w-100 d-flex gap-2">
<div class="btn btn-primary" id="search_button">
Cari
</div>
<form id="export_form" action="{{ url('/admin/report_data_demografi') }}" method="POST">
@csrf
<select class="d-none" name="unit_kerja[]" multiple>
@foreach ($list_unit_kerja as $item)
<option value="{{ $item }}">{{ $item }}</option>
@endforeach
</select>
<div type="button" class="btn btn-primary" id="export_form_button">Download Excel</div>
</form>
</div>
</div>
<div class="mt-3" id="body_table" style="max-height: 80vh; overflow-y: auto;">
</div>
</div>
</div>
</div>
@endsection
@section('custom_js')
<script>
$(document).ready(function(){
$(".select2").select2();
$('#search_button').click(function(){
get_data_analisis();
})
$('#export_form_button').click(function() {
let select_unit_kerja = $('#select_unit_kerja').val();
$('[name="unit_kerja[]"]').val(select_unit_kerja);
$('#export_form').submit();
})
});
function get_data_analisis() {
$('#body_table').html(`<div class="p-10 d-flex justify-content-center">
<div>
<!-- Fold -->
<div class="sk-fold">
<div class="sk-fold-cube"></div>
<div class="sk-fold-cube"></div>
<div class="sk-fold-cube"></div>
<div class="sk-fold-cube"></div>
</div>
</div>
</div>`);
$.ajax({
url: "{{ url('/admin/get_data_dashboard_demografi') }}",
type: "POST",
data: {
unit_kerja: $('#select_unit_kerja').val(),
_token: "{{ csrf_token() }}"
},
success: function(res) {
const data = res.data.data;
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);
const jawabanCategory = [
{
name: '0 - 1 Tahun',
total: totalJawaban,
percent: 0,
value: 0
},
{
name: '2 - 5 Tahun',
total: totalJawaban,
percent: 0,
value: 0
},
{
name: '6 - 10 Tahun',
total: totalJawaban,
percent: 0,
value: 0
},
{
name: '> 10 Tahun',
total: totalJawaban,
percent: 0,
value: 0
},
];
// set value
dataMappingLamaKerjaFaskes.jawaban.map(val => {
const parts = val.name.split(" ");
const tahunParts = parts[0] ?? 0;
const bulanParts = parts[2] >> 0;
const tahun = `${tahunParts}.${bulanParts}`;
if(tahun <= 1){
jawabanCategory[0]['value'] += val.value;
} else if(tahun >= 2 && tahun <= 5){
jawabanCategory[1]['value'] += val.value;
} else if(tahun >= 6 && tahun <= 10) {
jawabanCategory[2]['value'] += val.value;
} else {
jawabanCategory[3]['value'] += val.value;
}
});
const mappingPercent = jawabanCategory.map(val => {
let percent = null;
if(val.total > 0){
percent = parseInt((val.value/val.total) * 100);
}
return {
...val,
percent: percent
}
});
const dataPerCategory = {
no_soal: dataMappingLamaKerjaFaskes.no_soal,
soal:dataMappingLamaKerjaFaskes.soal,
jawaban: mappingPercent
};
data[dataMappingLamaKerjaFaskesIndex] = dataPerCategory;
}
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);
const jawabanCategory = [
{
name: '0 - 1 Tahun',
total: totalJawaban,
percent: 0,
value: 0
},
{
name: '2 - 5 Tahun',
total: totalJawaban,
percent: 0,
value: 0
},
{
name: '6 - 10 Tahun',
total: totalJawaban,
percent: 0,
value: 0
},
{
name: '> 10 Tahun',
total: totalJawaban,
percent: 0,
value: 0
},
];
// set value
dataMappingLamaKerjaUnit.jawaban.map(val => {
const parts = val.name.split(" ");
const tahunParts = parts[0] ?? 0;
const bulanParts = parts[2] >> 0;
const tahun = `${tahunParts}.${bulanParts}`;
if(tahun <= 1){
jawabanCategory[0]['value'] += val.value;
} else if(tahun >= 2 && tahun <= 5){
jawabanCategory[1]['value'] += val.value;
} else if(tahun >= 6 && tahun <= 10) {
jawabanCategory[2]['value'] += val.value;
} else {
jawabanCategory[3]['value'] += val.value;
}
});
const mappingPercent = jawabanCategory.map(val => {
let percent = null;
if(val.total > 0){
percent = parseInt((val.value/val.total) * 100);
}
return {
...val,
percent: percent
}
});
const dataPerCategory = {
no_soal: dataMappingLamaKerjaUnit.no_soal,
soal:dataMappingLamaKerjaUnit.soal,
jawaban: mappingPercent
};
data[dataMappingLamaKerjaUnitIndex] = dataPerCategory;
}
$('#body_table').html("");
let stringTable = '';
data.forEach(element => {
stringTable += '<div class="mt-5">';
stringTable += `<div class="fw-bold fs-5 mb-3">${element.no_soal}. ${element.soal}</div>`;
stringTable += '<div class="table-responsive mb-8">';
stringTable += '<table id="table_detail" class="table table-bordered">';
stringTable += `<thead class="bg-primary" id="table_header">
<tr>
<th class="text-white">Jawaban</th>
<th class="text-white">Persentase Responden</th>
<th class="text-white">Jumlah Responden</th>
</tr>
</thead>`;
stringTable += '<tbody>';
let total = 0;
element.jawaban.forEach(e => {
stringTable += `
<tr>
<td>${e.name}</td>`;
if(e?.total > 0) {
total = e?.total;
}
if(e.percent > 0){
stringTable += `<td class="fw-bold">${e.percent}%</td>`;
} else {
stringTable += `<td class="fw-bold">-</td>`;
}
stringTable += `<td class="">${e.value ?? 0} Orang</td>`;
stringTable += `</tr>`;
});
stringTable += '</tbody>';
stringTable += '</table>';
stringTable += '</div>';
stringTable += '</div>';
});
$('#body_table').html(stringTable);
}
});
}
function generateChart(data, id, soal) {
Highcharts.chart(id, {
chart: { type: 'column' },
title: { text: soal },
xAxis: {
categories: [soal],
title: { text: null },
labels: { enabled: false }
},
yAxis: {
min: 0,
max: 100,
title: { text: null }
},
credits: { enabled: false },
tooltip: {
useHTML: true,
formatter: function() {
console.log(this.point);
const totalUser = this.point.total_user ?? 0;
const totalSemua = this.point.total_semua ?? 0;
return `
<b>${this.series.name}</b><br>
Nilai: ${this.y}%<br>
Total Jawaban: ${totalUser}<br>
Total Semua: ${totalSemua}
`;
}
},
series: data.map(j => ({
name: j.name,
type: 'column',
data: [{y: j.y, total_user: j.value, total_semua: j.total}]
})),
dataLabels: {
enabled: true,
formatter: function() {
return this.y + '%'; // ⬅️ Tampilkan angka + %
}
}
});
}
</script>
@endsection

View File

@ -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();

View File

@ -110,21 +110,23 @@
<nav class="nav flex-column sidebar-scroll list-materi bg-white px-5 gap-2">
<a href="{{ url('/admin') }}" class="nav-link px-0 list-materi-hover px-3 d-flex justify-content-between align-items-center fs-5">
<div class="d-flex gap-2 align-items-center">
<i class="fa-solid fa-gauge-high"></i> Dashboard
<i class="fa-solid fa-building"></i> Dashboard Per Unit
</div>
</a>
<a href="{{ url('/admin/dashboard_demografi') }}" class="nav-link px-0 list-materi-hover px-3 d-flex justify-content-between align-items-center fs-5">
<div class="d-flex gap-2 align-items-center">
<i class="fa-solid fa-magnifying-glass-chart"></i> Analisis Demografi
</div>
<i class="fa-solid fa-chevron-right"></i>
</a>
<a href="{{ url('/admin/dashboard_analisis') }}" class="nav-link px-0 list-materi-hover px-3 d-flex justify-content-between align-items-center fs-5">
<div class="d-flex gap-2 align-items-center">
<i class="fa-solid fa-gauge-high"></i> Dashboard Analisis
<i class="fa-solid fa-circle-question"></i> Analisis Per Soal
</div>
<i class="fa-solid fa-chevron-right"></i>
</a>
<a href="{{ url('/admin/dashboard_jawaban') }}" class="nav-link px-0 list-materi-hover px-3 d-flex justify-content-between align-items-center fs-5">
<div class="d-flex gap-2 align-items-center">
<i class="fa-solid fa-gauge-high"></i> Dashboard Jawaban
<i class="fa-solid fa-people-group"></i> Detail Jawaban Pegawai
</div>
<i class="fa-solid fa-chevron-right"></i>
</a>
</nav>
</div>

View File

@ -11,13 +11,18 @@ 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']);
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']);
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']);