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 = $totalLuasLahan && $totalPetani ? $totalLuasLahan / $totalPetani : 0; $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' => [ 'ids' => $komoditasUtama ->pluck('id') ->values(), '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')); } public function data(Request $request) { $query = Petani::with('komoditas')->withSum( 'lahans as total_luas_lahan', 'luas_lahan'); if ($request->filled('search')) { $search = $request->search; $query->where('nama', 'ILIKE', "%{$search}%" ); } $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')); if ($request->has('gender') && $request->gender !== '') { $query->where('jenis_kelamin', $request->gender ); } if ($request->filled('umur')) { match ($request->umur) { 'kurang_30' => $query->whereNotNull('tanggal_lahir') ->whereRaw("EXTRACT( YEAR FROM AGE( CURRENT_DATE, tanggal_lahir)) < 30"), '30_39' => $query->whereNotNull('tanggal_lahir') ->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) BETWEEN 30 AND 39"), '40_49' => $query->whereNotNull('tanggal_lahir') ->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) BETWEEN 40 AND 49"), '50_59' => $query->whereNotNull('tanggal_lahir') ->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) BETWEEN 50 AND 59"), '60_keatas' => $query ->whereNotNull('tanggal_lahir') ->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) >= 60"), default => null }; } if ($request->filled('pendidikan')) { $pendidikanMap = [ 'tidak_sekolah' => ['01_tidak_sekolah'], 'sd' => ['02_sd'], 'smp' => ['03_smp'], 'sma' => ['04_sma'], 'diploma' => ['05_diploma'], 's1_keatas' => ['06_sarjana', '07_magister'], ]; if (isset($pendidikanMap[$request->pendidikan])) { $query->whereIn('pendidikan_terakhir', $pendidikanMap[$request->pendidikan]); } } if ($request->filled('komoditas')) { $query->where('komoditas_id', $request->komoditas); } if ($request->filled('penghasilan')) { $filteredPendapatan = match ($request->penghasilan) { 'kurang_1' => $pendapatanPerPetani ->filter(fn ($value) => $value < 1000000 ), '1_3' => $pendapatanPerPetani->filter( fn ($value) => $value >= 1000000 && $value <= 3000000 ), '3_5' => $pendapatanPerPetani->filter(fn ($value) => $value > 3000000 && $value <= 5000000 ), '5_10' => $pendapatanPerPetani->filter(fn ($value) => $value > 5000000 && $value <= 10000000 ), 'lebih_10' => $pendapatanPerPetani->filter(fn ($value) => $value > 10000000 ), default => collect() }; $query->whereIn('id', $filteredPendapatan->keys()->values()->all()); } if ($request->filled('luas_lahan')) { $lahanQuery = Lahan::query()->select('petani_id')->groupBy('petani_id'); match ($request->luas_lahan) { 'kurang_05' => $lahanQuery->havingRaw('SUM(luas_lahan) < 5000' ), '05_1' => $lahanQuery->havingRaw('SUM(luas_lahan) >= 5000 AND SUM(luas_lahan) <= 10000' ), '1_2' => $lahanQuery->havingRaw('SUM(luas_lahan) > 10000 AND SUM(luas_lahan) <= 20000'), 'lebih_2' => $lahanQuery->havingRaw('SUM(luas_lahan) > 20000'), default => null }; $query->whereIn('id', $lahanQuery->pluck('petani_id')); } $daftarPetani = $query->orderBy('id')->paginate(10); $pendidikanLabels = [ '01_tidak_sekolah' => 'Tidak Sekolah', '02_sd' => 'SD', '03_smp' => 'SMP', '04_sma' => 'SMA', '05_diploma' => 'Diploma', '06_sarjana' => 'Sarjana', '07_magister' => 'Magister', ]; $rows = collect($daftarPetani->items())->map(function ($petani) use ( $pendidikanLabels, $pendapatanPerPetani ) { $umur = $petani->tanggal_lahir ? \Carbon\Carbon::parse($petani->tanggal_lahir)->age : null; $pendidikanRaw = $petani->getRawOriginal('pendidikan_terakhir'); $pendapatan = $pendapatanPerPetani->get($petani->id); $rentangPenghasilan = match (true) { $pendapatan === null => '-', $pendapatan < 1000000 => '< Rp1 juta', $pendapatan <= 3000000 => 'Rp1 - 3 juta', $pendapatan <= 5000000 => 'Rp3 - 5 juta', $pendapatan <= 10000000 => 'Rp5 - 10 juta', default => '> Rp10 juta', }; return [ 'id' => $petani->kode ?? $petani->id, 'nama' => $petani->nama ?? '-', 'jenis_kelamin' => $petani->jenis_kelamin, 'gender' => $petani->jenis_kelamin == 1 ? 'Laki-laki' : 'Perempuan', 'umur' => $umur, 'komoditas' => $petani->komoditas?->nama ?? '-', 'luas_lahan' => (float) ($petani->total_luas_lahan ?? 0 ), 'pendidikan' => $pendidikanLabels[$pendidikanRaw ] ?? '-', 'rentang_penghasilan' => $rentangPenghasilan, ]; }); return response()->json([ 'data' => $rows, 'pagination' => [ 'current_page' => $daftarPetani->currentPage(), 'last_page' => $daftarPetani->lastPage(), 'per_page' => $daftarPetani->perPage(), 'total' => $daftarPetani->total(), 'from' => $daftarPetani->firstItem(), 'to' => $daftarPetani->lastItem(), ], ]); } }