diff --git a/app/Http/Controllers/Web/Dashboard/DemografiPetaniController.php b/app/Http/Controllers/Web/Dashboard/DemografiPetaniController.php
new file mode 100644
index 0000000..062df77
--- /dev/null
+++ b/app/Http/Controllers/Web/Dashboard/DemografiPetaniController.php
@@ -0,0 +1,123 @@
+count();
+ $petaniPerempuan = Petani::where('jenis_kelamin', 0)->count();
+ $totalKomoditas = Petani::whereNotNull('komoditas_id')
+ ->distinct()
+ ->count('komoditas_id');
+ $totalLuasLahan = Lahan::has('petani')
+ ->sum('luas_lahan');
+ $ratarataLuasLahan = Lahan::has('petani')
+ ->avg('luas_lahan');
+
+ $umurKurang30 = Petani::whereNotNull('tanggal_lahir')->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) < 30")->count();
+ $umur30sampai39 = Petani::whereNotNull('tanggal_lahir')->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) BETWEEN 30 AND 39")->count();
+ $umur40sampai49 = Petani::whereNotNull('tanggal_lahir')->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) BETWEEN 40 AND 49")->count();
+ $umur50sampai59 = Petani::whereNotNull('tanggal_lahir')->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) BETWEEN 50 AND 59")->count();
+ $umur60keatas = Petani::whereNotNull('tanggal_lahir')->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) >= 60")->count();
+
+ $pendidikanCounts = Petani::whereNotNull('pendidikan_terakhir')
+ ->select('pendidikan_terakhir', DB::raw('COUNT(*) as total'))
+ ->groupBy('pendidikan_terakhir')
+ ->pluck('total', 'pendidikan_terakhir');
+
+ $pendidikan = [
+ 'tidak_sekolah' => (int) ($pendidikanCounts['01_tidak_sekolah'] ?? 0),
+ 'sd' => (int) ($pendidikanCounts['02_sd'] ?? 0),
+ 'smp' => (int) ($pendidikanCounts['03_smp'] ?? 0),
+ 'sma' => (int) ($pendidikanCounts['04_sma'] ?? 0),
+ 'diploma' => (int) ($pendidikanCounts['05_diploma'] ?? 0),
+
+ 's1_keatas' =>
+ (int) ($pendidikanCounts['06_sarjana'] ?? 0) +
+ (int) ($pendidikanCounts['07_magister'] ?? 0),
+ ];
+
+ $komoditasUtama = Komoditas::query()
+ ->whereHas('petani')
+ ->withCount('petani')
+ ->orderByDesc('petani_count')
+ ->get(['id', 'nama']);
+
+ $luasLahanPerPetani = Lahan::has('petani')
+ ->select('petani_id')
+ ->selectRaw('SUM(luas_lahan) as total_luas')
+ ->groupBy('petani_id')
+ ->get();
+
+ $luasLahan = [
+ 'kurang_05' => $luasLahanPerPetani->filter(fn ($item) => $item->total_luas < 5000)->count(),
+ '05_1' => $luasLahanPerPetani->filter(fn ($item) => $item->total_luas >= 5000 && $item->total_luas <= 10000)->count(),
+ '1_2' => $luasLahanPerPetani->filter(fn ($item) => $item->total_luas > 10000 && $item->total_luas <= 20000)->count(),
+ 'lebih_2' => $luasLahanPerPetani->filter(fn ($item) => $item->total_luas > 20000)->count(),
+ ];
+
+ $pendapatanPerPetani = PendapatanKomoditas::with('sosialEkonomi.petani')->get()
+ ->filter(fn ($item) => $item->sosialEkonomi?->petani)
+ ->groupBy(fn ($item) => $item->sosialEkonomi->petani_id)
+ ->map(fn ($items) => $items->sum('pendapatan'));
+
+ $penghasilan = [
+ 'kurang_1' => $pendapatanPerPetani->filter(fn ($value) => $value < 1000000)->count(),
+ '1_3' => $pendapatanPerPetani->filter(fn ($value) => $value >= 1000000 && $value <= 3000000)->count(),
+ '3_5' => $pendapatanPerPetani->filter(fn ($value) => $value > 3000000 && $value <= 5000000)->count(),
+ '5_10' => $pendapatanPerPetani->filter(fn ($value) => $value > 5000000 && $value <= 10000000)->count(),
+ 'lebih_10' => $pendapatanPerPetani->filter(fn ($value) => $value > 10000000)->count(),
+ ];
+
+ $data = [
+ 'total_petani' => $totalPetani,
+ 'petani_lakilaki' => $petaniLakilaki,
+ 'petani_perempuan' => $petaniPerempuan,
+ 'total_komoditas' => $totalKomoditas,
+ 'total_luas_lahan' => $totalLuasLahan,
+ 'ratarata_luas_lahan' => $ratarataLuasLahan,
+ 'kelompok_umur' => [
+ 'kurang_30' => $umurKurang30,
+ '30_39' => $umur30sampai39,
+ '40_49' => $umur40sampai49,
+ '50_59' => $umur50sampai59,
+ '60_keatas' => $umur60keatas,
+ ],
+ 'pendidikan' => $pendidikan,
+ 'komoditas_utama' => [
+ 'labels' => $komoditasUtama
+ ->pluck('nama')
+ ->values(),
+
+ 'series' => $komoditasUtama
+ ->pluck('petani_count')
+ ->map(fn ($value) => (int) $value)
+ ->values(),
+ ],
+ 'luas_lahan' => $luasLahan,
+ 'penghasilan' => $penghasilan,
+ ];
+
+ $daftarPetani = Petani::with([
+ 'komoditas'
+ ])
+ ->withSum('lahans as total_luas_lahan', 'luas_lahan')
+ ->orderBy('id')
+ ->paginate(10);
+ // dd($daftarPetani);
+ return view('dashboard.demografi-petani', compact('data', 'daftarPetani'));
+ }
+}
diff --git a/resources/views/dashboard/demografi-petani.blade.php b/resources/views/dashboard/demografi-petani.blade.php
new file mode 100644
index 0000000..3605593
--- /dev/null
+++ b/resources/views/dashboard/demografi-petani.blade.php
@@ -0,0 +1,1569 @@
+@extends('layout.main')
+
+@push('styles')
+
+