From 4aa0780802162827a0ea9631f0e2e1a138e8d222 Mon Sep 17 00:00:00 2001 From: Irwan Cahyono Date: Mon, 3 Aug 2026 13:08:01 +0700 Subject: [PATCH 1/2] dashboard profil petani komp 4 --- app/Http/Controllers/Web/Dashboard/ProfilPetaniController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Web/Dashboard/ProfilPetaniController.php b/app/Http/Controllers/Web/Dashboard/ProfilPetaniController.php index 68a6b17..e74952d 100644 --- a/app/Http/Controllers/Web/Dashboard/ProfilPetaniController.php +++ b/app/Http/Controllers/Web/Dashboard/ProfilPetaniController.php @@ -110,7 +110,7 @@ class ProfilPetaniController extends Controller avg(skor_komp_2_d4_k2_ekonomi_rumah_tangga) as skor_komp_2_d4_k2_ekonomi_rumah_tangga, avg(skor_komp_3_d2_praktik_budidaya_gap) as skor_komp_3_d2_praktik_budidaya_gap, avg(skor_komp_4_d4_k4_keterlibatan_kelembagaan) as skor_komp_4_d4_k4_keterlibatan_kelembagaan, - avg(skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan) as skor_komp_5_d4_k5_k6_akses_kebebasan_keuanga, + avg(skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan) as skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan, avg(skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar) as skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar") ->first(); From 8aed88a31ff17b0a36ca4066f904b6cb017e598e Mon Sep 17 00:00:00 2001 From: Irwan Cahyono Date: Wed, 5 Aug 2026 01:20:19 +0700 Subject: [PATCH 2/2] dashboard indeks petani --- .../Web/Dashboard/IndeksPetaniController.php | 125 ++++ .../views/dashboard/indeks-petani.blade.php | 580 ++++++++++++++++++ resources/views/dashboard/petani.blade.php | 2 +- routes/web.php | 1 + 4 files changed, 707 insertions(+), 1 deletion(-) create mode 100644 app/Http/Controllers/Web/Dashboard/IndeksPetaniController.php create mode 100644 resources/views/dashboard/indeks-petani.blade.php diff --git a/app/Http/Controllers/Web/Dashboard/IndeksPetaniController.php b/app/Http/Controllers/Web/Dashboard/IndeksPetaniController.php new file mode 100644 index 0000000..4918838 --- /dev/null +++ b/app/Http/Controllers/Web/Dashboard/IndeksPetaniController.php @@ -0,0 +1,125 @@ +get(); + + $petani = Petani::pluck('id'); + $lahan = Lahan::whereIn('petani_id', $petani)->get(); + + $case = " + CASE + WHEN skor_kesiapan_adopsi >= 4.0 THEN 'Penggerak' + WHEN skor_kesiapan_adopsi >= 3.0 THEN 'Perintis' + WHEN skor_kesiapan_adopsi >= 2.0 THEN 'Pemerhati' + WHEN skor_kesiapan_adopsi >= 1.0 THEN 'Pemula' + ELSE 'Belum Lengkap' + END + "; + + $countPetani = Petani::whereIn('id', $petani)->count(); + $countKomoditas = Petani::whereIn('id', $petani)->whereIn('komoditas_id', $komoditas->pluck('id'))->distinct()->count('komoditas_id'); + $sumLahan = Lahan::whereIn('petani_id', $petani)->whereIn('komoditas_id', $komoditas->pluck('id'))->sum('luas_lahan'); + $avgLahan = Lahan::whereIn('petani_id', $petani)->whereIn('komoditas_id', $komoditas->pluck('id'))->avg('luas_lahan'); + + $avgSkor = SkorPetani::query() + ->join('petani', 'petani_skor.petani_id', '=', 'petani.id') + ->whereIn('petani_id', $petani) + ->whereIn('petani.komoditas_id', $komoditas->pluck('id')) + ->avg('skor_kesiapan_adopsi'); + + if ($avgSkor >= 4.0) { + $avgSegmen = 'Penggerak'; + } elseif ($avgSkor >= 3.0) { + $avgSegmen = 'Perintis'; + } elseif ($avgSkor >= 2.0) { + $avgSegmen = 'Pemerhati'; + } elseif ($avgSkor >= 1.0) { + $avgSegmen = 'Pemula'; + } else { + $avgSegmen = 'Belum Lengkap'; + } + + $countDesa = Petani::whereIn('id', $petani)->whereIn('komoditas_id', $komoditas->pluck('id'))->distinct()->count('desa_kelurahan_id'); + $countKecamatan = Petani::whereIn('petani.id', $petani) + ->join('master_desa_kelurahan', 'petani.desa_kelurahan_id', '=', 'master_desa_kelurahan.id') + ->join('master_kecamatan', 'master_desa_kelurahan.kecamatan_id', '=', 'master_kecamatan.id') + ->whereIn('komoditas_id', $komoditas->pluck('id'))->distinct()->count('master_kecamatan.id'); + + $countSegmentasi = SkorPetani::selectRaw("$case AS segmen, COUNT(*) AS total") + ->whereIn('petani_id', $petani) + ->groupByRaw($case) + ->get(); + + $countSegmentasiByKomoditas = SkorPetani::query() + ->join('petani', 'petani_skor.petani_id', '=', 'petani.id') + ->selectRaw(" + petani.komoditas_id, + $case AS segmen, + COUNT(petani.id) AS total + ") + ->whereIn('petani_skor.petani_id', $petani) + ->groupBy('petani.komoditas_id') + ->groupByRaw($case) + ->get(); + + $avgDimensi = SkorPetani::query() + ->join('petani', 'petani_skor.petani_id', '=', 'petani.id') + ->whereIn('petani_id', $petani) + ->whereIn('petani.komoditas_id', $komoditas->pluck('id')) + ->selectRaw(" + avg(skor_d2_sistem_praktik_budidaya) as skor_d2_sistem_praktik_budidaya, + avg(skor_d4_sosial_ekonomi) as skor_d4_sosial_ekonomi, + avg(skor_d6_rantai_nilai_akses_pasar) as skor_d6_rantai_nilai_akses_pasar") + ->first(); + + $avgKomponen = SkorPetani::query() + ->join('petani', 'petani_skor.petani_id', '=', 'petani.id') + ->whereIn('petani_id', $petani) + ->whereIn('petani.komoditas_id', $komoditas->pluck('id')) + ->selectRaw("avg(skor_komp_1_d4_k3_motivasi_kapasitas_adopsi) as skor_komp_1_d4_k3_motivasi_kapasitas_adopsi, + avg(skor_komp_2_d4_k2_ekonomi_rumah_tangga) as skor_komp_2_d4_k2_ekonomi_rumah_tangga, + avg(skor_komp_3_d2_praktik_budidaya_gap) as skor_komp_3_d2_praktik_budidaya_gap, + avg(skor_komp_4_d4_k4_keterlibatan_kelembagaan) as skor_komp_4_d4_k4_keterlibatan_kelembagaan, + avg(skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan) as skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan, + avg(skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar) as skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar") + ->first(); + + return view('dashboard.indeks-petani', compact( + 'komoditas', + 'countPetani', + 'countKomoditas', + 'sumLahan', + 'avgLahan', + 'avgSkor', + 'avgSegmen', + 'countDesa', + 'countKecamatan', + 'countSegmentasi', + 'countSegmentasiByKomoditas', + 'avgDimensi', + 'avgKomponen' + )); + } +} \ No newline at end of file diff --git a/resources/views/dashboard/indeks-petani.blade.php b/resources/views/dashboard/indeks-petani.blade.php new file mode 100644 index 0000000..edb5c88 --- /dev/null +++ b/resources/views/dashboard/indeks-petani.blade.php @@ -0,0 +1,580 @@ +@extends('layout.main') + +@section('content') +@php +$segments = [ + [ + 'name' => 'Penggerak', + 'range' => '4.0 - 5.0', + 'icon' => 'tabler-crown', + 'color' => 'success', + ], + [ + 'name' => 'Perintis', + 'range' => '3.0 - 3.9', + 'icon' => 'tabler-flag', + 'color' => 'info', + ], + [ + 'name' => 'Pemerhati', + 'range' => '2.0 - 2.9', + 'icon' => 'tabler-eye', + 'color' => 'warning', + ], + [ + 'name' => 'Pemula', + 'range' => '1.0 - 1.9', + 'icon' => 'tabler-seedling', + 'color' => 'danger', + ], + ]; + +$colors = collect($segments) + ->pluck('color') + ->map(fn($c) => "var(--bs-{$c})") + ->values(); + +$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(); +@endphp +
+
+
+
+
+
+
+ + + +
+

{{ $countPetani }}

+
+

Total Petani

+

+ {{ $countKomoditas }} + komoditas utama +

+
+
+
+
+
+
+
+
+ + + +
+

{{ number_format($sumLahan, 2, ',', '.') }} ha

+
+

Total Luas Lahan

+

+ rata-rata + {{ number_format($avgLahan, 2, ',', '.') }} + ha/petani +

+
+
+
+
+
+
+
+
+ + + +
+

{{ number_format($avgSkor, 2, ',', '.') }}

+
+

Rata-rata Indeks Kesiapan Adopsi

+

+ Segmentasi: + {{ $avgSegmen }} +

+
+
+
+
+
+
+
+
+ + + +
+

{{ $countDesa }}

+
+

Jumlah Desa Sasaran

+

+ {{ $countKecamatan }} + kecamatan sasaran +

+
+
+
+
+ +
+
+
+
+
+
Distribusi Segmentasi Petani
+

untuk semua komoditas

+
+
+
+
+
+ + + + + + + + + + + @foreach ($segments as $segment) + @php + $total = $countSegmentasi->where('segmen', $segment['name'])->sum('total'); + $persen = $countPetani ? ($total / $countPetani) * 100 : 0; + @endphp + + + + + + + @endforeach + +
Petani%
+
+
+ +
+ + {{ $segment['name'] }} + +
+
{{ number_format($total) }}{{ number_format($persen, 2) }}%
+
+
+
+
+
+
+
+
+
Distribusi Segmentasi Petani
+

per komoditas

+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
Rata-rata Dimensi Kesiapan Adopsi
+

untuk semua komoditas

+
+
+
+
+
+
+ D1 Sistem & Praktik Budidaya +
+
+ D2 Sosial Ekonomi Rumah Tangga +
+
+ D3 Rantai Nilai & Akses Pasar +
+
+
+
+
+
+
+
+
+
Rata-rata Komponen Kesiapan Adopsi
+

untuk semua komoditas

+
+
+
+
+
+
+ K1 Motivasi & Kapasitas Adopsi +
+
+ K2 Kondisi Ekonomi Rumah Tangga +
+
+ K3 Praktik Budidaya & GAP +
+
+ K4 Keterlibatan Kelembagaan +
+
+ K5 Akses & Kebebasan Keuangan +
+
+ K6 Rantai Nilai & Akses Pasar +
+
+
+
+
+
+
+@endsection + + +@push('scripts') + + + +@endpush \ No newline at end of file diff --git a/resources/views/dashboard/petani.blade.php b/resources/views/dashboard/petani.blade.php index 520d1a4..c6c6e0a 100644 --- a/resources/views/dashboard/petani.blade.php +++ b/resources/views/dashboard/petani.blade.php @@ -43,7 +43,7 @@ $segments = [

{{ $totalPetani }}

-

Petani

+

Total Petani

{{ $petaniSummary->count('total') }} komoditas utama diff --git a/routes/web.php b/routes/web.php index 806e4cd..98bceb7 100644 --- a/routes/web.php +++ b/routes/web.php @@ -47,6 +47,7 @@ Route::middleware('auth') Route::get('/dashboard/petani', [App\Http\Controllers\Web\Dashboard\ProfilPetaniController::class, 'index'])->name('dashboard.petani'); Route::get('/dashboard/bumdes', [App\Http\Controllers\Web\Bumdes\PengurusBumdesController::class, 'index'])->name('dashboard.bumdes'); + Route::get('/dashboard/indeks-petani', [App\Http\Controllers\Web\Dashboard\IndeksPetaniController::class, 'index'])->name('dashboard.indeks-petani'); Route::get('/user-profile', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'index'])->name('userProfile.index'); Route::get('/user-profile/security', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'security'])->name('userProfile.security');