fix data and dashboard count and sum

This commit is contained in:
arifal hidayat
2025-08-08 03:17:04 +07:00
parent 588e3ad5e2
commit 1288ab509d
19 changed files with 182 additions and 78 deletions

View File

@@ -0,0 +1,66 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Services\ServiceGoogleSheet;
use App\Models\BigdataResume;
use App\Models\ImportDatasource;
use Illuminate\Support\Facades\Log;
class SyncDashboardPbg extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'app:sync-dashboard-pbg';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Execute the console command.
*/
public function handle()
{
$import_datasource = ImportDatasource::create([
'message' => '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()
]);
}
}
}
}

View File

@@ -23,14 +23,15 @@ class BigDataResumeController extends Controller
{ {
try{ try{
$filterDate = $request->get("filterByDate"); $filterDate = $request->get("filterByDate");
$type = $request->get("type");
if (!$filterDate || $filterDate === "latest") { 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) { if (!$big_data_resume) {
return $this->response_empty_resume(); return $this->response_empty_resume();
} }
} else { } else {
$big_data_resume = BigdataResume::where('year', 'leader') $big_data_resume = BigdataResume::where('year', $type)
->whereDate('created_at', $filterDate) ->whereDate('created_at', $filterDate)
->orderBy('id', 'desc') ->orderBy('id', 'desc')
->first(); ->first();

View File

@@ -24,7 +24,8 @@ class RequestAssignmentController extends Controller
$query = PbgTask::with([ $query = PbgTask::with([
'attachments' => function ($q) { 'attachments' => function ($q) {
$q->whereIn('pbg_type', ['berita_acara', 'bukti_bayar']); $q->whereIn('pbg_type', ['berita_acara', 'bukti_bayar']);
} },
'pbg_task_retributions'
])->orderBy('id', 'desc'); ])->orderBy('id', 'desc');
if ($request->has('filter') && !empty($request->get('filter'))) { if ($request->has('filter') && !empty($request->get('filter'))) {
@@ -34,7 +35,8 @@ class RequestAssignmentController extends Controller
case 'non-business': case 'non-business':
$query->where(function ($q) { $query->where(function ($q) {
$q->where(function ($q2) { $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) ->whereRaw("status != ?", 20)
->orWhereNull('function_type'); ->orWhereNull('function_type');
}); });
@@ -43,8 +45,11 @@ class RequestAssignmentController extends Controller
case 'business': case 'business':
$query->where(function ($q) { $query->where(function ($q) {
$q->whereRaw("LOWER(function_type) = ?", ['sebagai tempat usaha']) $q->where(function ($q2) {
->whereRaw("status != ?", 20); $q2->whereRaw("LOWER(function_type) LIKE ?", ['%fungsi usaha%'])
->orWhereRaw("LOWER(function_type) LIKE ?", ['%sebagai tempat usaha%'])
->whereRaw("status != ?", 20);
});
}); });
break; break;

View File

@@ -42,6 +42,7 @@ class RequestAssignmentResouce extends JsonResource
->where('pbg_type', 'bukti_bayar') ->where('pbg_type', 'bukti_bayar')
->sortByDesc('created_at') ->sortByDesc('created_at')
->first(), ->first(),
'pbg_task_retributions' => $this->pbg_task_retributions,
]; ];
} }
} }

View File

@@ -50,8 +50,8 @@ class ScrapingDataJob implements ShouldQueue
]); ]);
// Run the scraping services // Run the scraping services
// $service_google_sheet->run_service(); $service_google_sheet->run_service();
// $service_pbg_task->run_service(); $service_pbg_task->run_service();
try{ try{
$service_tab_pbg_task->run_service(); $service_tab_pbg_task->run_service();
}catch(\Exception $e){ }catch(\Exception $e){

View File

@@ -38,28 +38,30 @@ class BigdataResume extends Model
} }
public static function generateResumeData($import_datasource_id, $year, $data_setting){ 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_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(" ->selectRaw("
COUNT(CASE WHEN LOWER(TRIM(ptgs.status_verifikasi)) = 'selesai verifikasi' THEN 1 END) AS verified_count, COUNT(CASE WHEN pbg_task.status = 20 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, 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, COUNT(CASE WHEN pbg_task.status != 20 OR pbg_task.status 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, 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) COUNT(CASE WHEN (LOWER(TRIM(pbg_task.function_type)) LIKE '%fungsi usaha%'
AND LOWER(TRIM(pbg_task.function_type)) = 'sebagai tempat usaha' THEN 1 END) AS business_count, OR LOWER(TRIM(pbg_task.function_type)) LIKE '%sebagai tempat usaha%')
SUM(CASE WHEN (LOWER(TRIM(ptgs.status_verifikasi)) != 'selesai verifikasi' OR ptgs.status_verifikasi IS NULL) AND pbg_task.status != 20 THEN 1 END) AS business_count,
AND LOWER(TRIM(pbg_task.function_type)) = 'sebagai tempat usaha' THEN ptr.nilai_retribusi_bangunan ELSE 0 END) AS business_total, 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) COUNT(CASE WHEN ((LOWER(TRIM(pbg_task.function_type)) NOT LIKE '%fungsi usaha%'
AND (LOWER(TRIM(pbg_task.function_type)) != 'sebagai tempat usaha' OR pbg_task.function_type IS NULL) THEN 1 END) AS non_business_count, AND LOWER(TRIM(pbg_task.function_type)) NOT LIKE '%sebagai tempat usaha%')
SUM(CASE WHEN (LOWER(TRIM(ptgs.status_verifikasi)) != 'selesai verifikasi' OR ptgs.status_verifikasi IS NULL) OR pbg_task.function_type 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 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(); ->first();
@@ -77,10 +79,6 @@ class BigdataResume extends Model
$query = PbgTask::leftJoin('pbg_task_retributions as ptr', 'pbg_task.uuid', '=', 'ptr.pbg_task_uid') $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'); ->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(); 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 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(); return $query->first();
}); });

View File

@@ -356,39 +356,63 @@ class ServiceGoogleSheet
public function get_big_resume_data(){ public function get_big_resume_data(){
try { try {
$sheet_big_data = $this->get_data_by_sheet(); $sections = [
$data_setting_result = []; // Initialize result storage '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) { foreach ($sections as $key => $identifier) {
// Check for section headers $values = $this->get_values_from_section($identifier, [10, 11], 8);
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 (!empty($values)) {
if ($found_section && isset($row[0]) && trim($row[0]) === "Grand Total") { $result[$key] = [
if ($found_section === "MENUNGGU_KLIK_DPMPTSP") { 'identifier' => $identifier,
$data_setting_result["MENUNGGU_KLIK_DPMPTSP_COUNT"] = $this->convertToInteger($row[2]) ?? null; 'total' => $values[0] ?? null, // index 0 untuk total/jumlah
$data_setting_result["MENUNGGU_KLIK_DPMPTSP_SUM"] = $this->convertToDecimal($row[3]) ?? null; 'nominal' => $values[1] ?? null // index 1 untuk nominal
} 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;
} }
} }
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){ }catch(Exception $exception){
Log::error("Error getting big resume data", ['error' => $exception->getMessage()]); Log::error("Error getting big resume data", ['error' => $exception->getMessage()]);
throw $exception; throw $exception;

BIN
build.zip

Binary file not shown.

View File

@@ -44,7 +44,7 @@ class BigData {
async getBigDataResume(filterByDate) { async getBigDataResume(filterByDate) {
try { try {
const response = await fetch( const response = await fetch(
`${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterByDate}`, `${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterByDate}&type=simbg`,
{ {
credentials: "include", credentials: "include",
headers: { headers: {

View File

@@ -49,7 +49,7 @@ class LackOfPotential {
async getDataTotalPotensi(filterDate) { async getDataTotalPotensi(filterDate) {
try { try {
const response = await fetch( const response = await fetch(
`${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterDate}`, `${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterDate}&type=leader`,
{ {
credentials: "include", credentials: "include",
headers: { headers: {

View File

@@ -44,7 +44,7 @@ class BigData {
async getBigDataResume(filterByDate) { async getBigDataResume(filterByDate) {
try { try {
const response = await fetch( const response = await fetch(
`${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterByDate}`, `${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterByDate}&&type=leader`,
{ {
credentials: "include", credentials: "include",
headers: { headers: {

View File

@@ -120,7 +120,7 @@ class DashboardPBG {
async getResume(filterByDate) { async getResume(filterByDate) {
try { try {
const response = await fetch( const response = await fetch(
`${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterByDate}`, `${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterByDate}&type=leader`,
{ {
credentials: "include", credentials: "include",
headers: { headers: {

View File

@@ -15,8 +15,10 @@ class DashboardPotentialInsideSystem {
this.reklameCount = this.allCountData.total_reklame ?? 0; this.reklameCount = this.allCountData.total_reklame ?? 0;
this.pdamCount = this.allCountData.total_pdam ?? 0; this.pdamCount = this.allCountData.total_pdam ?? 0;
this.tataRuangCount = this.allCountData.total_tata_ruang ?? 0; this.tataRuangCount = this.allCountData.total_tata_ruang ?? 0;
this.tataRuangUsahaCount = this.allCountData.total_tata_ruang_usaha ?? 0; this.tataRuangUsahaCount =
this.tataRuangNonUsahaCount = this.allCountData.total_tata_ruang_non_usaha ?? 0; this.allCountData.total_tata_ruang_usaha ?? 0;
this.tataRuangNonUsahaCount =
this.allCountData.total_tata_ruang_non_usaha ?? 0;
let dataReportTourism = this.allCountData.data_report; let dataReportTourism = this.allCountData.data_report;
@@ -51,7 +53,7 @@ class DashboardPotentialInsideSystem {
async getDataTotalPotensi(filterDate) { async getDataTotalPotensi(filterDate) {
try { try {
const response = await fetch( const response = await fetch(
`${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterDate}`, `${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterDate}&type=leader`,
{ {
credentials: "include", credentials: "include",
headers: { headers: {

View File

@@ -21,7 +21,7 @@ class DashboardPotentialOutsideSystem {
async getBigDataResume(filterDate) { async getBigDataResume(filterDate) {
try { try {
const response = await fetch( const response = await fetch(
`${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterDate}`, `${GlobalConfig.apiHost}/api/bigdata-resume?filterByDate=${filterDate}&type=leader`,
{ {
credentials: "include", credentials: "include",
headers: { headers: {

View File

@@ -5,7 +5,7 @@ export function addThousandSeparators(value, fractionDigits = 2) {
// Convert to string first if it's a number // Convert to string first if it's a number
if (typeof value === "number") { if (typeof value === "number") {
return new Intl.NumberFormat("en-US", { return new Intl.NumberFormat("id-ID", {
minimumFractionDigits: fractionDigits, minimumFractionDigits: fractionDigits,
maximumFractionDigits: fractionDigits, maximumFractionDigits: fractionDigits,
}).format(value); }).format(value);
@@ -26,8 +26,8 @@ export function addThousandSeparators(value, fractionDigits = 2) {
if (isNaN(number)) return null; // Return null if conversion fails if (isNaN(number)) return null; // Return null if conversion fails
// Format the number with thousand separators // Format the number with Indonesian format (dot for thousands, comma for decimal)
return new Intl.NumberFormat("en-US", { return new Intl.NumberFormat("id-ID", {
minimumFractionDigits: fractionDigits, minimumFractionDigits: fractionDigits,
maximumFractionDigits: fractionDigits, maximumFractionDigits: fractionDigits,
}).format(number); }).format(number);

View File

@@ -1,6 +1,8 @@
import { Grid, html } from "gridjs/dist/gridjs.umd.js"; import { Grid, html } from "gridjs/dist/gridjs.umd.js";
import GlobalConfig from "../global-config"; import GlobalConfig from "../global-config";
import { Dropzone } from "dropzone"; import { Dropzone } from "dropzone";
import { addThousandSeparators } from "../global-config";
Dropzone.autoDiscover = false; Dropzone.autoDiscover = false;
class PbgTasks { class PbgTasks {
@@ -87,6 +89,9 @@ class PbgTasks {
"Function Type", "Function Type",
"Consultation Type", "Consultation Type",
{ name: "Due Date" }, { name: "Due Date" },
{
name: "Retribution",
},
{ {
name: "Action", name: "Action",
formatter: (cell) => { formatter: (cell) => {
@@ -191,6 +196,12 @@ class PbgTasks {
item.function_type, item.function_type,
item.consultation_type, item.consultation_type,
item.due_date, item.due_date,
item.pbg_task_retributions
? addThousandSeparators(
item.pbg_task_retributions
.nilai_retribusi_bangunan
)
: "-",
item, item,
]), ]),
total: (data) => data.meta.total, total: (data) => data.meta.total,

View File

@@ -13,7 +13,7 @@
<div class="d-flex justify-content-between align-items-center mt-3 ms-2"> <div class="d-flex justify-content-between align-items-center mt-3 ms-2">
<h2 class="text-danger m-0"> <h2 class="text-danger m-0">
ANALISA BIG DATA PROSES PBG <br> ANALISA BIG DATA PROSES PBG <br>
MELALUI APLIKASI SIBEDAS PBG MELALUI APLIKASI SIBEDAS PBG (SIMBG)
</h2> </h2>
<div class="text-black text-end d-flex flex-column align-items-end me-3"> <div class="text-black text-end d-flex flex-column align-items-end me-3">
<span class="fs-5">Terakhir di update - {{$latest_created}}</span> <span class="fs-5">Terakhir di update - {{$latest_created}}</span>

View File

@@ -13,7 +13,7 @@
<div class="d-flex justify-content-between align-items-center mt-3 ms-2"> <div class="d-flex justify-content-between align-items-center mt-3 ms-2">
<h2 class="text-danger m-0"> <h2 class="text-danger m-0">
ANALISA BIG DATA PROSES PBG <br> ANALISA BIG DATA PROSES PBG <br>
MELALUI APLIKASI SIBEDAS PBG MELALUI APLIKASI SIBEDAS PBG (LEADER)
</h2> </h2>
<div class="text-black text-end d-flex flex-column align-items-end me-3"> <div class="text-black text-end d-flex flex-column align-items-end me-3">
<span class="fs-5">Terakhir di update - {{$latest_created}}</span> <span class="fs-5">Terakhir di update - {{$latest_created}}</span>

View File

@@ -153,7 +153,7 @@
</div> </div>
<div class="mb-3"> <div class="mb-3">
<dt>Nilai SHST</dt> <dt>Nilai SHST</dt>
<dd>{{$data->pbg_task_retributions->nilai_shst}}</dd> <dd>{{ number_format($data->pbg_task_retributions->nilai_shst, 2, ',', '.') }}</dd>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<dt>Indeks Integrasi</dt> <dt>Indeks Integrasi</dt>
@@ -167,7 +167,7 @@
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"> <div class="mb-3">
<dt>Nilai Retribusi Bangunan</dt> <dt>Nilai Retribusi Bangunan</dt>
<dd>{{$data->pbg_task_retributions->nilai_retribusi_bangunan}}</dd> <dd>{{ number_format($data->pbg_task_retributions->nilai_retribusi_bangunan, 2, ',', '.') }}</dd>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<dt>Nilai Prasarana</dt> <dt>Nilai Prasarana</dt>
@@ -183,7 +183,7 @@
</div> </div>
<div class="mb-3"> <div class="mb-3">
<dt>SKRD Amount</dt> <dt>SKRD Amount</dt>
<dd>{{$data->pbg_task_retributions->skrd_amount}}</dd> <dd>{{ number_format($data->pbg_task_retributions->skrd_amount, 2, ',', '.') }}</dd>
</div> </div>
</div> </div>
</div> </div>