diff --git a/app/Helpers/DashboardHelper.blade.php b/app/Helpers/DashboardHelper.blade.php new file mode 100644 index 0000000..e69de29 diff --git a/app/Helpers/DashboardHelper.php b/app/Helpers/DashboardHelper.php new file mode 100644 index 0000000..098f79a --- /dev/null +++ b/app/Helpers/DashboardHelper.php @@ -0,0 +1,227 @@ + [ + ['id' => 'ditolak', 'label' => 'Izin Ditolak', 'value' => 8, 'color' => 'danger'], + ['id' => 'selesai', 'label' => 'Izin Selesai', 'value' => 45, 'color' => 'success'], + ['id' => 'proses', 'label' => 'Dalam Proses', 'value' => 12, 'color' => 'info'], + ], + 'rintek' => [ + ['id' => 'ditolak', 'label' => 'Izin Ditolak', 'value' => 5, 'color' => 'danger'], + ['id' => 'selesai', 'label' => 'Izin Selesai', 'value' => 28, 'color' => 'success'], + ['id' => 'proses', 'label' => 'Dalam Proses', 'value' => 7, 'color' => 'info'], + ], + 'amdal' => [ + ['id' => 'ditolak', 'label' => 'Izin Ditolak', 'value' => 3, 'color' => 'danger'], + ['id' => 'selesai', 'label' => 'Izin Selesai', 'value' => 15, 'color' => 'success'], + ['id' => 'proses', 'label' => 'Dalam Proses', 'value' => 9, 'color' => 'info'], + ], + 'izin_angkut' => [ + ['id' => 'ditolak', 'label' => 'Izin Ditolak', 'value' => 12, 'color' => 'danger'], + ['id' => 'selesai', 'label' => 'Izin Selesai', 'value' => 67, 'color' => 'success'], + ['id' => 'proses', 'label' => 'Dalam Proses', 'value' => 18, 'color' => 'info'], + ], + 'uji_emisi' => [ + ['id' => 'ditolak', 'label' => 'Izin Ditolak', 'value' => 6, 'color' => 'danger'], + ['id' => 'selesai', 'label' => 'Izin Selesai', 'value' => 89, 'color' => 'success'], + ['id' => 'proses', 'label' => 'Dalam Proses', 'value' => 23, 'color' => 'info'], + ], + ]; + + return $data[$type] ?? []; + } + + /** + * Menambahkan total ke data statuses + */ + public static function addTotalToStatuses(array $statuses): array + { + $total = array_sum(array_column($statuses, 'value')); + $statuses[] = [ + 'id' => 'total', + 'label' => 'Total Pengajuan', + 'value' => $total, + 'color' => 'primary' + ]; + + return $statuses; + } + + /** + * Mendapatkan label untuk tipe izin + */ + public static function getTypeLabel(string $type): string + { + $labels = [ + 'pertek' => 'PERTEK', + 'rintek' => 'RINTEK', + 'amdal' => 'AMDAL', + 'izin_angkut' => 'IZIN ANGKUT & OLAH', + 'uji_emisi' => 'IZIN TEMPAT UJI EMISI', + ]; + + return $labels[$type] ?? strtoupper($type); + } + + /** + * Mendapatkan icon untuk status + */ + public static function getStatusIcon(string $statusId): string + { + $icons = [ + 'ditolak' => 'circle-x', + 'selesai' => 'circle-check', + 'proses' => 'refresh-cw', + 'total' => 'equal', + ]; + + return $icons[$statusId] ?? 'circle'; + } + + /** + * Mendapatkan background color untuk card + */ + public static function getCardBackground(string $statusId): string + { + $backgrounds = [ + 'ditolak' => 'bg-gradient-start-4', + 'selesai' => 'bg-gradient-start-2', + 'proses' => 'bg-gradient-start-3', + 'total' => 'bg-gradient-start-1', + ]; + + return $backgrounds[$statusId] ?? 'bg-gradient-start-1'; + } + + /** + * Mendapatkan warna lingkaran icon + */ + public static function getIconCircleColor(string $statusId): string + { + $colors = [ + 'ditolak' => 'bg-red', + 'selesai' => 'bg-green', + 'proses' => 'bg-info', + 'total' => 'bg-yellow', + ]; + + return $colors[$statusId] ?? 'bg-primary'; + } + + /** + * Mendapatkan semua tipe izin yang tersedia + */ + public static function getAllTypes(): array + { + return ['pertek', 'rintek', 'amdal', 'izin_angkut', 'uji_emisi']; + } + + /** + * Mendapatkan statistik lengkap untuk semua tipe + */ + public static function getAllStatistics(): array + { + $types = self::getAllTypes(); + $allData = []; + + foreach ($types as $type) { + $statuses = self::getStatusDataByType($type); + $statuses = self::addTotalToStatuses($statuses); + + $allData[$type] = [ + 'type' => $type, + 'label' => self::getTypeLabel($type), + 'data' => $statuses + ]; + } + + return $allData; + } + + /** + * Format percentage dari total + */ + public static function calculatePercentage(int $value, int $total): float + { + return $total > 0 ? round(($value / $total) * 100, 2) : 0; + } + + /** + * Mendapatkan trend indicator (simulasi) + */ + public static function getTrendIndicator(string $type, string $statusId): array + { + // Simulasi data trend (bisa diganti dengan data real dari database) + $trends = [ + 'pertek' => ['ditolak' => -2.5, 'selesai' => 5.3, 'proses' => 1.2], + 'rintek' => ['ditolak' => -1.8, 'selesai' => 3.7, 'proses' => 0.5], + 'amdal' => ['ditolak' => -0.9, 'selesai' => 2.1, 'proses' => -0.3], + 'izin_angkut' => ['ditolak' => -3.2, 'selesai' => 7.8, 'proses' => 2.1], + 'uji_emisi' => ['ditolak' => -1.5, 'selesai' => 12.4, 'proses' => 4.2], + ]; + + $value = $trends[$type][$statusId] ?? 0; + + return [ + 'value' => $value, + 'direction' => $value > 0 ? 'up' : ($value < 0 ? 'down' : 'same'), + 'color' => $value > 0 ? 'success' : ($value < 0 ? 'danger' : 'secondary') + ]; + } + + /** + * Mendapatkan badge color untuk tipe izin + */ + public static function getBadgeColor(string $type): string + { + $colors = [ + 'pertek' => 'primary', + 'rintek' => 'success', + 'amdal' => 'info', + 'izin_angkut' => 'warning', + 'uji_emisi' => 'secondary', + ]; + + return $colors[$type] ?? 'primary'; + } + + /** + * Mendapatkan data untuk chart + */ + public static function getChartData(string $type): array + { + $statuses = self::getStatusDataByType($type); + + return [ + 'labels' => array_column($statuses, 'label'), + 'values' => array_column($statuses, 'value'), + 'colors' => array_map(function($status) { + return self::getChartColor($status['id']); + }, $statuses) + ]; + } + + /** + * Mendapatkan warna untuk chart + */ + private static function getChartColor(string $statusId): string + { + $colors = [ + 'ditolak' => '#ef4444', + 'selesai' => '#22c55e', + 'proses' => '#3b82f6', + 'total' => '#f59e0b', + ]; + + return $colors[$statusId] ?? '#6b7280'; + } +} diff --git a/app/Helpers/dashboard_functions.php b/app/Helpers/dashboard_functions.php new file mode 100644 index 0000000..58ecd91 --- /dev/null +++ b/app/Helpers/dashboard_functions.php @@ -0,0 +1,106 @@ +get('type', 'pertek'); + $statuses = DashboardHelper::getStatusDataByType($type); + + if (empty($statuses)) { + return response()->json([ + 'success' => false, + 'message' => 'Tipe izin tidak ditemukan.', + ], 404); + } + + $statuses = DashboardHelper::addTotalToStatuses($statuses); + + return response()->json([ + 'success' => true, + 'message' => 'Summary by status retrieved successfully.', + 'type' => $type, + 'type_label' => DashboardHelper::getTypeLabel($type), + 'data' => $statuses, + 'chart_data' => DashboardHelper::getChartData($type), + 'last_updated' => now()->format('Y-m-d H:i:s'), + ], 200); + + } catch (\Exception $e) { + Log::error('Gagal mengambil summary status izin: ' . $e->getMessage()); + + return response()->json([ + 'success' => false, + 'message' => 'Terjadi kesalahan saat mengambil data.', + 'error' => $e->getMessage(), + ], 500); + } + } + + public function getAllSummary() + { + try { + $allData = DashboardHelper::getAllStatistics(); + + return response()->json([ + 'success' => true, + 'message' => 'All summary data retrieved successfully.', + 'data' => $allData, + 'last_updated' => now()->format('Y-m-d H:i:s'), + ], 200); + + } catch (\Exception $e) { + Log::error('Gagal mengambil semua summary: ' . $e->getMessage()); + + return response()->json([ + 'success' => false, + 'message' => 'Terjadi kesalahan saat mengambil data.', + 'error' => $e->getMessage(), + ], 500); + } + } } diff --git a/composer.json b/composer.json index 1b51d44..062b9e4 100644 --- a/composer.json +++ b/composer.json @@ -3,7 +3,10 @@ "name": "laravel/laravel", "type": "project", "description": "The skeleton application for the Laravel framework.", - "keywords": ["laravel", "framework"], + "keywords": [ + "laravel", + "framework" + ], "license": "MIT", "require": { "php": "^8.2", @@ -27,7 +30,10 @@ "App\\": "app/", "Database\\Factories\\": "database/factories/", "Database\\Seeders\\": "database/seeders/" - } + }, + "files": [ + "app/Helpers/dashboard_functions.php" + ] }, "autoload-dev": { "psr-4": { diff --git a/public/assets/js/homeOneChart.js b/public/assets/js/homeOneChart.js index 3a84b33..34650ba 100644 --- a/public/assets/js/homeOneChart.js +++ b/public/assets/js/homeOneChart.js @@ -372,6 +372,255 @@ var options = { var chart = new ApexCharts(document.querySelector("#chart-amdal"), options); chart.render(); // =========================== Sales Statistic Line Chart End =============================== +// =========================== Sales Statistic Line Chart Start =============================== +var options = { + series: [ + { + name: "This month", + data: [10, 20, 12, 30, 14, 35, 16, 32, 14, 25, 13, 28], + }, + ], + chart: { + height: 264, + type: "line", + toolbar: { + show: false, + }, + zoom: { + enabled: false, + }, + dropShadow: { + enabled: true, + top: 6, + left: 0, + blur: 4, + color: "#000", + opacity: 0.1, + }, + }, + dataLabels: { + enabled: false, + }, + stroke: { + curve: "smooth", + colors: ["#487FFF"], // Specify the line color here + width: 3, + }, + markers: { + size: 0, + strokeWidth: 3, + hover: { + size: 8, + }, + }, + tooltip: { + enabled: true, + x: { + show: true, + }, + y: { + show: false, + }, + z: { + show: false, + }, + }, + grid: { + row: { + colors: ["transparent", "transparent"], // takes an array which will be repeated on columns + opacity: 0.5, + }, + borderColor: "#D1D5DB", + strokeDashArray: 3, + }, + yaxis: { + labels: { + formatter: function (value) { + return value; + }, + style: { + fontSize: "14px", + }, + }, + }, + xaxis: { + categories: [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + ], + tooltip: { + enabled: false, + }, + labels: { + formatter: function (value) { + return value; + }, + style: { + fontSize: "14px", + }, + }, + axisBorder: { + show: false, + }, + crosshairs: { + show: true, + width: 20, + stroke: { + width: 0, + }, + fill: { + type: "solid", + color: "#487FFF40", + // gradient: { + // colorFrom: '#D8E3F0', + // // colorTo: '#BED1E6', + // stops: [0, 100], + // opacityFrom: 0.4, + // opacityTo: 0.5, + // }, + }, + }, + }, +}; + +var chart = new ApexCharts(document.querySelector("#chart-angkut"), options); +chart.render(); +// =========================== Sales Statistic Line Chart End =============================== + +// =========================== Sales Statistic Line Chart Start =============================== +var options = { + series: [ + { + name: "This month", + data: [10, 20, 12, 30, 14, 35, 16, 32, 14, 25, 13, 28], + }, + ], + chart: { + height: 264, + type: "line", + toolbar: { + show: false, + }, + zoom: { + enabled: false, + }, + dropShadow: { + enabled: true, + top: 6, + left: 0, + blur: 4, + color: "#000", + opacity: 0.1, + }, + }, + dataLabels: { + enabled: false, + }, + stroke: { + curve: "smooth", + colors: ["#487FFF"], // Specify the line color here + width: 3, + }, + markers: { + size: 0, + strokeWidth: 3, + hover: { + size: 8, + }, + }, + tooltip: { + enabled: true, + x: { + show: true, + }, + y: { + show: false, + }, + z: { + show: false, + }, + }, + grid: { + row: { + colors: ["transparent", "transparent"], // takes an array which will be repeated on columns + opacity: 0.5, + }, + borderColor: "#D1D5DB", + strokeDashArray: 3, + }, + yaxis: { + labels: { + formatter: function (value) { + return value; + }, + style: { + fontSize: "14px", + }, + }, + }, + xaxis: { + categories: [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + ], + tooltip: { + enabled: false, + }, + labels: { + formatter: function (value) { + return value; + }, + style: { + fontSize: "14px", + }, + }, + axisBorder: { + show: false, + }, + crosshairs: { + show: true, + width: 20, + stroke: { + width: 0, + }, + fill: { + type: "solid", + color: "#487FFF40", + // gradient: { + // colorFrom: '#D8E3F0', + // // colorTo: '#BED1E6', + // stops: [0, 100], + // opacityFrom: 0.4, + // opacityTo: 0.5, + // }, + }, + }, + }, +}; + +var chart = new ApexCharts(document.querySelector("#chart-ujiemisi"), options); +chart.render(); +// =========================== Sales Statistic Line Chart End =============================== // ================================ Total Subscriber bar chart Start ================================ var options = { @@ -522,6 +771,222 @@ var chart = new ApexCharts( ); chart.render(); // ================================ Users Overview Donut chart End ================================ +// ================================ Pertek Distribusi Chart Start ================================ +var options = { + series: [ + { + name: "Usaha Perdagangan dan Jasa", + data: [ + 20000, 16000, 14000, 25000, 45000, 18000, 28000, 11000, 26000, + 48000, 18000, 22000, + ], + }, + { + name: "Property", + data: [ + 15000, 18000, 19000, 20000, 35000, 20000, 18000, 13000, 18000, + 38000, 14000, 16000, + ], + }, + { + name: "Manufaktur", + data: [ + 12000, 14000, 16000, 18000, 25000, 15000, 20000, 9000, 15000, + 28000, 12000, 14000, + ], + }, + { + name: "Lainnya", + data: [ + 8000, 10000, 11000, 12000, 18000, 10000, 14000, 7000, 11000, + 20000, 9000, 10000, + ], + }, + ], + colors: ["#487FFF", "#FF9F29", "#10B981", "#EF4444"], + labels: ["Active", "New", "Total"], + legend: { + show: false, + }, + chart: { + type: "bar", + height: 250, + toolbar: { + show: false, + }, + }, + grid: { + show: true, + borderColor: "#D1D5DB", + strokeDashArray: 4, // Use a number for dashed style + position: "back", + }, + plotOptions: { + bar: { + borderRadius: 4, + columnWidth: 10, + }, + }, + dataLabels: { + enabled: false, + }, + stroke: { + show: true, + width: 2, + colors: ["transparent"], + }, + xaxis: { + categories: [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + ], + }, + yaxis: { + categories: [ + "0", + "5000", + "10,000", + "20,000", + "30,000", + "50,000", + "60,000", + "60,000", + "70,000", + "80,000", + "90,000", + "100,000", + ], + }, + fill: { + opacity: 1, + width: 18, + }, +}; + +var chart = new ApexCharts( + document.querySelector("#paymentStatusChart-angkut"), + options +); +chart.render(); +// ================================ Pertek Distribusi Chart End ================================ +// ================================ Pertek Distribusi Chart Start ================================ +var options = { + series: [ + { + name: "Usaha Perdagangan dan Jasa", + data: [ + 20000, 16000, 14000, 25000, 45000, 18000, 28000, 11000, 26000, + 48000, 18000, 22000, + ], + }, + { + name: "Property", + data: [ + 15000, 18000, 19000, 20000, 35000, 20000, 18000, 13000, 18000, + 38000, 14000, 16000, + ], + }, + { + name: "Manufaktur", + data: [ + 12000, 14000, 16000, 18000, 25000, 15000, 20000, 9000, 15000, + 28000, 12000, 14000, + ], + }, + { + name: "Lainnya", + data: [ + 8000, 10000, 11000, 12000, 18000, 10000, 14000, 7000, 11000, + 20000, 9000, 10000, + ], + }, + ], + colors: ["#487FFF", "#FF9F29", "#10B981", "#EF4444"], + labels: ["Active", "New", "Total"], + legend: { + show: false, + }, + chart: { + type: "bar", + height: 250, + toolbar: { + show: false, + }, + }, + grid: { + show: true, + borderColor: "#D1D5DB", + strokeDashArray: 4, // Use a number for dashed style + position: "back", + }, + plotOptions: { + bar: { + borderRadius: 4, + columnWidth: 10, + }, + }, + dataLabels: { + enabled: false, + }, + stroke: { + show: true, + width: 2, + colors: ["transparent"], + }, + xaxis: { + categories: [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + ], + }, + yaxis: { + categories: [ + "0", + "5000", + "10,000", + "20,000", + "30,000", + "50,000", + "60,000", + "60,000", + "70,000", + "80,000", + "90,000", + "100,000", + ], + }, + fill: { + opacity: 1, + width: 18, + }, +}; + +var chart = new ApexCharts( + document.querySelector("#paymentStatusChart-ujiemisi"), + options +); +chart.render(); +// ================================ Pertek Distribusi Chart End ================================ // ================================ Pertek Distribusi Chart Start ================================ var options = { diff --git a/resources/views/dashboard/example-helper-usage.blade.php b/resources/views/dashboard/example-helper-usage.blade.php new file mode 100644 index 0000000..61ff2f2 --- /dev/null +++ b/resources/views/dashboard/example-helper-usage.blade.php @@ -0,0 +1,72 @@ +{{-- Contoh penggunaan DashboardHelper di View --}} + +@extends('layout.layout') + +@section('content') +
{{ $status['label'] }}
+Total Pengajuan
-Izin Disetujui
-Dalam Proses
-Izin Ditolak
-Total Pengajuan
Izin Disetujui
Dalam Proses
Izin Ditolak
Total Pengajuan
Izin Disetujui
Dalam Proses
Izin Ditolak
Total Pengajuan
+Izin Disetujui
+Dalam Proses
+Izin Ditolak
+No | +Nama Izin | +Total Izin | +Waktu Rata-Rata (Pemohon) | +Waktu Rata-Rata (Petugas) | +
---|---|---|---|---|
1 | +IZIN LINGKUNGAN KEGIATAN USAHA | +87 | +72 Jam 30 Menit | +45 Jam 15 Menit | +
2 | +SPPL (SURAT PERNYATAAN PENGELOLAAN LINGKUNGAN) | +65 | +48 Jam 20 Menit | +32 Jam 45 Menit | +
3 | +UKL-UPL (UPAYA KELOLA UPAYA PANTAU LINGKUNGAN) | +98 | +96 Jam 45 Menit | +68 Jam 30 Menit | +
4 | +AMDAL (ANALISIS MENGENAI DAMPAK LINGKUNGAN) | +43 | +120 Jam 15 Menit | +85 Jam 40 Menit | +
5 | +IZIN PEMBUANGAN AIR LIMBAH | +76 | +84 Jam 50 Menit | +58 Jam 25 Menit | +
No | +Nama Izin | +Pemohon | +Tanggal Terbit | +
---|---|---|---|
1 | +SERTIFIKAT LAIK OPERASI - PEMENUHAN BAKU MUTU EMISI | +PT. MAJU BERSAMA | +15 Des 2024 | +
2 | +PERSETUJUAN TEKNIS - PEMENUHAN BAKU MUTU AIR LIMBAH | +CV. KARYA MANDIRI | +14 Des 2024 | +
3 | +SERTIFIKAT LAIK OPERASI - PEMENUHAN BAKU MUTU AIR LIMBAH | +PT. INDUSTRI SEJAHTERA | +13 Des 2024 | +
4 | +PERSETUJUAN TEKNIS - PEMENUHAN BAKU MUTU AIR LIMBAH | +PT. TEKNOLOGI MODERN | +12 Des 2024 | +
5 | +SERTIFIKAT LAIK OPERASI - PEMENUHAN BAKU MUTU EMISI | +CV. BERKAH JAYA | +11 Des 2024 | +
Total Pengajuan
+Izin Disetujui
+Dalam Proses
+Izin Ditolak
+No | +Nama Izin | +Total Izin | +Waktu Rata-Rata (Pemohon) | +Waktu Rata-Rata (Petugas) | +
---|---|---|---|---|
1 | +IZIN LINGKUNGAN KEGIATAN USAHA | +87 | +72 Jam 30 Menit | +45 Jam 15 Menit | +
2 | +SPPL (SURAT PERNYATAAN PENGELOLAAN LINGKUNGAN) | +65 | +48 Jam 20 Menit | +32 Jam 45 Menit | +
3 | +UKL-UPL (UPAYA KELOLA UPAYA PANTAU LINGKUNGAN) | +98 | +96 Jam 45 Menit | +68 Jam 30 Menit | +
4 | +AMDAL (ANALISIS MENGENAI DAMPAK LINGKUNGAN) | +43 | +120 Jam 15 Menit | +85 Jam 40 Menit | +
5 | +IZIN PEMBUANGAN AIR LIMBAH | +76 | +84 Jam 50 Menit | +58 Jam 25 Menit | +
No | +Nama Izin | +Pemohon | +Tanggal Terbit | +
---|---|---|---|
1 | +SERTIFIKAT LAIK OPERASI - PEMENUHAN BAKU MUTU EMISI | +PT. MAJU BERSAMA | +15 Des 2024 | +
2 | +PERSETUJUAN TEKNIS - PEMENUHAN BAKU MUTU AIR LIMBAH | +CV. KARYA MANDIRI | +14 Des 2024 | +
3 | +SERTIFIKAT LAIK OPERASI - PEMENUHAN BAKU MUTU AIR LIMBAH | +PT. INDUSTRI SEJAHTERA | +13 Des 2024 | +
4 | +PERSETUJUAN TEKNIS - PEMENUHAN BAKU MUTU AIR LIMBAH | +PT. TEKNOLOGI MODERN | +12 Des 2024 | +
5 | +SERTIFIKAT LAIK OPERASI - PEMENUHAN BAKU MUTU EMISI | +CV. BERKAH JAYA | +11 Des 2024 | +