Optimize Demografi & Update Profil Petani
This commit is contained in:
@@ -5,7 +5,6 @@ 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;
|
||||
@@ -16,21 +15,30 @@ 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;
|
||||
$petaniCounts = Petani::selectRaw("
|
||||
COUNT(*) as total,
|
||||
COUNT(*) FILTER (WHERE jenis_kelamin = true) as laki,
|
||||
COUNT(*) FILTER (WHERE jenis_kelamin = false) as perempuan
|
||||
")->first();
|
||||
|
||||
$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();
|
||||
$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'))
|
||||
@@ -43,10 +51,7 @@ class DemografiPetaniController extends Controller
|
||||
'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),
|
||||
's1_keatas' => (int) ($pendidikanCounts['06_sarjana'] ?? 0) + (int) ($pendidikanCounts['07_magister'] ?? 0),
|
||||
];
|
||||
|
||||
$komoditasUtama = Komoditas::query()
|
||||
@@ -55,30 +60,44 @@ class DemografiPetaniController extends Controller
|
||||
->orderByDesc('petani_count')
|
||||
->get(['id', 'nama']);
|
||||
|
||||
$luasLahanPerPetani = Lahan::has('petani')
|
||||
->select('petani_id')
|
||||
->selectRaw('SUM(luas_lahan) as total_luas')
|
||||
->groupBy('petani_id')
|
||||
->get();
|
||||
$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' => $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(),
|
||||
'kurang_05' => $luasLahanBuckets->kurang_05,
|
||||
'05_1' => $luasLahanBuckets->luas_05_1,
|
||||
'1_2' => $luasLahanBuckets->luas_1_2,
|
||||
'lebih_2' => $luasLahanBuckets->lebih_2,
|
||||
];
|
||||
|
||||
$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'));
|
||||
$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' => $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(),
|
||||
'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 = [
|
||||
@@ -89,72 +108,62 @@ class DemografiPetaniController extends Controller
|
||||
'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,
|
||||
'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 ($value) => (int) $value)
|
||||
->values(),
|
||||
'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'
|
||||
])
|
||||
$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');
|
||||
$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')) {
|
||||
$search = $request->search;
|
||||
$query->where('nama', 'ILIKE', "%{$search}%" );
|
||||
$query->where('nama', 'ILIKE', "%{$request->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 );
|
||||
$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"),
|
||||
->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"),
|
||||
->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"),
|
||||
->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
|
||||
->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,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -172,33 +181,40 @@ class DemografiPetaniController extends Controller
|
||||
$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()
|
||||
};
|
||||
[$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', $filteredPendapatan->keys()->values()->all());
|
||||
$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' ),
|
||||
'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
|
||||
default => null,
|
||||
};
|
||||
$query->whereIn('id', $lahanQuery->pluck('petani_id'));
|
||||
}
|
||||
@@ -215,13 +231,10 @@ class DemografiPetaniController extends Controller
|
||||
'07_magister' => 'Magister',
|
||||
];
|
||||
|
||||
$rows = collect($daftarPetani->items())->map(function ($petani) use (
|
||||
$pendidikanLabels,
|
||||
$pendapatanPerPetani
|
||||
) {
|
||||
$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 = $pendapatanPerPetani->get($petani->id);
|
||||
$pendapatan = $petani->total_pendapatan;
|
||||
|
||||
$rentangPenghasilan = match (true) {
|
||||
$pendapatan === null => '-',
|
||||
@@ -233,28 +246,28 @@ class DemografiPetaniController extends Controller
|
||||
};
|
||||
|
||||
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,
|
||||
'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(),
|
||||
'current_page' => $daftarPetani->currentPage(),
|
||||
'last_page' => $daftarPetani->lastPage(),
|
||||
'per_page' => $daftarPetani->perPage(),
|
||||
'total' => $daftarPetani->total(),
|
||||
'from' => $daftarPetani->firstItem(),
|
||||
'to' => $daftarPetani->lastItem(),
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user