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') +
+

Dashboard {{ dashboard_type_label($type ?? 'pertek') }}

+ +
+ @foreach($statuses as $index => $status) +
+
+
+
+
+ + {{ dashboard_type_label($type ?? 'pertek') }} + +

{{ $status['label'] }}

+

+ {{ $status['value'] }} +

+ + {{-- Menampilkan trend jika bukan total --}} + @if($status['id'] !== 'total') + @php + $trend = dashboard_trend($type ?? 'pertek', $status['id']); + @endphp + + {{ $trend['value'] > 0 ? '+' : '' }}{{ $trend['value'] }}% + + + @endif +
+
+ +
+
+
+
+
+ @endforeach +
+ + {{-- Chart menggunakan helper --}} + @php + $chartData = dashboard_chart_data($type ?? 'pertek'); + @endphp + +
+
+
+
+
Distribusi {{ dashboard_type_label($type ?? 'pertek') }}
+
+
+
+
+
+
+ +@push('scripts') + +@endpush + +@endsection diff --git a/resources/views/dashboard/index.blade.php b/resources/views/dashboard/index.blade.php index 1976895..3989302 100644 --- a/resources/views/dashboard/index.blade.php +++ b/resources/views/dashboard/index.blade.php @@ -13,7 +13,7 @@
+ + + @@ -74,8 +99,7 @@
PERTEK

Total Pengajuan

-

1,250

- +12% dari bulan lalu +

{{ $statuses[3]['value'] ?? 65 }}

@@ -93,8 +117,8 @@
PERTEK

Izin Disetujui

-

850

- +8.2% +

{{ $statuses[1]['value'] ?? 45 }}

+
@@ -112,8 +136,8 @@
PERTEK

Dalam Proses

-

200

- sedang ditinjau +

{{ $statuses[2]['value'] ?? 12 }}

+
@@ -131,8 +155,8 @@
PERTEK

Izin Ditolak

-

150

- perlu perbaikan +

{{ $statuses[0]['value'] ?? 8 }}

+
@@ -341,7 +365,6 @@ RINTEK

Total Pengajuan

892

- +8% dari bulan lalu
@@ -360,7 +383,6 @@ RINTEK

Izin Disetujui

675

- +6.5%
@@ -379,7 +401,7 @@ RINTEK

Dalam Proses

147

- sedang ditinjau +
@@ -398,7 +420,7 @@ RINTEK

Izin Ditolak

70

- perlu perbaikan +
@@ -607,7 +629,6 @@ AMDAL

Total Pengajuan

456

- +5% dari bulan lalu
@@ -626,7 +647,6 @@ AMDAL

Izin Disetujui

298

- +4.8%
@@ -645,7 +665,7 @@ AMDAL

Dalam Proses

112

- sedang ditinjau +
@@ -664,7 +684,7 @@ AMDAL

Izin Ditolak

46

- perlu perbaikan +
@@ -860,6 +880,534 @@
+ + +
+
+ +
+
+
+
+
+ IZIN ANGKUT & OLAH +

Total Pengajuan

+

456

+
+
+ +
+
+
+
+
+ + +
+
+
+
+
+ IZIN ANGKUT & OLAH +

Izin Disetujui

+

298

+
+
+ +
+
+
+
+
+ + +
+
+
+
+
+ IZIN ANGKUT & OLAH +

Dalam Proses

+

112

+ +
+
+ +
+
+
+
+
+ + +
+
+
+
+
+ IZIN ANGKUT & OLAH +

Izin Ditolak

+

46

+ +
+
+ +
+
+
+
+
+
+ + +
+
+
+
+ IZIN IZIN ANGKUT & OLAH +
Top 5 Izin Tercepat
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NoNama IzinTotal IzinWaktu Rata-Rata (Pemohon)Waktu Rata-Rata (Petugas)
1IZIN LINGKUNGAN KEGIATAN USAHA8772 Jam 30 Menit45 Jam 15 Menit
2SPPL (SURAT PERNYATAAN PENGELOLAAN LINGKUNGAN)6548 Jam 20 Menit32 Jam 45 Menit
3UKL-UPL (UPAYA KELOLA UPAYA PANTAU LINGKUNGAN)9896 Jam 45 Menit68 Jam 30 Menit
4AMDAL (ANALISIS MENGENAI DAMPAK LINGKUNGAN)43120 Jam 15 Menit85 Jam 40 Menit
5IZIN PEMBUANGAN AIR LIMBAH7684 Jam 50 Menit58 Jam 25 Menit
+
+
+
+
+ +
+
+
+ IZIN IZIN ANGKUT & OLAH +
Top 5 Izin Terakhir Terbit
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NoNama IzinPemohonTanggal Terbit
1SERTIFIKAT LAIK OPERASI - PEMENUHAN BAKU MUTU EMISIPT. MAJU BERSAMA15 Des 2024
2PERSETUJUAN TEKNIS - PEMENUHAN BAKU MUTU AIR LIMBAHCV. KARYA MANDIRI14 Des 2024
3SERTIFIKAT LAIK OPERASI - PEMENUHAN BAKU MUTU AIR LIMBAHPT. INDUSTRI SEJAHTERA13 Des 2024
4PERSETUJUAN TEKNIS - PEMENUHAN BAKU MUTU AIR LIMBAHPT. TEKNOLOGI MODERN12 Des 2024
5SERTIFIKAT LAIK OPERASI - PEMENUHAN BAKU MUTU EMISICV. BERKAH JAYA11 Des 2024
+
+
+
+
+
+ +
+
+
+
+
+
+
Grafik Trend Pengajuan
+ IZIN ANGKUT & OLAH +
+ +
+
+
456
+ + 5% + + + 22 Pengajuan/Bulan +
+
+
+
+
+ +
+
+
+
+
+
Grafik Trend Distribusi Jenis Izin
+ IZIN ANGKUT & OLAH +
+ +
+
    +
  • + + Izin Lingkungan +
  • +
  • + + SPPL +
  • +
  • + + UKL-UPL +
  • +
  • + + AMDAL +
  • +
+ +
+
+
+
+
+
+
+
+ + +
+
+ +
+
+
+
+
+ IZIN TEMPAT UJI EMISI +

Total Pengajuan

+

456

+
+
+ +
+
+
+
+
+ + +
+
+
+
+
+ IZIN TEMPAT UJI EMISI +

Izin Disetujui

+

298

+
+
+ +
+
+
+
+
+ + +
+
+
+
+
+ IZIN TEMPAT UJI EMISI +

Dalam Proses

+

112

+ +
+
+ +
+
+
+
+
+ + +
+
+
+
+
+ IZIN TEMPAT UJI EMISI +

Izin Ditolak

+

46

+ +
+
+ +
+
+
+
+
+
+ + +
+
+
+
+ IZIN TEMPAT UJI EMISI +
Top 5 Izin Tercepat
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NoNama IzinTotal IzinWaktu Rata-Rata (Pemohon)Waktu Rata-Rata (Petugas)
1IZIN LINGKUNGAN KEGIATAN USAHA8772 Jam 30 Menit45 Jam 15 Menit
2SPPL (SURAT PERNYATAAN PENGELOLAAN LINGKUNGAN)6548 Jam 20 Menit32 Jam 45 Menit
3UKL-UPL (UPAYA KELOLA UPAYA PANTAU LINGKUNGAN)9896 Jam 45 Menit68 Jam 30 Menit
4AMDAL (ANALISIS MENGENAI DAMPAK LINGKUNGAN)43120 Jam 15 Menit85 Jam 40 Menit
5IZIN PEMBUANGAN AIR LIMBAH7684 Jam 50 Menit58 Jam 25 Menit
+
+
+
+
+ +
+
+
+ IZIN TEMPAT UJI EMISI +
Top 5 Izin Terakhir Terbit
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NoNama IzinPemohonTanggal Terbit
1SERTIFIKAT LAIK OPERASI - PEMENUHAN BAKU MUTU EMISIPT. MAJU BERSAMA15 Des 2024
2PERSETUJUAN TEKNIS - PEMENUHAN BAKU MUTU AIR LIMBAHCV. KARYA MANDIRI14 Des 2024
3SERTIFIKAT LAIK OPERASI - PEMENUHAN BAKU MUTU AIR LIMBAHPT. INDUSTRI SEJAHTERA13 Des 2024
4PERSETUJUAN TEKNIS - PEMENUHAN BAKU MUTU AIR LIMBAHPT. TEKNOLOGI MODERN12 Des 2024
5SERTIFIKAT LAIK OPERASI - PEMENUHAN BAKU MUTU EMISICV. BERKAH JAYA11 Des 2024
+
+
+
+
+
+ +
+
+
+
+
+
+
Grafik Trend Pengajuan
+ IZIN TEMPAT UJI EMISI +
+ +
+
+
456
+ + 5% + + + 22 Pengajuan/Bulan +
+
+
+
+
+ +
+
+
+
+
+
Grafik Trend Distribusi Jenis Izin
+ IZIN TEMPAT UJI EMISI +
+ +
+
    +
  • + + Izin Lingkungan +
  • +
  • + + SPPL +
  • +
  • + + UKL-UPL +
  • +
  • + + AMDAL +
  • +
+ +
+
+
+
+
+
+
+
@endsection @@ -1092,7 +1640,7 @@ document.addEventListener('DOMContentLoaded', function() { function updateIndicator(activeTab) { const tabIndex = Array.from(navTabs).indexOf(activeTab); - const leftPosition = (tabIndex * 33.33) + '%'; + const leftPosition = (tabIndex * 20) + '%'; indicator.style.left = leftPosition; } });