sigd/app/Services/DashboardAdaptationService.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
];
}
}