Files
database-pertani-web/app/Http/Controllers/Web/Dashboard/DemografiPetaniController.php
T
2026-08-12 17:49:24 +07:00

261 lines
12 KiB
PHP

<?php
namespace App\Http\Controllers\Web\Dashboard;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use App\Models\Pertanian\Petani;
use App\Models\Pertanian\Komoditas;
use App\Models\Pertanian\Lahan;
use App\Models\Pertanian\PendapatanKomoditas;
class DemografiPetaniController extends Controller
{
public function index(Request $request)
{
$totalPetani = Petani::count();
$petaniLakilaki = Petani::where('jenis_kelamin', 1)->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->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(),
],
]);
}
}