diff --git a/app/Console/Commands/SyncDashboardPbg.php b/app/Console/Commands/SyncDashboardPbg.php new file mode 100644 index 0000000..e0b3d01 --- /dev/null +++ b/app/Console/Commands/SyncDashboardPbg.php @@ -0,0 +1,66 @@ + 'Initiating sync dashboard pbg...', + 'response_body' => null, + 'status' => 'processing', + 'start_time' => now(), + 'failed_uuid' => null + ]); + + try { + $service = new ServiceGoogleSheet(); + + $data_setting_result = $service->get_big_resume_data(); + Log::info('Data setting result: ' . json_encode($data_setting_result)); + BigdataResume::generateResumeData($import_datasource->id, "simbg", $data_setting_result); + + $import_datasource->update([ + 'status' => 'success', + 'message' => 'Sync dashboard pbg completed successfully.', + 'finish_time' => now() + ]); + } catch (\Exception $e) { + Log::error('Sync dashboard pbg failed: ' . $e->getMessage(), ['trace' => $e->getTraceAsString()]); + + // Update status to failed + if (isset($import_datasource)) { + $import_datasource->update([ + 'status' => 'failed', + 'message' => 'Sync dashboard pbg failed.', + 'finish_time' => now() + ]); + } + } + + } +} diff --git a/app/Http/Controllers/Api/BigDataResumeController.php b/app/Http/Controllers/Api/BigDataResumeController.php index 00f6855..7cc94ae 100644 --- a/app/Http/Controllers/Api/BigDataResumeController.php +++ b/app/Http/Controllers/Api/BigDataResumeController.php @@ -23,14 +23,15 @@ class BigDataResumeController extends Controller { try{ $filterDate = $request->get("filterByDate"); + $type = $request->get("type"); if (!$filterDate || $filterDate === "latest") { - $big_data_resume = BigdataResume::where('year', 'leader')->latest()->first(); + $big_data_resume = BigdataResume::where('year', $type)->latest()->first(); if (!$big_data_resume) { return $this->response_empty_resume(); } } else { - $big_data_resume = BigdataResume::where('year', 'leader') + $big_data_resume = BigdataResume::where('year', $type) ->whereDate('created_at', $filterDate) ->orderBy('id', 'desc') ->first(); diff --git a/app/Http/Controllers/Api/RequestAssignmentController.php b/app/Http/Controllers/Api/RequestAssignmentController.php index 5accc47..8a07763 100644 --- a/app/Http/Controllers/Api/RequestAssignmentController.php +++ b/app/Http/Controllers/Api/RequestAssignmentController.php @@ -24,7 +24,8 @@ class RequestAssignmentController extends Controller $query = PbgTask::with([ 'attachments' => function ($q) { $q->whereIn('pbg_type', ['berita_acara', 'bukti_bayar']); - } + }, + 'pbg_task_retributions' ])->orderBy('id', 'desc'); if ($request->has('filter') && !empty($request->get('filter'))) { @@ -34,7 +35,8 @@ class RequestAssignmentController extends Controller case 'non-business': $query->where(function ($q) { $q->where(function ($q2) { - $q2->whereRaw("LOWER(function_type) != ?", ['sebagai tempat usaha']) + $q2->whereRaw("LOWER(function_type) NOT LIKE ?", ['%fungsi usaha%']) + ->whereRaw("LOWER(function_type) NOT LIKE ?", ['%sebagai tempat usaha%']) ->whereRaw("status != ?", 20) ->orWhereNull('function_type'); }); @@ -43,8 +45,11 @@ class RequestAssignmentController extends Controller case 'business': $query->where(function ($q) { - $q->whereRaw("LOWER(function_type) = ?", ['sebagai tempat usaha']) - ->whereRaw("status != ?", 20); + $q->where(function ($q2) { + $q2->whereRaw("LOWER(function_type) LIKE ?", ['%fungsi usaha%']) + ->orWhereRaw("LOWER(function_type) LIKE ?", ['%sebagai tempat usaha%']) + ->whereRaw("status != ?", 20); + }); }); break; diff --git a/app/Http/Resources/RequestAssignmentResouce.php b/app/Http/Resources/RequestAssignmentResouce.php index b4f32ae..346c961 100644 --- a/app/Http/Resources/RequestAssignmentResouce.php +++ b/app/Http/Resources/RequestAssignmentResouce.php @@ -42,6 +42,7 @@ class RequestAssignmentResouce extends JsonResource ->where('pbg_type', 'bukti_bayar') ->sortByDesc('created_at') ->first(), + 'pbg_task_retributions' => $this->pbg_task_retributions, ]; } } diff --git a/app/Jobs/ScrapingDataJob.php b/app/Jobs/ScrapingDataJob.php index 1a207d2..a013ba3 100644 --- a/app/Jobs/ScrapingDataJob.php +++ b/app/Jobs/ScrapingDataJob.php @@ -50,8 +50,8 @@ class ScrapingDataJob implements ShouldQueue ]); // Run the scraping services - // $service_google_sheet->run_service(); - // $service_pbg_task->run_service(); + $service_google_sheet->run_service(); + $service_pbg_task->run_service(); try{ $service_tab_pbg_task->run_service(); }catch(\Exception $e){ diff --git a/app/Models/BigdataResume.php b/app/Models/BigdataResume.php index 68b0119..0d81bc1 100644 --- a/app/Models/BigdataResume.php +++ b/app/Models/BigdataResume.php @@ -38,28 +38,30 @@ class BigdataResume extends Model } public static function generateResumeData($import_datasource_id, $year, $data_setting){ - $stats = PbgTask::with(['googleSheet', 'pbg_task_retributions']) + $stats = PbgTask::with(['pbg_task_retributions']) ->leftJoin('pbg_task_retributions as ptr', 'pbg_task.uuid', '=', 'ptr.pbg_task_uid') - ->leftJoin('pbg_task_google_sheet as ptgs', 'pbg_task.registration_number', '=', 'ptgs.no_registrasi') - ->when($year !== 'all', function ($query) use ($year) { - $query->whereYear('pbg_task.task_created_at', (int) $year); - }) ->selectRaw(" - COUNT(CASE WHEN LOWER(TRIM(ptgs.status_verifikasi)) = 'selesai verifikasi' THEN 1 END) AS verified_count, - SUM(CASE WHEN LOWER(TRIM(ptgs.status_verifikasi)) = 'selesai verifikasi' THEN ptr.nilai_retribusi_bangunan ELSE 0 END) AS verified_total, + COUNT(CASE WHEN pbg_task.status = 20 THEN 1 END) AS verified_count, + SUM(CASE WHEN pbg_task.status = 20 THEN ptr.nilai_retribusi_bangunan ELSE 0 END) AS verified_total, - COUNT(CASE WHEN LOWER(TRIM(ptgs.status_verifikasi)) != 'selesai verifikasi' OR ptgs.status_verifikasi IS NULL THEN 1 END) AS non_verified_count, - SUM(CASE WHEN LOWER(TRIM(ptgs.status_verifikasi)) != 'selesai verifikasi' OR ptgs.status_verifikasi IS NULL THEN ptr.nilai_retribusi_bangunan ELSE 0 END) AS non_verified_total, + COUNT(CASE WHEN pbg_task.status != 20 OR pbg_task.status IS NULL THEN 1 END) AS non_verified_count, + SUM(CASE WHEN pbg_task.status != 20 OR pbg_task.status IS NULL THEN ptr.nilai_retribusi_bangunan ELSE 0 END) AS non_verified_total, - COUNT(CASE WHEN (LOWER(TRIM(ptgs.status_verifikasi)) != 'selesai verifikasi' OR ptgs.status_verifikasi IS NULL) - AND LOWER(TRIM(pbg_task.function_type)) = 'sebagai tempat usaha' THEN 1 END) AS business_count, - SUM(CASE WHEN (LOWER(TRIM(ptgs.status_verifikasi)) != 'selesai verifikasi' OR ptgs.status_verifikasi IS NULL) - AND LOWER(TRIM(pbg_task.function_type)) = 'sebagai tempat usaha' THEN ptr.nilai_retribusi_bangunan ELSE 0 END) AS business_total, + COUNT(CASE WHEN (LOWER(TRIM(pbg_task.function_type)) LIKE '%fungsi usaha%' + OR LOWER(TRIM(pbg_task.function_type)) LIKE '%sebagai tempat usaha%') + AND pbg_task.status != 20 THEN 1 END) AS business_count, + SUM(CASE WHEN (LOWER(TRIM(pbg_task.function_type)) LIKE '%fungsi usaha%' + OR LOWER(TRIM(pbg_task.function_type)) LIKE '%sebagai tempat usaha%') + AND pbg_task.status != 20 THEN ptr.nilai_retribusi_bangunan ELSE 0 END) AS business_total, - COUNT(CASE WHEN (LOWER(TRIM(ptgs.status_verifikasi)) != 'selesai verifikasi' OR ptgs.status_verifikasi IS NULL) - AND (LOWER(TRIM(pbg_task.function_type)) != 'sebagai tempat usaha' OR pbg_task.function_type IS NULL) THEN 1 END) AS non_business_count, - SUM(CASE WHEN (LOWER(TRIM(ptgs.status_verifikasi)) != 'selesai verifikasi' OR ptgs.status_verifikasi IS NULL) - AND (LOWER(TRIM(pbg_task.function_type)) != 'sebagai tempat usaha' OR pbg_task.function_type IS NULL) THEN ptr.nilai_retribusi_bangunan ELSE 0 END) AS non_business_total + COUNT(CASE WHEN ((LOWER(TRIM(pbg_task.function_type)) NOT LIKE '%fungsi usaha%' + AND LOWER(TRIM(pbg_task.function_type)) NOT LIKE '%sebagai tempat usaha%') + OR pbg_task.function_type IS NULL) + AND pbg_task.status != 20 THEN 1 END) AS non_business_count, + SUM(CASE WHEN ((LOWER(TRIM(pbg_task.function_type)) NOT LIKE '%fungsi usaha%' + AND LOWER(TRIM(pbg_task.function_type)) NOT LIKE '%sebagai tempat usaha%') + OR pbg_task.function_type IS NULL) + AND pbg_task.status != 20 THEN ptr.nilai_retribusi_bangunan ELSE 0 END) AS non_business_total ") ->first(); @@ -77,10 +79,6 @@ class BigdataResume extends Model $query = PbgTask::leftJoin('pbg_task_retributions as ptr', 'pbg_task.uuid', '=', 'ptr.pbg_task_uid') ->selectRaw('COUNT(DISTINCT pbg_task.id) as task_count, SUM(ptr.nilai_retribusi_bangunan) as total_retribution'); - if ($year !== 'all') { - $query->whereYear('pbg_task.task_created_at', (int) $year); - } - return $query->first(); }); @@ -98,10 +96,6 @@ class BigdataResume extends Model SUM(CASE WHEN sp.id IS NOT NULL AND ptr.id IS NOT NULL THEN ptr.nilai_retribusi_bangunan ELSE 0 END) as total_retribution '); - if ($year !== 'all') { - $query->whereYear('pbg_task.task_created_at', (int) $year); - } - return $query->first(); }); diff --git a/app/Services/ServiceGoogleSheet.php b/app/Services/ServiceGoogleSheet.php index ee3eb1d..29c43ac 100644 --- a/app/Services/ServiceGoogleSheet.php +++ b/app/Services/ServiceGoogleSheet.php @@ -356,39 +356,63 @@ class ServiceGoogleSheet public function get_big_resume_data(){ try { - $sheet_big_data = $this->get_data_by_sheet(); - $data_setting_result = []; // Initialize result storage + $sections = [ + 'TARGET_PAD' => "TARGET PAD 2024", + 'KEKURANGAN_POTENSI' => "DEVIASI TARGET DENGAN POTENSI TOTAL BERKAS", + 'TOTAL_POTENSI_BERKAS' => "•TOTAL BERKAS 2025", + 'BELUM_TERVERIFIKASI' => "•BERKAS AKTUAL BELUM TERVERIFIKASI (POTENSI):", + 'TERVERIFIKASI' => "•BERKAS AKTUAL TERVERIFIKASI DINAS TEKNIS 2025:", + 'NON_USAHA' => "•NON USAHA: HUNIAN, SOSBUD, KEAGAMAAN", + 'USAHA' => "•USAHA: USAHA, CAMPURAN, KOLEKTIF, PRASARANA", + 'PROSES_DINAS_TEKNIS' => "•TERPROSES DI DPUTR: belum selesai rekomtek'", + 'WAITING_KLIK_DPMPTSP' => "•TERPROSES DI PTSP: Pengiriman SKRD/ Validasi di PTSP", + 'REALISASI_TERBIT_PBG' => "•BERKAS YANG TERBIT PBG 2025:" + ]; - $found_section = null; // Track which section is found + $result = []; - foreach ($sheet_big_data as $row) { - // Check for section headers - if (in_array("•PROSES PENERBITAN:", $row)) { - $found_section = "MENUNGGU_KLIK_DPMPTSP"; - } elseif (in_array("•BERKAS AKTUAL TERVERIFIKASI DINAS TEKNIS 2024:", $row)) { - $found_section = "REALISASI_TERBIT_PBG"; - } elseif (in_array("•TERPROSES DI DPUTR: belum selesai rekomtek'", $row)) { - $found_section = "PROSES_DINAS_TEKNIS"; - } - - // If a section is found and we reach "Grand Total", save the corresponding values - if ($found_section && isset($row[0]) && trim($row[0]) === "Grand Total") { - if ($found_section === "MENUNGGU_KLIK_DPMPTSP") { - $data_setting_result["MENUNGGU_KLIK_DPMPTSP_COUNT"] = $this->convertToInteger($row[2]) ?? null; - $data_setting_result["MENUNGGU_KLIK_DPMPTSP_SUM"] = $this->convertToDecimal($row[3]) ?? null; - } elseif ($found_section === "REALISASI_TERBIT_PBG") { - $data_setting_result["REALISASI_TERBIT_PBG_COUNT"] = $this->convertToInteger($row[2]) ?? null; - $data_setting_result["REALISASI_TERBIT_PBG_SUM"] = $this->convertToDecimal($row[4]) ?? null; - } elseif ($found_section === "PROSES_DINAS_TEKNIS") { - $data_setting_result["PROSES_DINAS_TEKNIS_COUNT"] = $this->convertToInteger($row[2]) ?? null; - $data_setting_result["PROSES_DINAS_TEKNIS_SUM"] = $this->convertToDecimal($row[3]) ?? null; - } - - // Reset section tracking after capturing "Grand Total" - $found_section = null; + foreach ($sections as $key => $identifier) { + $values = $this->get_values_from_section($identifier, [10, 11], 8); + + if (!empty($values)) { + $result[$key] = [ + 'identifier' => $identifier, + 'total' => $values[0] ?? null, // index 0 untuk total/jumlah + 'nominal' => $values[1] ?? null // index 1 untuk nominal + ]; } } - return $data_setting_result; + + // Save data settings + $dataSettings = [ + 'TARGET_PAD' => $this->convertToDecimal($result['TARGET_PAD']['nominal']) ?? 0, + 'KEKURANGAN_POTENSI' => $this->convertToDecimal($result['KEKURANGAN_POTENSI']['nominal']) ?? 0, + 'REALISASI_TERBIT_PBG_COUNT' => $this->convertToInteger($result['REALISASI_TERBIT_PBG']['total']) ?? 0, + 'REALISASI_TERBIT_PBG_SUM' => $this->convertToDecimal($result['REALISASI_TERBIT_PBG']['nominal']) ?? 0, + 'MENUNGGU_KLIK_DPMPTSP_COUNT' => $this->convertToInteger($result['WAITING_KLIK_DPMPTSP']['total']) ?? 0, + 'MENUNGGU_KLIK_DPMPTSP_SUM' => $this->convertToDecimal($result['WAITING_KLIK_DPMPTSP']['nominal']) ?? 0, + 'PROSES_DINAS_TEKNIS_COUNT' => $this->convertToInteger($result['PROSES_DINAS_TEKNIS']['total']) ?? 0, + 'PROSES_DINAS_TEKNIS_SUM' => $this->convertToDecimal($result['PROSES_DINAS_TEKNIS']['nominal']) ?? 0, + ]; + + foreach ($dataSettings as $key => $value) { + // Ensure value is not null before saving to database + $processedValue = 0; // Default to 0 instead of null + if ($value !== null && $value !== '') { + // Try to convert to appropriate type based on key name + if (strpos($key, '_COUNT') !== false) { + $processedValue = $this->convertToInteger($value) ?? 0; + } else { + $processedValue = $this->convertToDecimal($value) ?? 0; + } + } + + DataSetting::updateOrCreate( + ['key' => $key], + ['value' => $processedValue] + ); + } + return $dataSettings; }catch(Exception $exception){ Log::error("Error getting big resume data", ['error' => $exception->getMessage()]); throw $exception; diff --git a/build.zip b/build.zip index ef253e7..c6f79ff 100644 Binary files a/build.zip and b/build.zip differ diff --git a/resources/js/dashboards/bigdata.js b/resources/js/dashboards/bigdata.js index e898718..41c104b 100644 --- a/resources/js/dashboards/bigdata.js +++ b/resources/js/dashboards/bigdata.js @@ -44,7 +44,7 @@ class BigData { async getBigDataResume(filterByDate) { try { const response = await fetch( - `${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterByDate}`, + `${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterByDate}&type=simbg`, { credentials: "include", headers: { diff --git a/resources/js/dashboards/lack-of-potential.js b/resources/js/dashboards/lack-of-potential.js index ab6d071..881028e 100644 --- a/resources/js/dashboards/lack-of-potential.js +++ b/resources/js/dashboards/lack-of-potential.js @@ -49,7 +49,7 @@ class LackOfPotential { async getDataTotalPotensi(filterDate) { try { const response = await fetch( - `${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterDate}`, + `${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterDate}&type=leader`, { credentials: "include", headers: { diff --git a/resources/js/dashboards/leader.js b/resources/js/dashboards/leader.js index e898718..8f23b71 100644 --- a/resources/js/dashboards/leader.js +++ b/resources/js/dashboards/leader.js @@ -44,7 +44,7 @@ class BigData { async getBigDataResume(filterByDate) { try { const response = await fetch( - `${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterByDate}`, + `${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterByDate}&&type=leader`, { credentials: "include", headers: { diff --git a/resources/js/dashboards/pbg.js b/resources/js/dashboards/pbg.js index dbc0620..e29a1df 100644 --- a/resources/js/dashboards/pbg.js +++ b/resources/js/dashboards/pbg.js @@ -120,7 +120,7 @@ class DashboardPBG { async getResume(filterByDate) { try { const response = await fetch( - `${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterByDate}`, + `${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterByDate}&type=leader`, { credentials: "include", headers: { diff --git a/resources/js/dashboards/potentials/inside_system.js b/resources/js/dashboards/potentials/inside_system.js index c518a73..887e2c3 100644 --- a/resources/js/dashboards/potentials/inside_system.js +++ b/resources/js/dashboards/potentials/inside_system.js @@ -15,8 +15,10 @@ class DashboardPotentialInsideSystem { this.reklameCount = this.allCountData.total_reklame ?? 0; this.pdamCount = this.allCountData.total_pdam ?? 0; this.tataRuangCount = this.allCountData.total_tata_ruang ?? 0; - this.tataRuangUsahaCount = this.allCountData.total_tata_ruang_usaha ?? 0; - this.tataRuangNonUsahaCount = this.allCountData.total_tata_ruang_non_usaha ?? 0; + this.tataRuangUsahaCount = + this.allCountData.total_tata_ruang_usaha ?? 0; + this.tataRuangNonUsahaCount = + this.allCountData.total_tata_ruang_non_usaha ?? 0; let dataReportTourism = this.allCountData.data_report; @@ -51,7 +53,7 @@ class DashboardPotentialInsideSystem { async getDataTotalPotensi(filterDate) { try { const response = await fetch( - `${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterDate}`, + `${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterDate}&type=leader`, { credentials: "include", headers: { diff --git a/resources/js/dashboards/potentials/outside_system.js b/resources/js/dashboards/potentials/outside_system.js index 8b4fd38..d4257c1 100644 --- a/resources/js/dashboards/potentials/outside_system.js +++ b/resources/js/dashboards/potentials/outside_system.js @@ -21,7 +21,7 @@ class DashboardPotentialOutsideSystem { async getBigDataResume(filterDate) { try { const response = await fetch( - `${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterDate}`, + `${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterDate}&type=leader`, { credentials: "include", headers: { diff --git a/resources/js/global-config.js b/resources/js/global-config.js index c67fcf7..fa22242 100644 --- a/resources/js/global-config.js +++ b/resources/js/global-config.js @@ -5,7 +5,7 @@ export function addThousandSeparators(value, fractionDigits = 2) { // Convert to string first if it's a number if (typeof value === "number") { - return new Intl.NumberFormat("en-US", { + return new Intl.NumberFormat("id-ID", { minimumFractionDigits: fractionDigits, maximumFractionDigits: fractionDigits, }).format(value); @@ -26,8 +26,8 @@ export function addThousandSeparators(value, fractionDigits = 2) { if (isNaN(number)) return null; // Return null if conversion fails - // Format the number with thousand separators - return new Intl.NumberFormat("en-US", { + // Format the number with Indonesian format (dot for thousands, comma for decimal) + return new Intl.NumberFormat("id-ID", { minimumFractionDigits: fractionDigits, maximumFractionDigits: fractionDigits, }).format(number); diff --git a/resources/js/pbg-task/index.js b/resources/js/pbg-task/index.js index a95c97d..eeb8158 100644 --- a/resources/js/pbg-task/index.js +++ b/resources/js/pbg-task/index.js @@ -1,6 +1,8 @@ import { Grid, html } from "gridjs/dist/gridjs.umd.js"; import GlobalConfig from "../global-config"; import { Dropzone } from "dropzone"; +import { addThousandSeparators } from "../global-config"; + Dropzone.autoDiscover = false; class PbgTasks { @@ -87,6 +89,9 @@ class PbgTasks { "Function Type", "Consultation Type", { name: "Due Date" }, + { + name: "Retribution", + }, { name: "Action", formatter: (cell) => { @@ -191,6 +196,12 @@ class PbgTasks { item.function_type, item.consultation_type, item.due_date, + item.pbg_task_retributions + ? addThousandSeparators( + item.pbg_task_retributions + .nilai_retribusi_bangunan + ) + : "-", item, ]), total: (data) => data.meta.total, diff --git a/resources/views/dashboards/bigdata.blade.php b/resources/views/dashboards/bigdata.blade.php index 918b1d5..407f501 100644 --- a/resources/views/dashboards/bigdata.blade.php +++ b/resources/views/dashboards/bigdata.blade.php @@ -13,7 +13,7 @@

ANALISA BIG DATA PROSES PBG
- MELALUI APLIKASI SIBEDAS PBG + MELALUI APLIKASI SIBEDAS PBG (SIMBG)

Terakhir di update - {{$latest_created}} diff --git a/resources/views/dashboards/leader.blade.php b/resources/views/dashboards/leader.blade.php index c81b734..a5c4ba9 100644 --- a/resources/views/dashboards/leader.blade.php +++ b/resources/views/dashboards/leader.blade.php @@ -13,7 +13,7 @@

ANALISA BIG DATA PROSES PBG
- MELALUI APLIKASI SIBEDAS PBG + MELALUI APLIKASI SIBEDAS PBG (LEADER)

Terakhir di update - {{$latest_created}} diff --git a/resources/views/pbg_task/show.blade.php b/resources/views/pbg_task/show.blade.php index a444b73..e288ea8 100644 --- a/resources/views/pbg_task/show.blade.php +++ b/resources/views/pbg_task/show.blade.php @@ -153,7 +153,7 @@
Nilai SHST
-
{{$data->pbg_task_retributions->nilai_shst}}
+
{{ number_format($data->pbg_task_retributions->nilai_shst, 2, ',', '.') }}
Indeks Integrasi
@@ -167,7 +167,7 @@
Nilai Retribusi Bangunan
-
{{$data->pbg_task_retributions->nilai_retribusi_bangunan}}
+
{{ number_format($data->pbg_task_retributions->nilai_retribusi_bangunan, 2, ',', '.') }}
Nilai Prasarana
@@ -183,7 +183,7 @@
SKRD Amount
-
{{$data->pbg_task_retributions->skrd_amount}}
+
{{ number_format($data->pbg_task_retributions->skrd_amount, 2, ',', '.') }}