From b63dafdaee3a808616c0a9466d2397ba546b0809 Mon Sep 17 00:00:00 2001
From: ahmadafriadi
Date: Thu, 20 Aug 2026 01:01:27 +0700
Subject: [PATCH 1/4] Update Profile Petani
---
.../Produktivitas/ProfilPetaniController.php | 313 +++++++
.../profil-petani/index.blade.php | 832 ++++++++++++------
2 files changed, 875 insertions(+), 270 deletions(-)
diff --git a/app/Http/Controllers/Web/Produktivitas/ProfilPetaniController.php b/app/Http/Controllers/Web/Produktivitas/ProfilPetaniController.php
index dfc4087..791fba0 100644
--- a/app/Http/Controllers/Web/Produktivitas/ProfilPetaniController.php
+++ b/app/Http/Controllers/Web/Produktivitas/ProfilPetaniController.php
@@ -13,6 +13,11 @@ use App\Models\Pertanian\Lahan;
use App\Models\Pertanian\Tanaman;
use App\Models\Pertanian\PraktikBudidaya;
use App\Models\Pertanian\SurveyPanen;
+use App\Models\Pertanian\SosialEkonomi;
+use App\Models\Pertanian\SurveyPelatihan;
+use App\Models\Pertanian\SurveySertifikasi;
+use App\Models\Pertanian\AksesPasar;
+use App\Models\Pertanian\HargaJualPanen;
use App\Models\Pertanian\PendapatanKomoditas;
use App\Models\Wilayah\DesaKelurahan;
use App\Models\Profile;
@@ -23,6 +28,15 @@ use App\Enums\PraktikBudidaya\MetodePenangananHamaPenyakit;
use App\Enums\PraktikBudidaya\FrekuensiSanitasiLahan;
use App\Enums\PraktikBudidaya\PenangananGulma;
use App\Enums\PraktikBudidaya\KondisiPengelolaanAir;
+use App\Enums\SosialEkonomi\SkorKecukupanPenghasilan;
+use App\Enums\SosialEkonomi\SkorKemampuanMenabung;
+use App\Enums\SosialEkonomi\TerdaftarKelompokTani;
+use App\Enums\SosialEkonomi\PeranDalamKelompok;
+use App\Enums\SosialEkonomi\StatusRekeningTabungan;
+use App\Enums\SosialEkonomi\PengalamanKreditKebun;
+use App\Enums\SosialEkonomi\KeterikatanHutangPanen;
+use App\Enums\SosialEkonomi\PraktikIjon;
+use App\Enums\SosialEkonomi\KebebasanMemilihPembeli;
class ProfilPetaniController extends Controller
{
@@ -62,6 +76,7 @@ class ProfilPetaniController extends Controller
$praktikBudidaya = PraktikBudidaya::where('petani_id', $petani->id)->first();
$surveyPanen = SurveyPanen::where('petani_id', $petani->id)->first();
+ $sosialEkonomi = SosialEkonomi::where('petani_id', $id)->first();
$indikatorOnFarm = collect();
@@ -145,6 +160,280 @@ class ProfilPetaniController extends Controller
'konservasi_tanah' => $praktikBudidaya?->kebiasaan_konservasi_tanah ?? [],
];
+ $d4SosialEkonomi = null;
+
+ $terdaftarKelompok = $sosialEkonomi->terdaftar_kelompok_tani;
+ $peranKelompok = $sosialEkonomi->peran_dalam_kelompok;
+
+ if ($sosialEkonomi) {
+
+ $kecukupanPenghasilan = $sosialEkonomi->skor_kecukupan_penghasilan;
+ $kemampuanMenabung = $sosialEkonomi->skor_kemampuan_menabung;
+
+ $rekening = $sosialEkonomi->status_rekening_tabungan;
+ $kredit = $sosialEkonomi->pengalaman_kredit_kebun;
+ $hutangPanen = $sosialEkonomi->keterikatan_hutang_panen;
+ $ijon = $sosialEkonomi->praktik_ijon;
+
+ $programKeuanganRaw = $sosialEkonomi->status_program_keuangan_formal ?? [];
+ $namaProgram = [
+ 'pkh' => 'PKH',
+ 'blt' => 'BLT',
+ 'kur' => 'KUR',
+ 'kredit_koperasi_resmi' => 'Kredit Koperasi',
+ 'credit_union_cu' => 'Credit Union (CU)',
+ 'pinjaman_bumdes' => 'Pinjaman BUMDes',
+ 'modal_hibah_dinas_pertanian' => 'Hibah Dinas Pertanian',
+ ];
+
+ $programBantuan = collect($programKeuanganRaw)->map(function ($status, $key) use ($namaProgram) {
+ $statusMeta = match ($status) {
+ 'sedang_menerima' => [
+ 'label' => 'Sedang Menerima',
+ 'short' => 'Aktif',
+ 'color' => 'success',
+ 'icon' => 'tabler-circle-check',
+ ],
+ 'pernah_tapi_tidak_lagi' => [
+ 'label' => 'Pernah, Tidak Lagi',
+ 'short' => 'Pernah',
+ 'color' => 'info',
+ 'icon' => 'tabler-history',
+ ],
+ 'belum_pernah' => [
+ 'label' => 'Belum Pernah',
+ 'short' => 'Belum Pernah',
+ 'color' => 'secondary',
+ 'icon' => 'tabler-minus',
+ ],
+ default => [
+ 'label' => Str::headline($status),
+ 'short' => Str::headline($status),
+ 'color' => 'secondary',
+ 'icon' => 'tabler-help-circle',
+ ],
+ };
+
+ return [
+ 'key' => $key,
+ 'nama' => $namaProgram[$key] ?? Str::headline($key),
+ 'status' => $status,
+ 'label' => $statusMeta['label'],
+ 'short' => $statusMeta['short'],
+ 'color' => $statusMeta['color'],
+ 'icon' => $statusMeta['icon'],
+ ];
+
+ })
+ ->values();
+
+ $d4SosialEkonomi = [
+
+ 'jumlah_tanggungan' => $sosialEkonomi->jumlah_tanggungan,
+
+ 'kecukupan_penghasilan' => [
+ 'skor' => $kecukupanPenghasilan?->value,
+ 'label' => $kecukupanPenghasilan?->label(),
+
+ 'color' => $this->getScoreColor(
+ $kecukupanPenghasilan?->value
+ ),
+ ],
+
+ 'kemampuan_menabung' => [
+ 'skor' => $kemampuanMenabung?->value,
+ 'label' => $kemampuanMenabung?->label(),
+
+ 'color' => $this->getScoreColor(
+ $kemampuanMenabung?->value
+ ),
+ ],
+
+ 'status_kepemilikan_lahan' => $sosialEkonomi->status_kepemilikan_lahan,
+
+ 'kelembagaan' => [
+ 'terdaftar' =>
+ $terdaftarKelompok === TerdaftarKelompokTani::YA,
+
+ 'status' =>
+ $terdaftarKelompok?->label(),
+
+ 'peran' =>
+ $peranKelompok?->label(),
+ ],
+
+ 'kondisi_keuangan' => [
+ 'rekening' => [
+ 'label' => $rekening?->label(),
+ 'value' => $rekening?->value,
+ 'color' => $this->getFinancialColor(
+ $rekening?->value
+ ),
+ 'icon' => 'tabler-building-bank',
+ ],
+
+ 'kredit' => [
+ 'label' => $kredit?->label(),
+ 'value' => $kredit?->value,
+ 'color' => $this->getFinancialColor(
+ $kredit?->value
+ ),
+ 'icon' => 'tabler-credit-card',
+ ],
+
+ 'hutang_panen' => [
+ 'label' => $hutangPanen?->label(),
+ 'value' => $hutangPanen?->value,
+ 'color' => $this->getFinancialColor(
+ $hutangPanen?->value
+ ),
+ 'icon' => 'tabler-coins',
+ ],
+
+ 'ijon' => [
+ 'label' => $ijon?->label(),
+ 'value' => $ijon?->value,
+ 'color' => $this->getFinancialColor(
+ $ijon?->value
+ ),
+ 'icon' => 'tabler-link',
+ ],
+ ],
+
+ 'program_bantuan' => $programBantuan,
+ ];
+ }
+
+ $surveyPelatihan = SurveyPelatihan::where('petani_id', $id)
+ ->orderByDesc('tahun_pelaksanaan')
+ ->get();
+
+ $surveySertifikasi = SurveySertifikasi::where('petani_id', $id)
+ ->orderByDesc('tahun_pelaksanaan')
+ ->get();
+
+ $aksesPasar = AksesPasar::where('petani_id', $id)->first();
+ $saluranTerdahulu = collect($aksesPasar?->saluran_terdahulu ?? [] );
+
+ $d6SaluranPasar = [
+ [
+ 'key' => 'tengkulak',
+ 'label' => 'Tengkulak',
+ 'icon' => 'tabler-user-dollar',
+ 'aktif' => $saluranTerdahulu->contains(
+ fn ($item) => Str::contains(
+ Str::lower($item),
+ ['tengkulak', 'pedagang lokal']
+ )
+ ),
+ ],
+
+ [
+ 'key' => 'koperasi',
+ 'label' => 'Koperasi',
+ 'icon' => 'tabler-users-group',
+ 'aktif' => $saluranTerdahulu->contains(
+ fn ($item) => Str::contains(
+ Str::lower($item),
+ 'koperasi'
+ )
+ ),
+ ],
+
+ [
+ 'key' => 'bumdes',
+ 'label' => 'BUMDes',
+ 'icon' => 'tabler-building-community',
+ 'aktif' => $saluranTerdahulu->contains(
+ fn ($item) => Str::contains(
+ Str::lower($item),
+ 'bumdes'
+ )
+ ),
+ ],
+
+ [
+ 'key' => 'eksportir',
+ 'label' => 'Eksportir',
+ 'icon' => 'tabler-plane-departure',
+ 'aktif' => $saluranTerdahulu->contains(
+ fn ($item) => Str::contains(
+ Str::lower($item),
+ 'eksportir'
+ )
+ ),
+ ],
+ ];
+
+ $hargaJualPanen = HargaJualPanen::where('petani_id', $id)->get();
+
+ $d6HargaJual = $hargaJualPanen->map(function ($item) {
+
+ $hargaSekarang = $item->harga_panen_terakhir !== null
+ ? (float) $item->harga_panen_terakhir
+ : null;
+
+ $hargaTahunLalu = $item->harga_tahun_lalu !== null
+ ? (float) $item->harga_tahun_lalu
+ : null;
+
+ $perubahan = null;
+
+ if (
+ $hargaSekarang !== null &&
+ $hargaTahunLalu !== null &&
+ $hargaTahunLalu > 0
+ ) {
+ $perubahan = (
+ ($hargaSekarang - $hargaTahunLalu)
+ / $hargaTahunLalu
+ ) * 100;
+ }
+
+ return [
+ 'bentuk_produk' => $item->bentuk_produk,
+
+ 'harga_sekarang' => $hargaSekarang,
+
+ 'harga_tahun_lalu' => $hargaTahunLalu,
+
+ 'harga_dua_tahun_lalu' =>
+ $item->harga_dua_tahun_lalu !== null
+ ? (float) $item->harga_dua_tahun_lalu
+ : null,
+
+ 'perubahan' => $perubahan,
+
+ 'trend' => match (true) {
+ $perubahan === null => 'neutral',
+ $perubahan > 0 => 'up',
+ $perubahan < 0 => 'down',
+ default => 'stable',
+ },
+ ];
+ });
+
+ $kebebasanPembeli = $sosialEkonomi?->kebebasan_memilih_pembeli;
+
+ $d6RantaiNilai = [
+ 'saluran_pasar' => $d6SaluranPasar,
+
+ 'harga_jual' => $d6HargaJual,
+
+ 'kebebasan_memilih_pembeli' => [
+ 'skor' => $kebebasanPembeli?->value,
+ 'label' => $kebebasanPembeli?->label(),
+
+ 'persentase' => $kebebasanPembeli
+ ? ($kebebasanPembeli->value / 5) * 100
+ : 0,
+
+ 'color' => $this->getScoreColor(
+ $kebebasanPembeli?->value
+ ),
+ ],
+ ];
+
$data = [
'petani' => $petani,
'skorPetani' => $skorPetani,
@@ -161,6 +450,16 @@ class ProfilPetaniController extends Controller
'praktikBudidaya' => $praktikBudidaya,
'indikatorOnFarm' => $indikatorOnFarm,
'detailOnFarm' => $detailOnFarm,
+ 'sosialEkonomi' => $sosialEkonomi,
+ 'd4SosialEkonomi' => $d4SosialEkonomi,
+ 'surveyPelatihan' => $surveyPelatihan,
+ 'surveySertifikasi' => $surveySertifikasi,
+ 'aksesPasar' => $aksesPasar,
+ 'd6SaluranPasar' => $d6SaluranPasar,
+ 'hargaJualPanen' => $hargaJualPanen,
+ 'd6HargaJual' => $d6HargaJual,
+ 'kebebasanPembeli' => $kebebasanPembeli,
+ 'd6RantaiNilai' => $d6RantaiNilai
];
return view('produktivitas.profil-petani.index', $data);
}
@@ -180,6 +479,20 @@ class ProfilPetaniController extends Controller
};
}
+ private function getFinancialColor(?int $score): string
+ {
+ if ($score === null || $score === 0) {
+ return 'secondary';
+ }
+
+ return match (true) {
+ $score >= 5 => 'success',
+ $score >= 4 => 'info',
+ $score >= 2 => 'warning',
+ default => 'danger',
+ };
+ }
+
private function buildProfiling(SkorPetani $skorPetani): array
{
$skorAkhir = $this->normalizeScore($skorPetani->skor_kesiapan_adopsi);
diff --git a/resources/views/produktivitas/profil-petani/index.blade.php b/resources/views/produktivitas/profil-petani/index.blade.php
index 30a0a75..7d3d1a0 100644
--- a/resources/views/produktivitas/profil-petani/index.blade.php
+++ b/resources/views/produktivitas/profil-petani/index.blade.php
@@ -3,14 +3,14 @@
@push('styles')
@endpush
@@ -50,57 +50,103 @@ $colors = collect($segments)
->values();
$segmentStyles = collect($segments)->keyBy('name');
-$countSegmentasi = $countSegmentasi->keyBy('segmen');
-$seriesSegmentasi = collect($segments)->map(function ($segment) use ($countSegmentasi) {
- return $countSegmentasi[$segment['name']]->total ?? 0;
-});
-$seriesSegmentasiKomoditas = collect($segments)->map(function ($segment) use ($countSegmentasiByKomoditas, $komoditas) {
-
- return [
- 'name' => $segment['name'],
- 'data' => $komoditas->map(function ($item) use ($countSegmentasiByKomoditas, $segment) {
-
- return optional(
- $countSegmentasiByKomoditas->first(function ($row) use ($item, $segment) {
- return $row->komoditas_id == $item->id
- && $row->segmen == $segment['name'];
- })
- )->total ?? 0;
-
- })->values(),
- ];
-
-})->values();
-
-$segmenDominan = $mapSegmentasi
- ->groupBy('desa_kelurahan_id')
- ->map(function ($items) {
- return $items->sortByDesc('total')->first();
- });
-
-$mapAvgSkorSegmentasi->each(function ($item) use ($segmenDominan) {
- $dominan = $segmenDominan->get($item->desa_kelurahan_id);
-
- $item->segmen_dominan = $dominan?->segmen;
- $item->jumlah_dominan = $dominan?->total;
-});
-
-$segmentasiByDesa = $mapAvgSkorSegmentasi->keyBy('desa_kelurahan_id');
-$desaLookup = $desaKelurahan->keyBy('desa_kelurahan_id');
-
-$mapDesaSegmentasi = $segmentasiByDesa->map(function ($segmentasi, $desaId) use ($desaLookup) {
- $desa = $desaLookup->get($desaId);
-
- if (!$desa) {
- return null;
- }
-
- $desa->segmentasi = $segmentasi;
-
- return $desa;
-})->filter()->values();
+$provinsi = $desaKelurahan
+ ->unique('provinsi_id')
+ ->sortBy('provinsi')
+ ->values();
@endphp
+
@@ -111,11 +157,11 @@ $mapDesaSegmentasi = $segmentasiByDesa->map(function ($segmentasi, $desaId) use
-
{{ $countPetani }}
+
0
Total Petani
- {{ $countKomoditas }}
+ 0
komoditas utama
@@ -130,15 +176,13 @@ $mapDesaSegmentasi = $segmentasiByDesa->map(function ($segmentasi, $desaId) use
- {{ number_format($sumLahan, 2, ',', '.') }} ha
+ 0
+ ha
Total Luas Lahan
- @php
- $avgLahan = $sumLahan / $countPetani;
- @endphp
rata-rata
- {{ number_format($avgLahan, 2, ',', '.') }}
+
ha/petani
@@ -153,12 +197,12 @@ $mapDesaSegmentasi = $segmentasiByDesa->map(function ($segmentasi, $desaId) use
- {{ number_format($avgSkor, 2, ',', '.') }}
+
Rata-rata Indeks Kesiapan Adopsi
Segmentasi:
- {{ $avgSegmen }}
+
@@ -172,11 +216,11 @@ $mapDesaSegmentasi = $segmentasiByDesa->map(function ($segmentasi, $desaId) use
- {{ $countDesa }}
+ 0
Jumlah Desa Sasaran
- {{ $countKecamatan }}
+ 0
kecamatan sasaran
@@ -204,30 +248,7 @@ $mapDesaSegmentasi = $segmentasiByDesa->map(function ($segmentasi, $desaId) use
% |
-
-
- @foreach ($segments as $segment)
- @php
- $total = $countSegmentasi->where('segmen', $segment['name'])->sum('total');
- $persen = $countPetani ? ($total / $countPetani) * 100 : 0;
- @endphp
-
-
-
-
-
-
-
-
- {{ $segment['name'] }}
-
-
- |
- {{ number_format($total) }} |
- {{ number_format($persen, 2) }}% |
-
- @endforeach
-
+
@@ -341,30 +362,7 @@ $mapDesaSegmentasi = $segmentasiByDesa->map(function ($segmentasi, $desaId) use
Segmen Dominan |
-
- @foreach ($mapDesaSegmentasi as $desa)
- @php
- $style = $segmentStyles[$desa->segmentasi->segmen] ?? null;
- $styleDominan = $segmentStyles[$desa->segmentasi->segmen_dominan] ?? null;
- @endphp
-
- | {{ $desa->desa_kelurahan }} |
- {{ number_format($desa->segmentasi->jumlah_petani) }} |
-
-
- {{ $desa->segmentasi->segmen }}
-
- ({{ number_format($desa->segmentasi->skor, 2, ',', '.') }})
- |
-
-
- {{ $desa->segmentasi->segmen_dominan }}
-
- ({{ number_format($desa->segmentasi->jumlah_dominan) }} petani)
- |
-
- @endforeach
-
+
@@ -379,6 +377,10 @@ $mapDesaSegmentasi = $segmentasiByDesa->map(function ($segmentasi, $desaId) use
Daftar Petani
untuk semua komoditas
+
@@ -392,27 +394,7 @@ $mapDesaSegmentasi = $segmentasiByDesa->map(function ($segmentasi, $desaId) use
| Segmen |
-
- @foreach ($daftarPetani as $item)
- @php
- $style = $segmentStyles[$item->segmen()] ?? null;
- @endphp
-
- | {{ $item->nama }} |
- {{ $item->desaKelurahan?->nama }} |
- {{ $item->komoditas?->nama }} |
- {{ number_format($item->lahans?->sum('luas_lahan'), 2, ',', '.') }} |
- {{ $item->skor ? number_format($item->skor?->skor_kesiapan_adopsi, 2, ',', '.') : '' }} |
-
- @if ($item->skor)
-
- {{ $item->segmen() }}
-
- @endif
- |
-
- @endforeach
-
+
@@ -429,6 +411,138 @@ $mapDesaSegmentasi = $segmentasiByDesa->map(function ($segmentasi, $desaId) use
crossorigin="">
+
+
+
+
+
+
+
+
+
@endpush
\ No newline at end of file
diff --git a/routes/web.php b/routes/web.php
index 78a924c..d6ddee7 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -52,6 +52,14 @@ Route::middleware('auth')
Route::get('/dashboard/petani/indikator-pertanian', [App\Http\Controllers\Web\Dashboard\IndikatorPertanianController::class, 'index'])->name('dashboard.indikator-pertanian');
Route::get('/dashboard/petani/indeks', [App\Http\Controllers\Web\Dashboard\IndeksPetaniController::class, 'index'])->name('dashboard.indeks-petani');
+ Route::get('/dashboard/petani/indeks/summary', [App\Http\Controllers\Web\Dashboard\IndeksPetaniController::class, 'summary'])->name('dashboard.indeks-petani.summary');
+ Route::get('/dashboard/petani/indeks/segmen', [App\Http\Controllers\Web\Dashboard\IndeksPetaniController::class, 'segmen'])->name('dashboard.indeks-petani.segmen');
+ Route::get('/dashboard/petani/indeks/segmen/komoditas', [App\Http\Controllers\Web\Dashboard\IndeksPetaniController::class, 'segmenByKomoditas'])->name('dashboard.indeks-petani.segmen.komoditas');
+ Route::get('/dashboard/petani/indeks/dimensi', [App\Http\Controllers\Web\Dashboard\IndeksPetaniController::class, 'dimensi'])->name('dashboard.indeks-petani.dimensi');
+ Route::get('/dashboard/petani/indeks/komponen', [App\Http\Controllers\Web\Dashboard\IndeksPetaniController::class, 'komponen'])->name('dashboard.indeks-petani.komponen');
+ Route::get('/dashboard/petani/indeks/map', [App\Http\Controllers\Web\Dashboard\IndeksPetaniController::class, 'map'])->name('dashboard.indeks-petani.map');
+ Route::get('/dashboard/petani/indeks/desa', [App\Http\Controllers\Web\Dashboard\IndeksPetaniController::class, 'desa'])->name('dashboard.indeks-petani.desa');
+ Route::get('/dashboard/petani/indeks/data', [App\Http\Controllers\Web\Dashboard\IndeksPetaniController::class, 'data'])->name('dashboard.indeks-petani.data');
Route::get('/dashboard/profil/petani/{id}',[App\Http\Controllers\Web\Produktivitas\ProfilPetaniController::class, 'index'])->name('dashboard.profil-petani');
From a3f7cb46694f0f2404b0fe7fd3726375d4f49d76 Mon Sep 17 00:00:00 2001
From: Irwan Cahyono
Date: Thu, 20 Aug 2026 01:52:05 +0700
Subject: [PATCH 3/4] filter segmen
---
.../Web/Dashboard/IndeksPetaniController.php | 80 +++++++++++++------
.../views/dashboard/indeks-petani.blade.php | 48 +++--------
2 files changed, 69 insertions(+), 59 deletions(-)
diff --git a/app/Http/Controllers/Web/Dashboard/IndeksPetaniController.php b/app/Http/Controllers/Web/Dashboard/IndeksPetaniController.php
index 2a90a62..a7ec362 100644
--- a/app/Http/Controllers/Web/Dashboard/IndeksPetaniController.php
+++ b/app/Http/Controllers/Web/Dashboard/IndeksPetaniController.php
@@ -66,9 +66,34 @@ class IndeksPetaniController extends Controller
->when($filters['kabupatenKota_id'], fn($q, $id) => $q->where('master_kecamatan.kabupaten_kota_id', $id))
->when($filters['kecamatan_id'], fn($q, $id) => $q->where('master_desa_kelurahan.kecamatan_id', $id))
->when($filters['desaKelurahan_id'], fn($q, $id) => $q->where('petani.desa_kelurahan_id', $id))
- ->when($filters['komoditas_id'], fn($q, $id) => $q->where('petani.komoditas_id', $id))
->whereIn('petani.komoditas_id', $komoditas);
+ if ($filters['segmen']) {
+ $skor->where(function ($q) use ($filters) {
+ match ($filters['segmen']) {
+ 'Penggerak' => $q->where('skor_kesiapan_adopsi', '>=', 4),
+ 'Perintis' => $q->where(function($q) {
+ $q->where('skor_kesiapan_adopsi', '>=', 3)
+ ->where('skor_kesiapan_adopsi', '<', 4);
+ }),
+ 'Pemerhati' => $q->where(function($q) {
+ $q->where('skor_kesiapan_adopsi', '>=', 2)
+ ->where('skor_kesiapan_adopsi', '<', 3);
+ }),
+ 'Pemula' => $q->where(function($q) {
+ $q->where('skor_kesiapan_adopsi', '>=', 1)
+ ->where('skor_kesiapan_adopsi', '<', 2);
+ }),
+ 'Belum Lengkap' => $q->where(function ($q) {
+ $q->whereNull('skor_kesiapan_adopsi')
+ ->orWhere('skor_kesiapan_adopsi', '<', 1);
+ }),
+
+ default => null,
+ };
+ });
+ }
+
return $skor;
}
@@ -596,28 +621,37 @@ class IndeksPetaniController extends Controller
->whereIn('komoditas_id', $komoditas->pluck('id'))
->get();
- $data = $daftarPetani->map(function ($item) use ($segmentStyles) {
- $segmen = $item->skor
- ? $item->segmen()
- : null;
- $style = $segmentStyles[$segmen]
- ?? ['color' => 'secondary'];
-
- return [
- 'id' => $item->id,
- 'nama' => $item->nama,
- 'desa' => $item->desaKelurahan?->nama,
- 'desa_kelurahan_id' => $item->desa_kelurahan_id,
- 'komoditas' => $item->komoditas?->nama,
- 'luas_lahan' => $item->lahans?->sum('luas_lahan') ?? 0,
- 'skor' => $item->skor
- ? $item->skor->skor_kesiapan_adopsi
- : null,
- 'segmen' => $segmen,
- 'color' => $style['color'],
- 'url' => route('dashboard.profil-petani', $item->id),
- ];
- });
+ $data = $daftarPetani
+ ->filter(function ($item) use ($filters) {
+ if (!$filters['segmen']) {
+ return true;
+ }
+ $segmen = $item->skor ? $item->segmen() : 'Belum Lengkap';
+ return $segmen === $filters['segmen'];
+ })
+ ->map(function ($item) use ($segmentStyles) {
+ $segmen = $item->skor
+ ? $item->segmen()
+ : null;
+ $style = $segmentStyles[$segmen]
+ ?? ['color' => 'secondary'];
+
+ return [
+ 'id' => $item->id,
+ 'nama' => $item->nama,
+ 'desa' => $item->desaKelurahan?->nama,
+ 'desa_kelurahan_id' => $item->desa_kelurahan_id,
+ 'komoditas' => $item->komoditas?->nama,
+ 'luas_lahan' => $item->lahans?->sum('luas_lahan') ?? 0,
+ 'skor' => $item->skor
+ ? $item->skor->skor_kesiapan_adopsi
+ : null,
+ 'segmen' => $segmen,
+ 'color' => $style['color'],
+ 'url' => route('dashboard.profil-petani', $item->id),
+ ];
+ })
+ ->values();
return response()->json($data);
}
diff --git a/resources/views/dashboard/indeks-petani.blade.php b/resources/views/dashboard/indeks-petani.blade.php
index dac6d49..3eba5a0 100644
--- a/resources/views/dashboard/indeks-petani.blade.php
+++ b/resources/views/dashboard/indeks-petani.blade.php
@@ -123,7 +123,16 @@ $provinsi = $desaKelurahan
-
+
+
+
-
- @foreach ($filterOptions as $filter)
-
-
+ @php
+ $filtersByKey = collect($filterOptions)->keyBy('key');
+ @endphp
- @if (!empty($filter['icon']))
-
@@ -685,6 +702,7 @@
const komoditasSelect = document.querySelector('[data-filter-key="komoditas"]');
const segmentasiSelect = document.querySelector('[data-filter-key="segmentasi"]');
const selectedKabupaten = kabupatenFilter?.dataset.filterValue || initialFilters.kabupaten || 'all';
+ const applyFilterButton = document.getElementById('indicator-apply-filter');
const resetButton = document.getElementById('indicator-reset-filter');
const exportButton = document.getElementById('indicator-export-data');
const chartInstances = {};
@@ -729,6 +747,10 @@
resetButton.disabled = isLoading;
}
+ if (applyFilterButton) {
+ applyFilterButton.disabled = isLoading;
+ }
+
if (exportButton) {
exportButton.disabled = isLoading;
}
@@ -970,11 +992,13 @@
filters.desa = 'all';
await loadDesaOptions('all');
}
-
- loadIndicatorData();
});
});
+ applyFilterButton?.addEventListener('click', function () {
+ loadIndicatorData();
+ });
+
resetButton?.addEventListener('click', async function () {
Object.assign(filters, {
kecamatan: 'all',