diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php new file mode 100644 index 0000000..6f860bf --- /dev/null +++ b/app/Http/Controllers/AdminController.php @@ -0,0 +1,270 @@ +nama_pegawai) { + $query->where('nama', 'ILIKE', '%' . $request->nama_pegawai . '%'); + } + + if ($request->unit_kerja) { + $query->whereIn('unit', $request->unit_kerja); + } + + return DataTables::of($query)->make(true); + + } + + 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 get_data_dashboard_analisis(Request $request) + { + try { + $soal = SoalDetail::all()->sortBy('id')->values()->toArray(); + + $data = []; + foreach ($soal as $key => $value) { + $jawaban = []; + $soal_json = json_decode($value['soal'], true); + $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(count($soal_json['options']) > 0){ + foreach ($soal_json['options'] as $v) { + + if($v != 'Lainnya'){ + $row = (clone $result)->where('d.jawaban', $v) + ->first(); + + if($row) { + $data_per_jawaban = [ + 'name' => $v, + 'y' => (float) $row->percent, + 'value' => $row->total_jawaban, + 'total' => $row->total_semua + ]; + + array_push($jawaban, $data_per_jawaban); + } else { + $data_per_jawaban = [ + 'name' => $v, + 'y' => 0 + ]; + array_push($jawaban, $data_per_jawaban); + } + } else { + $get_data = (clone $result)->whereNotIn('d.jawaban', $soal_json['options']) + ->get() + ->toArray(); + + foreach ($get_data as $val) { + $data_per_jawaban = [ + 'name' => $val->jawaban, + 'y' => (float) $val->percent, + 'value' => $val->total_jawaban, + 'total' => $val->total_semua + ]; + array_push($jawaban, $data_per_jawaban); + } + } + } + } else { + $get_data = $result->get() + ->toArray(); + foreach ($get_data as $val) { + $data_per_jawaban = [ + 'name' => $val->jawaban, + 'y' => (float) $val->percent, + 'value' => $val->total_jawaban, + 'total' => $val->total_semua + ]; + array_push($jawaban, $data_per_jawaban); + } + } + + $data_persoal = [ + 'soal' => $soal_json['soal'], + 'jawaban' => $jawaban + ]; + + array_push($data, $data_persoal); + } + + return response()->json([ + 'msg' => 'Berhasil', + 'data' => $data + ], 200); + } catch (\ErrorException $th) { + return response()->json([ + 'msg' => 'Oops something wrong!', + 'data' => null, + 'msg_dev' => $th + ], 500); + } + } +} diff --git a/composer.json b/composer.json index 60681e6..4e10e5f 100644 --- a/composer.json +++ b/composer.json @@ -8,7 +8,8 @@ "require": { "php": "^8.2", "laravel/framework": "^11.31", - "laravel/tinker": "^2.9" + "laravel/tinker": "^2.9", + "yajra/laravel-datatables-oracle": "11.0" }, "require-dev": { "fakerphp/faker": "^1.23", diff --git a/composer.lock b/composer.lock index 497aeea..6116130 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "626b9e7ddd47fb7eff9aaa53cce0c9ad", + "content-hash": "7ae784044cc087af521c6abbb3c6e2c8", "packages": [ { "name": "brick/math", @@ -5916,6 +5916,95 @@ } ], "time": "2024-11-21T01:49:47+00:00" + }, + { + "name": "yajra/laravel-datatables-oracle", + "version": "v11.0.0", + "source": { + "type": "git", + "url": "https://github.com/yajra/laravel-datatables.git", + "reference": "f4d8a8df5fd2ac26fb6384f9caa41596bd79c305" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yajra/laravel-datatables/zipball/f4d8a8df5fd2ac26fb6384f9caa41596bd79c305", + "reference": "f4d8a8df5fd2ac26fb6384f9caa41596bd79c305", + "shasum": "" + }, + "require": { + "illuminate/database": "^11", + "illuminate/filesystem": "^11", + "illuminate/http": "^11", + "illuminate/support": "^11", + "illuminate/view": "^11", + "php": "^8.2" + }, + "require-dev": { + "algolia/algoliasearch-client-php": "^3.4.1", + "larastan/larastan": "^2.9.1", + "laravel/pint": "^1.14", + "laravel/scout": "^10.8.3", + "meilisearch/meilisearch-php": "^1.6.1", + "orchestra/testbench": "^9", + "rector/rector": "^1.0" + }, + "suggest": { + "yajra/laravel-datatables-buttons": "Plugin for server-side exporting of dataTables.", + "yajra/laravel-datatables-editor": "Plugin to use DataTables Editor (requires a license).", + "yajra/laravel-datatables-export": "Plugin for server-side exporting using livewire and queue worker.", + "yajra/laravel-datatables-fractal": "Plugin for server-side response using Fractal.", + "yajra/laravel-datatables-html": "Plugin for server-side HTML builder of dataTables." + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "DataTables": "Yajra\\DataTables\\Facades\\DataTables" + }, + "providers": [ + "Yajra\\DataTables\\DataTablesServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "files": [ + "src/helper.php" + ], + "psr-4": { + "Yajra\\DataTables\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Arjay Angeles", + "email": "aqangeles@gmail.com" + } + ], + "description": "jQuery DataTables API for Laravel", + "keywords": [ + "datatables", + "jquery", + "laravel", + "yajra" + ], + "support": { + "issues": "https://github.com/yajra/laravel-datatables/issues", + "source": "https://github.com/yajra/laravel-datatables/tree/v11.0.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yajra", + "type": "github" + } + ], + "time": "2024-03-14T04:05:21+00:00" } ], "packages-dev": [ diff --git a/config/datatables.php b/config/datatables.php new file mode 100644 index 0000000..0891264 --- /dev/null +++ b/config/datatables.php @@ -0,0 +1,127 @@ + [ + /* + * Smart search will enclose search keyword with wildcard string "%keyword%". + * SQL: column LIKE "%keyword%" + */ + 'smart' => true, + + /* + * Multi-term search will explode search keyword using spaces resulting into multiple term search. + */ + 'multi_term' => true, + + /* + * Case insensitive will search the keyword in lower case format. + * SQL: LOWER(column) LIKE LOWER(keyword) + */ + 'case_insensitive' => true, + + /* + * Wild card will add "%" in between every characters of the keyword. + * SQL: column LIKE "%k%e%y%w%o%r%d%" + */ + 'use_wildcards' => false, + + /* + * Perform a search which starts with the given keyword. + * SQL: column LIKE "keyword%" + */ + 'starts_with' => false, + ], + + /* + * DataTables internal index id response column name. + */ + 'index_column' => 'DT_RowIndex', + + /* + * List of available builders for DataTables. + * This is where you can register your custom dataTables builder. + */ + 'engines' => [ + 'eloquent' => Yajra\DataTables\EloquentDataTable::class, + 'query' => Yajra\DataTables\QueryDataTable::class, + 'collection' => Yajra\DataTables\CollectionDataTable::class, + 'resource' => Yajra\DataTables\ApiResourceDataTable::class, + ], + + /* + * DataTables accepted builder to engine mapping. + * This is where you can override which engine a builder should use + * Note, only change this if you know what you are doing! + */ + 'builders' => [ + //Illuminate\Database\Eloquent\Relations\Relation::class => 'eloquent', + //Illuminate\Database\Eloquent\Builder::class => 'eloquent', + //Illuminate\Database\Query\Builder::class => 'query', + //Illuminate\Support\Collection::class => 'collection', + ], + + /* + * Nulls last sql pattern for PostgreSQL & Oracle. + * For MySQL, use 'CASE WHEN :column IS NULL THEN 1 ELSE 0 END, :column :direction' + */ + 'nulls_last_sql' => ':column :direction NULLS LAST', + + /* + * User friendly message to be displayed on user if error occurs. + * Possible values: + * null - The exception message will be used on error response. + * 'throw' - Throws a \Yajra\DataTables\Exceptions\Exception. Use your custom error handler if needed. + * 'custom message' - Any friendly message to be displayed to the user. You can also use translation key. + */ + 'error' => env('DATATABLES_ERROR', null), + + /* + * Default columns definition of dataTable utility functions. + */ + 'columns' => [ + /* + * List of columns hidden/removed on json response. + */ + 'excess' => ['rn', 'row_num'], + + /* + * List of columns to be escaped. If set to *, all columns are escape. + * Note: You can set the value to empty array to disable XSS protection. + */ + 'escape' => '*', + + /* + * List of columns that are allowed to display html content. + * Note: Adding columns to list will make us available to XSS attacks. + */ + 'raw' => ['action'], + + /* + * List of columns are forbidden from being searched/sorted. + */ + 'blacklist' => ['password', 'remember_token'], + + /* + * List of columns that are only allowed fo search/sort. + * If set to *, all columns are allowed. + */ + 'whitelist' => '*', + ], + + /* + * JsonResponse header and options config. + */ + 'json' => [ + 'header' => [], + 'options' => 0, + ], + + /* + * Default condition to determine if a parameter is a callback or not. + * Callbacks needs to start by those terms, or they will be cast to string. + */ + 'callback' => ['$', '$.', 'function'], +]; diff --git a/resources/views/admin/dashboard.blade.php b/resources/views/admin/dashboard.blade.php new file mode 100644 index 0000000..8774923 --- /dev/null +++ b/resources/views/admin/dashboard.blade.php @@ -0,0 +1,81 @@ +@extends('layouts.template_admin') + +@section('title', 'Dashboard | Mutu RSAB Harapan Kita') +@section('custom_css') +@endsection + +@section('content') +
| Nama Pegawai | +Unit Kerja | +Tanggal Isi | +
|---|