142 lines
5.0 KiB
PHP
142 lines
5.0 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Models\KegiatanAdaptasi;
|
|
|
|
class DashboardAdaptationService
|
|
{
|
|
public function getDashboardData(int $adaptationYear): array
|
|
{
|
|
// Ambil semua data (tanpa pagination, karena pakai DataTables di front-end)
|
|
$rows = KegiatanAdaptasi::select([
|
|
'id',
|
|
'nama_kegiatan',
|
|
'tahun_kegiatan',
|
|
'sektor',
|
|
'sub_sektor',
|
|
'alokasi_apbn',
|
|
'alokasi_apbd',
|
|
'alokasi_swasta',
|
|
'alokasi_sumber_dana_lain',
|
|
'realisasi_apbn',
|
|
'realisasi_apbd',
|
|
'realisasi_swasta',
|
|
'realisasi_sumber_dana_lain'
|
|
])
|
|
->where('tahun_kegiatan', $adaptationYear)
|
|
->orderBy('created_at', 'desc')
|
|
->get();
|
|
|
|
// Normalisasi angka untuk table
|
|
$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);
|
|
}
|
|
|
|
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_anggaran' => array_sum($budgetData),
|
|
'total_alokasi' => array_sum($realisasiData)
|
|
];
|
|
|
|
$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,
|
|
'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 [
|
|
'adaptationYear' => $adaptationYear,
|
|
'tableData' => $rows, // ⬅️ sekarang collection biasa
|
|
'barData' => $barData,
|
|
'budgetData' => $budgetData,
|
|
'realisasiData' => $realisasiData,
|
|
'stats' => $stats,
|
|
'charts' => $charts
|
|
];
|
|
}
|
|
}
|