solve dashboard indikator pertanian

This commit is contained in:
2026-08-13 16:07:55 +07:00
parent 4b26e82afb
commit 6830142a82
4 changed files with 1120 additions and 133 deletions
@@ -26,30 +26,14 @@ class IndikatorPertanianController extends Controller
{
public function index(Request $request)
{
$kabupatenOptions = $this->kabupatenOptions();
$ngadaOption = collect($kabupatenOptions)->first(
fn ($option) => str_contains(strtolower($option['label']), 'ngada')
);
$initialFilters = $this->selectedFilters($request, $ngadaOption['value'] ?? 'all');
$totalPetani = $this->applyPetaniFilters(Petani::query(), $initialFilters)->count();
$totalLuasLahan = ((float) $this->applyLahanFilters(Lahan::query(), $initialFilters)->sum('luas_lahan')) / 10000;
$rataRataLuasLahan = $totalPetani > 0
? $totalLuasLahan / $totalPetani
: 0;
$totalProduksiKg = $this->totalProduksiKg($initialFilters);
$rataRataProduksiKg = $totalPetani > 0
? $totalProduksiKg / $totalPetani
: 0;
$rataRataProduktivitas = $totalLuasLahan > 0
? $totalProduksiKg / $totalLuasLahan
: 0;
$initialFilters = $this->selectedFilters($request, $this->defaultKabupatenId());
$payload = $this->dashboardPayload($initialFilters);
$filterOptions = [
[
'key' => 'kabupaten',
'label' => 'Kabupaten',
'options' => $kabupatenOptions,
'options' => $this->kabupatenOptions(),
'icon' => 'tabler-map-pin',
'readonly' => true,
],
@@ -75,7 +59,55 @@ class IndikatorPertanianController extends Controller
],
];
$summaryData = [
return view('dashboard.indikator-pertanian', [
'title' => 'Indikator Pertanian',
'initialFilters' => $initialFilters,
'filterOptions' => $filterOptions,
] + $payload);
}
public function data(Request $request)
{
$filters = $this->selectedFilters($request, $this->defaultKabupatenId());
return response()->json([
'filters' => $filters,
] + $this->dashboardPayload($filters));
}
private function defaultKabupatenId(): string
{
$ngadaOption = collect($this->kabupatenOptions())->first(
fn ($option) => str_contains(strtolower($option['label']), 'ngada')
);
return $ngadaOption['value'] ?? 'all';
}
private function dashboardPayload(array $filters): array
{
return [
'summaryData' => $this->summaryData($filters),
'chartData' => $this->chartData($filters),
];
}
private function summaryData(array $filters): array
{
$totalPetani = $this->applyPetaniFilters(Petani::query(), $filters)->count();
$totalLuasLahan = ((float) $this->applyLahanFilters(Lahan::query(), $filters)->sum('luas_lahan')) / 10000;
$rataRataLuasLahan = $totalPetani > 0
? $totalLuasLahan / $totalPetani
: 0;
$totalProduksiKg = $this->totalProduksiKg($filters);
$rataRataProduksiKg = $totalPetani > 0
? $totalProduksiKg / $totalPetani
: 0;
$rataRataProduktivitas = $totalLuasLahan > 0
? $totalProduksiKg / $totalLuasLahan
: 0;
return [
[
'value' => number_format($totalPetani, 0, ',', '.'),
'label' => 'Petani Terdata',
@@ -105,30 +137,27 @@ class IndikatorPertanianController extends Controller
'variant' => 'info',
],
];
}
return view('dashboard.indikator-pertanian', [
'title' => 'Indikator Pertanian',
'initialFilters' => $initialFilters,
'filterOptions' => $filterOptions,
'summaryData' => $summaryData,
'chartData' => [
'petaniPerKomoditas' => $this->petaniPerKomoditasChart($initialFilters),
'luasLahanPerKecamatan' => $this->luasLahanPerKecamatanChart($initialFilters),
'kondisiTanaman' => $this->kondisiTanamanChart($initialFilters),
'statusKepemilikanLahan' => $this->statusKepemilikanLahanChart($initialFilters),
'seranganHama' => $this->seranganHamaChart($initialFilters),
'penyakitTanaman' => $this->penyakitTanamanChart($initialFilters),
'keparahanSerangan' => $this->keparahanSeranganChart($initialFilters),
'statusHakKelolaLahan' => $this->statusHakKelolaLahanChart($initialFilters),
'praktikPemupukan' => $this->praktikPemupukanChart($initialFilters),
'produksiPerKomoditas' => $this->produksiPerKomoditasChart($initialFilters),
'produktivitasPerKomoditas' => $this->produktivitasPerKomoditasChart($initialFilters),
'luasPanenPerKomoditas' => $this->luasPanenPerKomoditasChart($initialFilters),
'statusPanen' => $this->statusPanenChart($initialFilters),
'surveyProduktivitasHa' => $this->surveyProduktivitasByUnitChart($initialFilters, 'ha_tahun'),
'surveyProduktivitasPohon' => $this->surveyProduktivitasByUnitChart($initialFilters, 'pohon_tahun'),
],
]);
private function chartData(array $filters): array
{
return [
'petaniPerKomoditas' => $this->petaniPerKomoditasChart($filters),
'luasLahanPerKecamatan' => $this->luasLahanPerKecamatanChart($filters),
'kondisiTanaman' => $this->kondisiTanamanChart($filters),
'statusKepemilikanLahan' => $this->statusKepemilikanLahanChart($filters),
'seranganHama' => $this->seranganHamaChart($filters),
'penyakitTanaman' => $this->penyakitTanamanChart($filters),
'keparahanSerangan' => $this->keparahanSeranganChart($filters),
'statusHakKelolaLahan' => $this->statusHakKelolaLahanChart($filters),
'praktikPemupukan' => $this->praktikPemupukanChart($filters),
'produksiPerKomoditas' => $this->produksiPerKomoditasChart($filters),
'produktivitasPerKomoditas' => $this->produktivitasPerKomoditasChart($filters),
'luasPanenPerKomoditas' => $this->luasPanenPerKomoditasChart($filters),
'statusPanen' => $this->statusPanenChart($filters),
'surveyProduktivitasHa' => $this->surveyProduktivitasByUnitChart($filters, 'ha_tahun'),
'surveyProduktivitasPohon' => $this->surveyProduktivitasByUnitChart($filters, 'pohon_tahun'),
];
}
private function selectedFilters(Request $request, string $defaultKabupaten): array