first(); $totalPetani = $petaniCounts->total; $petaniLakilaki = $petaniCounts->laki; $petaniPerempuan = $petaniCounts->perempuan; $totalKomoditas = Petani::whereNotNull('komoditas_id') ->distinct() ->count('komoditas_id'); $totalLuasLahan = Lahan::has('petani')->sum('luas_lahan'); $ratarataLuasLahan = $totalLuasLahan && $totalPetani ? $totalLuasLahan / $totalPetani : 0; $umurCounts = Petani::whereNotNull('tanggal_lahir')->selectRaw(" COUNT(*) FILTER (WHERE EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) < 30) as kurang_30, COUNT(*) FILTER (WHERE EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) BETWEEN 30 AND 39) as umur_30_39, COUNT(*) FILTER (WHERE EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) BETWEEN 40 AND 49) as umur_40_49, COUNT(*) FILTER (WHERE EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) BETWEEN 50 AND 59) as umur_50_59, COUNT(*) FILTER (WHERE EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) >= 60) as umur_60_keatas ")->first(); $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']); $luasLahanBuckets = DB::query()->fromSub( Lahan::query()->select('petani_id')->selectRaw('SUM(luas_lahan) as total_luas')->groupBy('petani_id'), 'agg' )->selectRaw(" COUNT(*) FILTER (WHERE total_luas < 5000) as kurang_05, COUNT(*) FILTER (WHERE total_luas >= 5000 AND total_luas <= 10000) as luas_05_1, COUNT(*) FILTER (WHERE total_luas > 10000 AND total_luas <= 20000) as luas_1_2, COUNT(*) FILTER (WHERE total_luas > 20000) as lebih_2 ")->first(); $luasLahan = [ 'kurang_05' => $luasLahanBuckets->kurang_05, '05_1' => $luasLahanBuckets->luas_05_1, '1_2' => $luasLahanBuckets->luas_1_2, 'lebih_2' => $luasLahanBuckets->lebih_2, ]; $penghasilanBuckets = DB::query()->fromSub( PendapatanKomoditas::query() ->join('sosial_ekonomi', 'sosial_ekonomi.id', '=', 'pendapatan_komoditas.sosial_ekonomi_id') ->whereNotNull('sosial_ekonomi.petani_id') ->groupBy('sosial_ekonomi.petani_id') ->selectRaw('SUM(pendapatan_komoditas.pendapatan) as total_pendapatan'), 'agg' )->selectRaw(" COUNT(*) FILTER (WHERE total_pendapatan < 1000000) as kurang_1, COUNT(*) FILTER (WHERE total_pendapatan >= 1000000 AND total_pendapatan <= 3000000) as p1_3, COUNT(*) FILTER (WHERE total_pendapatan > 3000000 AND total_pendapatan <= 5000000) as p3_5, COUNT(*) FILTER (WHERE total_pendapatan > 5000000 AND total_pendapatan <= 10000000) as p5_10, COUNT(*) FILTER (WHERE total_pendapatan > 10000000) as lebih_10 ")->first(); $penghasilan = [ 'kurang_1' => $penghasilanBuckets->kurang_1, '1_3' => $penghasilanBuckets->p1_3, '3_5' => $penghasilanBuckets->p3_5, '5_10' => $penghasilanBuckets->p5_10, 'lebih_10' => $penghasilanBuckets->lebih_10, ]; $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' => $umurCounts->kurang_30, '30_39' => $umurCounts->umur_30_39, '40_49' => $umurCounts->umur_40_49, '50_59' => $umurCounts->umur_50_59, '60_keatas' => $umurCounts->umur_60_keatas, ], 'pendidikan' => $pendidikan, 'komoditas_utama' => [ 'ids' => $komoditasUtama->pluck('id')->values(), 'labels' => $komoditasUtama->pluck('nama')->values(), 'series' => $komoditasUtama->pluck('petani_count')->map(fn ($v) => (int) $v)->values(), ], 'luas_lahan' => $luasLahan, 'penghasilan' => $penghasilan, ]; $daftarPetani = Petani::with(['komoditas']) ->withSum('lahans as total_luas_lahan', 'luas_lahan') ->orderBy('id') ->paginate(10); return view('dashboard.demografi-petani', compact('data', 'daftarPetani')); } public function data(Request $request) { $pendapatanSub = PendapatanKomoditas::query() ->join('sosial_ekonomi', 'sosial_ekonomi.id', '=', 'pendapatan_komoditas.sosial_ekonomi_id') ->whereColumn('sosial_ekonomi.petani_id', 'petani.id') ->selectRaw('SUM(pendapatan_komoditas.pendapatan)'); $query = Petani::with('komoditas') ->withSum('lahans as total_luas_lahan', 'luas_lahan') ->addSelect(['total_pendapatan' => $pendapatanSub]); if ($request->filled('search')) { $query->where('nama', 'ILIKE', "%{$request->search}%"); } 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')) { [$min, $max] = match ($request->penghasilan) { 'kurang_1' => [null, 999999], '1_3' => [1000000, 3000000], '3_5' => [3000001, 5000000], '5_10' => [5000001, 10000000], 'lebih_10' => [10000001, null], default => [null, null], }; $query->whereIn('id', function ($sub) use ($min, $max) { $sub->from('pendapatan_komoditas') ->join('sosial_ekonomi', 'sosial_ekonomi.id', '=', 'pendapatan_komoditas.sosial_ekonomi_id') ->whereNotNull('sosial_ekonomi.petani_id') ->groupBy('sosial_ekonomi.petani_id') ->select('sosial_ekonomi.petani_id') ->when($min !== null, fn ($q) => $q->havingRaw('SUM(pendapatan_komoditas.pendapatan) >= ?', [$min])) ->when($max !== null, fn ($q) => $q->havingRaw('SUM(pendapatan_komoditas.pendapatan) <= ?', [$max])); }); } 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) { $umur = $petani->tanggal_lahir ? \Carbon\Carbon::parse($petani->tanggal_lahir)->age : null; $pendidikanRaw = $petani->getRawOriginal('pendidikan_terakhir'); $pendapatan = $petani->total_pendapatan; $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->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(), ], ]); } }