165 lines
5.8 KiB
PHP
165 lines
5.8 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Models\KegiatanAdaptasi;
|
|
use App\Models\KegiatanMitigasi;
|
|
|
|
class DashboardMitigationService
|
|
{
|
|
public function getDashboardData(int $mitigationYear): array
|
|
{
|
|
$rows = KegiatanMitigasi::select([
|
|
'id',
|
|
'tipe_kegiatan',
|
|
'nama_kegiatan',
|
|
'tahun_kegiatan',
|
|
'sektor',
|
|
'sub_sektor',
|
|
'kategori_perhitungan',
|
|
'emission_factor',
|
|
'revisi',
|
|
'alokasi_apbn',
|
|
'alokasi_apbd',
|
|
'alokasi_swasta',
|
|
'alokasi_sumber_dana_lain',
|
|
'realisasi_apbn',
|
|
'realisasi_apbd',
|
|
'realisasi_swasta',
|
|
'realisasi_sumber_dana_lain'
|
|
])
|
|
->where('tahun_kegiatan', $mitigationYear)
|
|
->orderBy('created_at', 'desc')
|
|
->get();
|
|
|
|
$rows = $rows->transform(function ($a) {
|
|
foreach ([
|
|
'alokasi_apbn',
|
|
'alokasi_apbd',
|
|
'alokasi_swasta',
|
|
'alokasi_sumber_dana_lain',
|
|
] as $field) {
|
|
$raw = $a->{$field} ?? '0';
|
|
$norm = str_replace('.', '', $raw);
|
|
$norm = str_replace(',', '.', $norm);
|
|
$a->{$field} = (float) $norm;
|
|
}
|
|
|
|
foreach ([
|
|
'realisasi_apbn',
|
|
'realisasi_apbd',
|
|
'realisasi_swasta',
|
|
'realisasi_sumber_dana_lain'
|
|
] as $field) {
|
|
$raw = $a->{$field} ?? '0';
|
|
$norm = str_replace('.', '', $raw);
|
|
$norm = str_replace(',', '.', $norm);
|
|
$a->{$field} = (int) round((float) $norm);
|
|
}
|
|
|
|
if (!empty($a->emission_factor)) {
|
|
$raw = $a->emission_factor;
|
|
$norm = str_replace('.', '', $raw); // hapus ribuan
|
|
$norm = str_replace(',', '.', $norm); // ubah koma ke titik
|
|
$a->emission_factor = (float) $norm;
|
|
} else {
|
|
$a->emission_factor = 0;
|
|
}
|
|
|
|
return $a;
|
|
});
|
|
|
|
$totalAksi = $rows->count();
|
|
|
|
// --- JUMLAH DATA PER SEKTOR DI TAHUN TERTENTU ---
|
|
$years = $rows->pluck('tahun_kegiatan')->unique()->sort()->values();
|
|
|
|
$barData = $years->map(fn($year) => [
|
|
'year' => $year,
|
|
'jumlah' => $rows
|
|
->where('tahun_kegiatan', $year)
|
|
->groupBy('sektor')
|
|
->map(fn($group, $sector) => $group->count())
|
|
->toArray(),
|
|
])->all();
|
|
|
|
// Budget data (tetap sesuai kebutuhan chart anggaran)
|
|
$budgetData = [
|
|
'apbn' => (float) $rows->sum('alokasi_apbn'),
|
|
'apbd' => (float) $rows->sum('alokasi_apbd'),
|
|
'swasta' => (float) $rows->sum('alokasi_swasta'),
|
|
'lainlain' => (float) $rows->sum('alokasi_sumber_dana_lain'),
|
|
];
|
|
|
|
$realisasiData = [
|
|
'apbn' => (float) $rows->sum('realisasi_apbn'),
|
|
'apbd' => (float) $rows->sum('realisasi_apbd'),
|
|
'swasta' => (float) $rows->sum('realisasi_swasta'),
|
|
'lainlain' => (float) $rows->sum('realisasi_sumber_dana_lain'),
|
|
];
|
|
|
|
$stats = [
|
|
'total_aksi' => $totalAksi,
|
|
'total_emisi' => (float) $rows->sum('emission_factor'),
|
|
'total_anggaran' => array_sum($budgetData),
|
|
'total_alokasi' => array_sum($realisasiData)
|
|
];
|
|
|
|
// dd($stats);
|
|
|
|
$sectorBreakdown = $rows
|
|
->groupBy('sektor')
|
|
->map(function($group, $sector) use ($totalAksi) {
|
|
$jumlah = $group->count();
|
|
$persen = $totalAksi > 0 ? round(($jumlah / $totalAksi) * 100, 2) : 0;
|
|
return [
|
|
'sektor' => $sector,
|
|
'jumlah' => $jumlah,
|
|
'persen' => $persen,
|
|
];
|
|
})
|
|
->values()
|
|
->all();
|
|
|
|
$charts = [
|
|
'aksi' => $sectorBreakdown,
|
|
'emisi' => $rows->groupBy('sektor')->map(function($g, $s) use ($rows) {
|
|
$total = $rows->sum('emission_factor');
|
|
$val = $g->sum('emission_factor');
|
|
$persen = $total > 0 ? round(($val / $total) * 100, 2) : 0;
|
|
return [
|
|
'sektor' => $s,
|
|
'persen' => $persen,
|
|
];
|
|
})->values()->all(),
|
|
'anggaran' => $rows->groupBy('sektor')->map(function($g, $s) use ($budgetData) {
|
|
$total = array_sum($budgetData);
|
|
$val = $g->sum('alokasi_apbn') + $g->sum('alokasi_apbd') + $g->sum('alokasi_swasta') + $g->sum('alokasi_sumber_dana_lain');
|
|
$persen = $total > 0 ? round(($val / $total) * 100, 2) : 0;
|
|
return [
|
|
'sektor' => $s,
|
|
'persen' => $persen,
|
|
];
|
|
})->values()->all(),
|
|
'alokasi' => $rows->groupBy('sektor')->map(function($g, $s) use ($realisasiData) {
|
|
$total = array_sum($realisasiData);
|
|
$val = $g->sum('realisasi_apbn') + $g->sum('realisasi_apbd') + $g->sum('realisasi_swasta') + $g->sum('realisasi_sumber_dana_lain');
|
|
$persen = $total > 0 ? round(($val / $total) * 100, 2) : 0;
|
|
return [
|
|
'sektor' => $s,
|
|
'persen' => $persen,
|
|
];
|
|
})->values()->all(),
|
|
];
|
|
|
|
return [
|
|
'mitigationYear' => $mitigationYear,
|
|
'tableData' => $rows,
|
|
'barData' => $barData,
|
|
'budgetData' => $budgetData,
|
|
'realisasiData' => $realisasiData,
|
|
'stats' => $stats,
|
|
'charts' => $charts
|
|
];
|
|
}
|
|
} |