Update Dashboard Karakteristik Petani
This commit is contained in:
@@ -39,8 +39,29 @@ class DemografiPetaniController extends Controller
|
|||||||
$demografiData = $this->contentData($request);
|
$demografiData = $this->contentData($request);
|
||||||
$indeksData = app(IndeksPetaniController::class)->contentData($request);
|
$indeksData = app(IndeksPetaniController::class)->contentData($request);
|
||||||
|
|
||||||
|
$tableFilters = [
|
||||||
|
'gender' => ['Gender', ['1' => 'Laki-laki', '0' => 'Perempuan']],
|
||||||
|
'umur' => ['Kelompok Umur', ['kurang_30' => '< 30 tahun', '30_39' => '30–39 tahun', '40_49' => '40–49 tahun', '50_59' => '50–59 tahun', '60_keatas' => '≥ 60 tahun']],
|
||||||
|
'pendidikan' => ['Pendidikan', ['tidak_sekolah' => 'Tidak Sekolah', 'sd' => 'SD', 'smp' => 'SMP', 'sma' => 'SMA', 'diploma' => 'Diploma', 's1_keatas' => 'Sarjana ke atas']],
|
||||||
|
'jumlah_tanggungan' => ['Jumlah Tanggungan', ['0' => '0 orang', '1_2' => '1–2 orang', '3_4' => '3–4 orang', '5_keatas' => '≥ 5 orang']],
|
||||||
|
'kelompok_tani' => ['Keanggotaan Kelompok Tani', ['terdaftar' => 'Terdaftar', 'tidak_terdaftar' => 'Tidak Terdaftar', 'belum_terisi' => 'Belum Terisi']],
|
||||||
|
'komoditas' => ['Komoditas', $indeksData['komoditas']->pluck('nama', 'id')->all()],
|
||||||
|
'luas_lahan' => ['Luas Lahan', ['kurang_05' => '< 0,5 ha', '05_1' => '0,5–1 ha', '1_2' => '> 1–2 ha', 'lebih_2' => '> 2 ha']],
|
||||||
|
'status_kepemilikan_lahan' => ['Status Kepemilikan Lahan', ['sendiri' => 'Milik Pribadi', 'sewa' => 'Sewa', 'adat' => 'Tanah Adat']],
|
||||||
|
'penghasilan' => ['Rentang Pendapatan', ['kurang_1' => '< Rp1 juta', '1_3' => 'Rp1–3 juta', '3_5' => '> Rp3–5 juta', '5_10' => '> Rp5–10 juta', 'lebih_10' => '> Rp10 juta']],
|
||||||
|
];
|
||||||
|
|
||||||
return view('dashboard.karakteristik-petani', [
|
return view('dashboard.karakteristik-petani', [
|
||||||
'activeTab' => $activeTab,
|
'activeTab' => $activeTab,
|
||||||
|
'tableFilters' => $tableFilters,
|
||||||
|
'dashboardFilters' => $request->only([
|
||||||
|
'provinsi_id',
|
||||||
|
'kabupatenKota_id',
|
||||||
|
'kecamatan_id',
|
||||||
|
'desaKelurahan_id',
|
||||||
|
'komoditas_id',
|
||||||
|
'segmen',
|
||||||
|
]),
|
||||||
'indeksFilterAction' => route('dashboard.karakteristik-petani'),
|
'indeksFilterAction' => route('dashboard.karakteristik-petani'),
|
||||||
] + $demografiData + $indeksData);
|
] + $demografiData + $indeksData);
|
||||||
}
|
}
|
||||||
@@ -183,14 +204,11 @@ class DemografiPetaniController extends Controller
|
|||||||
->groupBy('sosial_ekonomi.petani_id')
|
->groupBy('sosial_ekonomi.petani_id')
|
||||||
->selectRaw('SUM(pendapatan_komoditas.pendapatan) as total_pendapatan');
|
->selectRaw('SUM(pendapatan_komoditas.pendapatan) as total_pendapatan');
|
||||||
|
|
||||||
$ratarataPenghasilan = (float) DB::query()
|
|
||||||
->fromSub(clone $pendapatanPerPetaniQuery, 'agg')
|
|
||||||
->avg('total_pendapatan');
|
|
||||||
|
|
||||||
$penghasilanBuckets = DB::query()->fromSub(
|
$penghasilanBuckets = DB::query()->fromSub(
|
||||||
clone $pendapatanPerPetaniQuery,
|
clone $pendapatanPerPetaniQuery,
|
||||||
'agg'
|
'agg'
|
||||||
)->selectRaw("
|
)->selectRaw("
|
||||||
|
AVG(total_pendapatan) as rata_rata,
|
||||||
COUNT(*) FILTER (WHERE total_pendapatan < 1000000) as kurang_1,
|
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 >= 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 > 3000000 AND total_pendapatan <= 5000000) as p3_5,
|
||||||
@@ -198,6 +216,8 @@ class DemografiPetaniController extends Controller
|
|||||||
COUNT(*) FILTER (WHERE total_pendapatan > 10000000) as lebih_10
|
COUNT(*) FILTER (WHERE total_pendapatan > 10000000) as lebih_10
|
||||||
")->first();
|
")->first();
|
||||||
|
|
||||||
|
$ratarataPenghasilan = (float) ($penghasilanBuckets->rata_rata ?? 0);
|
||||||
|
|
||||||
$penghasilan = [
|
$penghasilan = [
|
||||||
'kurang_1' => $penghasilanBuckets->kurang_1,
|
'kurang_1' => $penghasilanBuckets->kurang_1,
|
||||||
'1_3' => $penghasilanBuckets->p1_3,
|
'1_3' => $penghasilanBuckets->p1_3,
|
||||||
@@ -247,13 +267,7 @@ class DemografiPetaniController extends Controller
|
|||||||
'penghasilan' => $penghasilan,
|
'penghasilan' => $penghasilan,
|
||||||
];
|
];
|
||||||
|
|
||||||
$daftarPetani = Petani::with(['komoditas'])
|
return compact('data');
|
||||||
->whereIn('petani.id', clone $filteredPetaniIds)
|
|
||||||
->withSum('lahans as total_luas_lahan', 'luas_lahan')
|
|
||||||
->orderBy('id')
|
|
||||||
->paginate(10);
|
|
||||||
|
|
||||||
return compact('data', 'daftarPetani');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function filteredPetaniIdsQuery(Request $request)
|
private function filteredPetaniIdsQuery(Request $request)
|
||||||
|
|||||||
@@ -5,21 +5,14 @@ namespace App\Http\Controllers\Web\Dashboard;
|
|||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Gate;
|
use Illuminate\Support\Facades\Gate;
|
||||||
use Illuminate\Support\Facades\DB;
|
|
||||||
use Illuminate\Support\Facades\Auth;
|
|
||||||
use Illuminate\Http\RedirectResponse;
|
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Database\Eloquent\Builder;
|
||||||
|
|
||||||
use App\Models\Pertanian\Petani;
|
use App\Models\Pertanian\Petani;
|
||||||
use App\Models\Pertanian\Komoditas;
|
use App\Models\Pertanian\Komoditas;
|
||||||
use App\Models\Pertanian\Lahan;
|
use App\Models\Pertanian\Lahan;
|
||||||
use App\Models\Pertanian\Tanaman;
|
|
||||||
use App\Models\Pertanian\SkorPetani;
|
use App\Models\Pertanian\SkorPetani;
|
||||||
|
|
||||||
use App\Models\Wilayah\Provinsi;
|
|
||||||
use App\Models\Wilayah\KabupatenKota;
|
|
||||||
use App\Models\Wilayah\Kecamatan;
|
|
||||||
use App\Models\Wilayah\DesaKelurahan;
|
|
||||||
|
|
||||||
class IndeksPetaniController extends Controller
|
class IndeksPetaniController extends Controller
|
||||||
{
|
{
|
||||||
@@ -36,13 +29,13 @@ class IndeksPetaniController extends Controller
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
private function petaniQuery(array $filters): \Illuminate\Database\Eloquent\Builder
|
private function petaniQuery(array $filters): Builder
|
||||||
{
|
{
|
||||||
$petaniQuery = Petani::query()
|
$petaniQuery = Petani::query()
|
||||||
->join('master_desa_kelurahan', 'petani.desa_kelurahan_id', '=', 'master_desa_kelurahan.id')
|
->leftJoin('master_desa_kelurahan', 'petani.desa_kelurahan_id', '=', 'master_desa_kelurahan.id')
|
||||||
->join('master_kecamatan', 'master_desa_kelurahan.kecamatan_id', '=', 'master_kecamatan.id')
|
->leftJoin('master_kecamatan', 'master_desa_kelurahan.kecamatan_id', '=', 'master_kecamatan.id')
|
||||||
->join('master_kabupaten_kota', 'master_kecamatan.kabupaten_kota_id', '=', 'master_kabupaten_kota.id')
|
->leftJoin('master_kabupaten_kota', 'master_kecamatan.kabupaten_kota_id', '=', 'master_kabupaten_kota.id')
|
||||||
->join('master_provinsi', 'master_kabupaten_kota.provinsi_id', '=', 'master_provinsi.id')
|
->leftJoin('master_provinsi', 'master_kabupaten_kota.provinsi_id', '=', 'master_provinsi.id')
|
||||||
->whereNull('petani.deleted_at')
|
->whereNull('petani.deleted_at')
|
||||||
->when($filters['provinsi_id'], fn($q, $id) => $q->where('master_kabupaten_kota.provinsi_id', $id))
|
->when($filters['provinsi_id'], fn($q, $id) => $q->where('master_kabupaten_kota.provinsi_id', $id))
|
||||||
->when($filters['kabupatenKota_id'], fn($q, $id) => $q->where('master_kecamatan.kabupaten_kota_id', $id))
|
->when($filters['kabupatenKota_id'], fn($q, $id) => $q->where('master_kecamatan.kabupaten_kota_id', $id))
|
||||||
@@ -50,17 +43,21 @@ class IndeksPetaniController extends Controller
|
|||||||
->when($filters['desaKelurahan_id'], fn($q, $id) => $q->where('petani.desa_kelurahan_id', $id))
|
->when($filters['desaKelurahan_id'], fn($q, $id) => $q->where('petani.desa_kelurahan_id', $id))
|
||||||
->when($filters['komoditas_id'], fn($q, $id) => $q->where('petani.komoditas_id', $id));
|
->when($filters['komoditas_id'], fn($q, $id) => $q->where('petani.komoditas_id', $id));
|
||||||
|
|
||||||
|
if ($filters['segmen']) {
|
||||||
|
$petaniQuery->whereHas('skor', fn (Builder $query) => $this->applySegmentFilter($query, $filters['segmen']));
|
||||||
|
}
|
||||||
|
|
||||||
return $petaniQuery;
|
return $petaniQuery;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function skorPetaniQuery(array $filters, array $komoditas): \Illuminate\Database\Eloquent\Builder
|
private function skorPetaniQuery(array $filters, array $komoditas): Builder
|
||||||
{
|
{
|
||||||
$skor = SkorPetani::query()
|
$skor = SkorPetani::query()
|
||||||
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
||||||
->join('master_desa_kelurahan', 'petani.desa_kelurahan_id', '=', 'master_desa_kelurahan.id')
|
->leftJoin('master_desa_kelurahan', 'petani.desa_kelurahan_id', '=', 'master_desa_kelurahan.id')
|
||||||
->join('master_kecamatan', 'master_desa_kelurahan.kecamatan_id', '=', 'master_kecamatan.id')
|
->leftJoin('master_kecamatan', 'master_desa_kelurahan.kecamatan_id', '=', 'master_kecamatan.id')
|
||||||
->join('master_kabupaten_kota', 'master_kecamatan.kabupaten_kota_id', '=', 'master_kabupaten_kota.id')
|
->leftJoin('master_kabupaten_kota', 'master_kecamatan.kabupaten_kota_id', '=', 'master_kabupaten_kota.id')
|
||||||
->join('master_provinsi', 'master_kabupaten_kota.provinsi_id', '=', 'master_provinsi.id')
|
->leftJoin('master_provinsi', 'master_kabupaten_kota.provinsi_id', '=', 'master_provinsi.id')
|
||||||
->whereNull('petani.deleted_at')
|
->whereNull('petani.deleted_at')
|
||||||
->when($filters['provinsi_id'], fn($q, $id) => $q->where('master_kabupaten_kota.provinsi_id', $id))
|
->when($filters['provinsi_id'], fn($q, $id) => $q->where('master_kabupaten_kota.provinsi_id', $id))
|
||||||
->when($filters['kabupatenKota_id'], fn($q, $id) => $q->where('master_kecamatan.kabupaten_kota_id', $id))
|
->when($filters['kabupatenKota_id'], fn($q, $id) => $q->where('master_kecamatan.kabupaten_kota_id', $id))
|
||||||
@@ -68,33 +65,31 @@ class IndeksPetaniController extends Controller
|
|||||||
->when($filters['desaKelurahan_id'], fn($q, $id) => $q->where('petani.desa_kelurahan_id', $id))
|
->when($filters['desaKelurahan_id'], fn($q, $id) => $q->where('petani.desa_kelurahan_id', $id))
|
||||||
->whereIn('petani.komoditas_id', $komoditas);
|
->whereIn('petani.komoditas_id', $komoditas);
|
||||||
|
|
||||||
if ($filters['segmen']) {
|
return $this->applySegmentFilter($skor, $filters['segmen']);
|
||||||
$skor->where(function ($q) use ($filters) {
|
}
|
||||||
match ($filters['segmen']) {
|
|
||||||
'Penggerak' => $q->where('skor_kesiapan_adopsi', '>=', 4),
|
|
||||||
'Perintis' => $q->where(function($q) {
|
|
||||||
$q->where('skor_kesiapan_adopsi', '>=', 3)
|
|
||||||
->where('skor_kesiapan_adopsi', '<', 4);
|
|
||||||
}),
|
|
||||||
'Pemerhati' => $q->where(function($q) {
|
|
||||||
$q->where('skor_kesiapan_adopsi', '>=', 2)
|
|
||||||
->where('skor_kesiapan_adopsi', '<', 3);
|
|
||||||
}),
|
|
||||||
'Pemula' => $q->where(function($q) {
|
|
||||||
$q->where('skor_kesiapan_adopsi', '>=', 1)
|
|
||||||
->where('skor_kesiapan_adopsi', '<', 2);
|
|
||||||
}),
|
|
||||||
'Belum Lengkap' => $q->where(function ($q) {
|
|
||||||
$q->whereNull('skor_kesiapan_adopsi')
|
|
||||||
->orWhere('skor_kesiapan_adopsi', '<', 1);
|
|
||||||
}),
|
|
||||||
|
|
||||||
default => null,
|
private function applySegmentFilter(Builder $query, ?string $segment): Builder
|
||||||
};
|
{
|
||||||
});
|
$ranges = [
|
||||||
|
'Penggerak' => [4, null],
|
||||||
|
'Perintis' => [3, 4],
|
||||||
|
'Pemerhati' => [2, 3],
|
||||||
|
'Pemula' => [1, 2],
|
||||||
|
];
|
||||||
|
|
||||||
|
if (isset($ranges[$segment])) {
|
||||||
|
[$min, $max] = $ranges[$segment];
|
||||||
|
|
||||||
|
return $query->where('skor_kesiapan_adopsi', '>=', $min)
|
||||||
|
->when($max !== null, fn (Builder $query) => $query->where('skor_kesiapan_adopsi', '<', $max));
|
||||||
}
|
}
|
||||||
|
|
||||||
return $skor;
|
if ($segment === 'Belum Lengkap') {
|
||||||
|
$query->where(fn (Builder $query) => $query->whereNull('skor_kesiapan_adopsi')
|
||||||
|
->orWhere('skor_kesiapan_adopsi', '<', 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $query;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function index(Request $request)
|
public function index(Request $request)
|
||||||
@@ -112,21 +107,19 @@ class IndeksPetaniController extends Controller
|
|||||||
{
|
{
|
||||||
$filters = $this->filters($request);
|
$filters = $this->filters($request);
|
||||||
|
|
||||||
$title = 'Dashboard Profil Petani';
|
|
||||||
$segments = $this->segments();
|
$segments = $this->segments();
|
||||||
$colors = collect($segments)
|
$colors = collect($segments)
|
||||||
->pluck('color')
|
->pluck('color')
|
||||||
->map(fn($c) => "var(--bs-{$c})")
|
->map(fn($c) => "var(--bs-{$c})")
|
||||||
->values();
|
->values();
|
||||||
|
|
||||||
$komoditas = Komoditas::where('is_utama', true)->get();
|
$komoditas = Komoditas::where('is_utama', true)->get(['id', 'nama']);
|
||||||
$petaniQuery = $this->petaniQuery($filters);
|
$petaniQuery = $this->petaniQuery(array_fill_keys(array_keys($filters), null));
|
||||||
|
|
||||||
$desaKelurahan = $petaniQuery->clone()
|
$desaKelurahan = $petaniQuery->clone()
|
||||||
->selectRaw("
|
->selectRaw("
|
||||||
master_desa_kelurahan.id as desa_kelurahan_id,
|
master_desa_kelurahan.id as desa_kelurahan_id,
|
||||||
master_desa_kelurahan.nama as desa_kelurahan,
|
master_desa_kelurahan.nama as desa_kelurahan,
|
||||||
master_desa_kelurahan.path as path,
|
|
||||||
master_kecamatan.id as kecamatan_id,
|
master_kecamatan.id as kecamatan_id,
|
||||||
master_kecamatan.nama as kecamatan,
|
master_kecamatan.nama as kecamatan,
|
||||||
master_kabupaten_kota.id as kabupaten_id,
|
master_kabupaten_kota.id as kabupaten_id,
|
||||||
@@ -134,6 +127,7 @@ class IndeksPetaniController extends Controller
|
|||||||
master_provinsi.id as provinsi_id,
|
master_provinsi.id as provinsi_id,
|
||||||
master_provinsi.nama as provinsi
|
master_provinsi.nama as provinsi
|
||||||
")
|
")
|
||||||
|
->whereNotNull('master_provinsi.id')
|
||||||
->distinct()
|
->distinct()
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
@@ -164,7 +158,6 @@ class IndeksPetaniController extends Controller
|
|||||||
return [
|
return [
|
||||||
'id' => $desa->desa_kelurahan_id,
|
'id' => $desa->desa_kelurahan_id,
|
||||||
'nama' => $desa->desa_kelurahan,
|
'nama' => $desa->desa_kelurahan,
|
||||||
'path' => $desa->path,
|
|
||||||
];
|
];
|
||||||
})->values(),
|
})->values(),
|
||||||
];
|
];
|
||||||
@@ -191,23 +184,21 @@ class IndeksPetaniController extends Controller
|
|||||||
$petaniQuery = $this->petaniQuery($filters);
|
$petaniQuery = $this->petaniQuery($filters);
|
||||||
|
|
||||||
$komoditas = Komoditas::where('is_utama', true)
|
$komoditas = Komoditas::where('is_utama', true)
|
||||||
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get();
|
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get(['id', 'nama']);
|
||||||
|
|
||||||
$countKomoditas = $petaniQuery->clone()
|
$counts = $petaniQuery->clone()
|
||||||
->whereHas('komoditas', fn ($query) => $query->where('is_utama', true))
|
->selectRaw('COUNT(*) as petani')
|
||||||
->distinct()->count('komoditas_id');
|
->selectRaw('COUNT(DISTINCT petani.komoditas_id) FILTER (WHERE petani.komoditas_id IN (SELECT id FROM master_komoditas WHERE is_utama = true AND deleted_at IS NULL)) as komoditas')
|
||||||
|
->selectRaw('COUNT(DISTINCT petani.desa_kelurahan_id) FILTER (WHERE petani.komoditas_id IN (SELECT id FROM master_komoditas WHERE is_utama = true AND deleted_at IS NULL)) as desa')
|
||||||
|
->selectRaw('COUNT(DISTINCT master_kecamatan.id) FILTER (WHERE petani.komoditas_id IN (SELECT id FROM master_komoditas WHERE is_utama = true AND deleted_at IS NULL)) as kecamatan')
|
||||||
|
->first();
|
||||||
|
|
||||||
$filteredPetaniIds = $petaniQuery
|
$filteredPetaniIds = $petaniQuery->clone()->select('petani.id');
|
||||||
->clone()
|
$lahan = Lahan::query()
|
||||||
->select('petani.id')
|
->whereIn('petani_id', $filteredPetaniIds)
|
||||||
->distinct()
|
->whereIn('komoditas_id', $komoditas->pluck('id'))
|
||||||
->pluck('petani.id');
|
->selectRaw('COALESCE(SUM(luas_lahan), 0) as total, AVG(luas_lahan) as rata_rata')
|
||||||
|
->first();
|
||||||
$sumLahan = Lahan::has('petani')->whereIn('petani_id', $filteredPetaniIds)->whereIn('komoditas_id', $komoditas->pluck('id'))->sum('luas_lahan');
|
|
||||||
$avgLahan = Lahan::has('petani')->whereIn('petani_id', $filteredPetaniIds)->whereIn('komoditas_id', $komoditas->pluck('id'))->avg('luas_lahan');
|
|
||||||
|
|
||||||
$countDesa = $petaniQuery->clone()->whereIn('komoditas_id', $komoditas->pluck('id'))->distinct()->count('desa_kelurahan_id');
|
|
||||||
$countKecamatan = $petaniQuery->clone()->whereIn('komoditas_id', $komoditas->pluck('id'))->distinct()->count('master_kecamatan.id');
|
|
||||||
|
|
||||||
$skorQuery = $this->skorPetaniQuery($filters, $komoditas->pluck('id')->toArray());
|
$skorQuery = $this->skorPetaniQuery($filters, $komoditas->pluck('id')->toArray());
|
||||||
$avgSkor = $skorQuery->clone()->avg('skor_kesiapan_adopsi');
|
$avgSkor = $skorQuery->clone()->avg('skor_kesiapan_adopsi');
|
||||||
@@ -225,12 +216,12 @@ class IndeksPetaniController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'petani' => $petaniQuery->clone()->count(),
|
'petani' => (int) $counts->petani,
|
||||||
'komoditas' => $countKomoditas,
|
'komoditas' => (int) $counts->komoditas,
|
||||||
'sum_lahan' => $sumLahan,
|
'sum_lahan' => (float) $lahan->total,
|
||||||
'avg_lahan' => $avgLahan,
|
'avg_lahan' => (float) $lahan->rata_rata,
|
||||||
'desa' => $countDesa,
|
'desa' => (int) $counts->desa,
|
||||||
'kecamatan' => $countKecamatan,
|
'kecamatan' => (int) $counts->kecamatan,
|
||||||
'skor' => $avgSkor,
|
'skor' => $avgSkor,
|
||||||
'segmen' => $avgSegmen
|
'segmen' => $avgSegmen
|
||||||
]);
|
]);
|
||||||
@@ -289,7 +280,7 @@ class IndeksPetaniController extends Controller
|
|||||||
$case = $this->cases();
|
$case = $this->cases();
|
||||||
|
|
||||||
$komoditas = Komoditas::where('is_utama', true)
|
$komoditas = Komoditas::where('is_utama', true)
|
||||||
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get();
|
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get(['id', 'nama']);
|
||||||
|
|
||||||
$skorQuery = $this->skorPetaniQuery($filters, $komoditas->pluck('id')->toArray());
|
$skorQuery = $this->skorPetaniQuery($filters, $komoditas->pluck('id')->toArray());
|
||||||
|
|
||||||
@@ -333,7 +324,7 @@ class IndeksPetaniController extends Controller
|
|||||||
$case = $this->cases();
|
$case = $this->cases();
|
||||||
|
|
||||||
$komoditas = Komoditas::where('is_utama', true)
|
$komoditas = Komoditas::where('is_utama', true)
|
||||||
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get();
|
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get(['id', 'nama']);
|
||||||
|
|
||||||
$skorQuery = $this->skorPetaniQuery($filters, $komoditas->pluck('id')->toArray());
|
$skorQuery = $this->skorPetaniQuery($filters, $komoditas->pluck('id')->toArray());
|
||||||
|
|
||||||
@@ -375,7 +366,7 @@ class IndeksPetaniController extends Controller
|
|||||||
$filters = $this->filters($request);
|
$filters = $this->filters($request);
|
||||||
|
|
||||||
$komoditas = Komoditas::where('is_utama', true)
|
$komoditas = Komoditas::where('is_utama', true)
|
||||||
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get();
|
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get(['id', 'nama']);
|
||||||
|
|
||||||
$skorQuery = $this->skorPetaniQuery($filters, $komoditas->pluck('id')->toArray());
|
$skorQuery = $this->skorPetaniQuery($filters, $komoditas->pluck('id')->toArray());
|
||||||
|
|
||||||
@@ -400,7 +391,7 @@ class IndeksPetaniController extends Controller
|
|||||||
$filters = $this->filters($request);
|
$filters = $this->filters($request);
|
||||||
|
|
||||||
$komoditas = Komoditas::where('is_utama', true)
|
$komoditas = Komoditas::where('is_utama', true)
|
||||||
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get();
|
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get(['id', 'nama']);
|
||||||
|
|
||||||
$skorQuery = $this->skorPetaniQuery($filters, $komoditas->pluck('id')->toArray());
|
$skorQuery = $this->skorPetaniQuery($filters, $komoditas->pluck('id')->toArray());
|
||||||
|
|
||||||
@@ -425,17 +416,8 @@ class IndeksPetaniController extends Controller
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function map(Request $request): JsonResponse
|
private function villageData(array $filters, bool $includePath = true): \Illuminate\Support\Collection
|
||||||
{
|
{
|
||||||
$filters = $this->filters($request);
|
|
||||||
$segments = $this->segments();
|
|
||||||
|
|
||||||
$colors = collect($segments)
|
|
||||||
->pluck('color')
|
|
||||||
->map(fn($c) => "var(--bs-{$c})")
|
|
||||||
->values();
|
|
||||||
$segmentStyles = collect($segments)->keyBy('name');
|
|
||||||
|
|
||||||
$case = $this->cases();
|
$case = $this->cases();
|
||||||
|
|
||||||
$petaniQuery = $this->petaniQuery($filters);
|
$petaniQuery = $this->petaniQuery($filters);
|
||||||
@@ -444,7 +426,6 @@ class IndeksPetaniController extends Controller
|
|||||||
->selectRaw("
|
->selectRaw("
|
||||||
master_desa_kelurahan.id as desa_kelurahan_id,
|
master_desa_kelurahan.id as desa_kelurahan_id,
|
||||||
master_desa_kelurahan.nama as desa_kelurahan,
|
master_desa_kelurahan.nama as desa_kelurahan,
|
||||||
master_desa_kelurahan.path as path,
|
|
||||||
master_kecamatan.id as kecamatan_id,
|
master_kecamatan.id as kecamatan_id,
|
||||||
master_kecamatan.nama as kecamatan,
|
master_kecamatan.nama as kecamatan,
|
||||||
master_kabupaten_kota.id as kabupaten_id,
|
master_kabupaten_kota.id as kabupaten_id,
|
||||||
@@ -452,11 +433,12 @@ class IndeksPetaniController extends Controller
|
|||||||
master_provinsi.id as provinsi_id,
|
master_provinsi.id as provinsi_id,
|
||||||
master_provinsi.nama as provinsi
|
master_provinsi.nama as provinsi
|
||||||
")
|
")
|
||||||
|
->when($includePath, fn (Builder $query) => $query->addSelect('master_desa_kelurahan.path as path'))
|
||||||
->distinct()
|
->distinct()
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
$komoditas = Komoditas::where('is_utama', true)
|
$komoditas = Komoditas::where('is_utama', true)
|
||||||
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get();
|
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get(['id', 'nama']);
|
||||||
|
|
||||||
$skorQuery = $this->skorPetaniQuery($filters, $komoditas->pluck('id')->toArray());
|
$skorQuery = $this->skorPetaniQuery($filters, $komoditas->pluck('id')->toArray());
|
||||||
|
|
||||||
@@ -510,95 +492,18 @@ class IndeksPetaniController extends Controller
|
|||||||
return $desa;
|
return $desa;
|
||||||
})->filter()->values();
|
})->filter()->values();
|
||||||
|
|
||||||
return response()->json($mapDesaSegmentasi);
|
return $mapDesaSegmentasi;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function map(Request $request): JsonResponse
|
||||||
|
{
|
||||||
|
return response()->json($this->villageData($this->filters($request)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function desa(Request $request): JsonResponse
|
public function desa(Request $request): JsonResponse
|
||||||
{
|
{
|
||||||
$filters = $this->filters($request);
|
$segmentStyles = collect($this->segments())->keyBy('name');
|
||||||
$segments = $this->segments();
|
$mapDesaSegmentasi = $this->villageData($this->filters($request), false);
|
||||||
|
|
||||||
$colors = collect($segments)
|
|
||||||
->pluck('color')
|
|
||||||
->map(fn($c) => "var(--bs-{$c})")
|
|
||||||
->values();
|
|
||||||
$segmentStyles = collect($segments)->keyBy('name');
|
|
||||||
|
|
||||||
$case = $this->cases();
|
|
||||||
|
|
||||||
$petaniQuery = $this->petaniQuery($filters);
|
|
||||||
|
|
||||||
$desaKelurahan = $petaniQuery->clone()
|
|
||||||
->selectRaw("
|
|
||||||
master_desa_kelurahan.id as desa_kelurahan_id,
|
|
||||||
master_desa_kelurahan.nama as desa_kelurahan,
|
|
||||||
master_desa_kelurahan.path as path,
|
|
||||||
master_kecamatan.id as kecamatan_id,
|
|
||||||
master_kecamatan.nama as kecamatan,
|
|
||||||
master_kabupaten_kota.id as kabupaten_id,
|
|
||||||
master_kabupaten_kota.nama as kabupaten,
|
|
||||||
master_provinsi.id as provinsi_id,
|
|
||||||
master_provinsi.nama as provinsi
|
|
||||||
")
|
|
||||||
->distinct()
|
|
||||||
->get();
|
|
||||||
|
|
||||||
$komoditas = Komoditas::where('is_utama', true)
|
|
||||||
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get();
|
|
||||||
|
|
||||||
$skorQuery = $this->skorPetaniQuery($filters, $komoditas->pluck('id')->toArray());
|
|
||||||
|
|
||||||
$mapSegmentasi = $skorQuery->clone()
|
|
||||||
->selectRaw("petani.desa_kelurahan_id,
|
|
||||||
$case AS segmen,
|
|
||||||
COUNT(petani.id) AS total
|
|
||||||
")
|
|
||||||
->groupBy('petani.desa_kelurahan_id')
|
|
||||||
->groupByRaw($case)
|
|
||||||
->get();
|
|
||||||
|
|
||||||
$mapAvgSkorSegmentasi = $skorQuery->clone()
|
|
||||||
->selectRaw("petani.desa_kelurahan_id,
|
|
||||||
COUNT(petani.id) AS jumlah_petani,
|
|
||||||
avg(skor_kesiapan_adopsi) AS skor,
|
|
||||||
CASE
|
|
||||||
WHEN AVG(skor_kesiapan_adopsi) >= 4 THEN 'Penggerak'
|
|
||||||
WHEN AVG(skor_kesiapan_adopsi) >= 3 THEN 'Perintis'
|
|
||||||
WHEN AVG(skor_kesiapan_adopsi) >= 2 THEN 'Pemerhati'
|
|
||||||
WHEN AVG(skor_kesiapan_adopsi) >= 1 THEN 'Pemula'
|
|
||||||
ELSE 'Belum Lengkap'
|
|
||||||
END AS segmen
|
|
||||||
")
|
|
||||||
->groupBy('petani.desa_kelurahan_id')
|
|
||||||
->get();
|
|
||||||
|
|
||||||
$segmenDominan = $mapSegmentasi
|
|
||||||
->groupBy('desa_kelurahan_id')
|
|
||||||
->map(function ($items) {
|
|
||||||
return $items->sortByDesc('total')->first();
|
|
||||||
});
|
|
||||||
|
|
||||||
$mapAvgSkorSegmentasi->each(function ($item) use ($segmenDominan) {
|
|
||||||
$dominan = $segmenDominan->get($item->desa_kelurahan_id);
|
|
||||||
|
|
||||||
$item->segmen_dominan = $dominan?->segmen;
|
|
||||||
$item->jumlah_dominan = $dominan?->total;
|
|
||||||
});
|
|
||||||
|
|
||||||
$segmentasiByDesa = $mapAvgSkorSegmentasi->keyBy('desa_kelurahan_id');
|
|
||||||
$desaLookup = $desaKelurahan->keyBy('desa_kelurahan_id');
|
|
||||||
|
|
||||||
$mapDesaSegmentasi = $segmentasiByDesa->map(function ($segmentasi, $desaId) use ($desaLookup) {
|
|
||||||
$desa = $desaLookup->get($desaId);
|
|
||||||
|
|
||||||
if (!$desa) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$desa->segmentasi = $segmentasi;
|
|
||||||
|
|
||||||
return $desa;
|
|
||||||
})->filter()->values();
|
|
||||||
|
|
||||||
$rows = $mapDesaSegmentasi->map(function ($desa) use ($segmentStyles) {
|
$rows = $mapDesaSegmentasi->map(function ($desa) use ($segmentStyles) {
|
||||||
|
|
||||||
@@ -625,30 +530,21 @@ class IndeksPetaniController extends Controller
|
|||||||
$filters = $this->filters($request);
|
$filters = $this->filters($request);
|
||||||
$segments = $this->segments();
|
$segments = $this->segments();
|
||||||
|
|
||||||
$colors = collect($segments)
|
|
||||||
->pluck('color')
|
|
||||||
->map(fn($c) => "var(--bs-{$c})")
|
|
||||||
->values();
|
|
||||||
$segmentStyles = collect($segments)->keyBy('name');
|
$segmentStyles = collect($segments)->keyBy('name');
|
||||||
|
|
||||||
$petaniQuery = $this->petaniQuery($filters);
|
$petaniQuery = $this->petaniQuery($filters);
|
||||||
|
|
||||||
$komoditas = Komoditas::where('is_utama', true)
|
$komoditas = Komoditas::where('is_utama', true)
|
||||||
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get();
|
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get(['id', 'nama']);
|
||||||
|
|
||||||
$daftarPetani = $petaniQuery->clone()
|
$daftarPetani = $petaniQuery->clone()
|
||||||
->select('petani.*')
|
->select('petani.*')
|
||||||
|
->with(['desaKelurahan', 'komoditas', 'skor'])
|
||||||
|
->withSum('lahans as total_luas_lahan', 'luas_lahan')
|
||||||
->whereIn('komoditas_id', $komoditas->pluck('id'))
|
->whereIn('komoditas_id', $komoditas->pluck('id'))
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
$data = $daftarPetani
|
$data = $daftarPetani
|
||||||
->filter(function ($item) use ($filters) {
|
|
||||||
if (!$filters['segmen']) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
$segmen = $item->skor ? $item->segmen() : 'Belum Lengkap';
|
|
||||||
return $segmen === $filters['segmen'];
|
|
||||||
})
|
|
||||||
->map(function ($item) use ($segmentStyles) {
|
->map(function ($item) use ($segmentStyles) {
|
||||||
$segmen = $item->skor
|
$segmen = $item->skor
|
||||||
? $item->segmen()
|
? $item->segmen()
|
||||||
@@ -662,7 +558,7 @@ class IndeksPetaniController extends Controller
|
|||||||
'desa' => $item->desaKelurahan?->nama,
|
'desa' => $item->desaKelurahan?->nama,
|
||||||
'desa_kelurahan_id' => $item->desa_kelurahan_id,
|
'desa_kelurahan_id' => $item->desa_kelurahan_id,
|
||||||
'komoditas' => $item->komoditas?->nama,
|
'komoditas' => $item->komoditas?->nama,
|
||||||
'luas_lahan' => $item->lahans?->sum('luas_lahan') ?? 0,
|
'luas_lahan' => (float) ($item->total_luas_lahan ?? 0),
|
||||||
'skor' => $item->skor
|
'skor' => $item->skor
|
||||||
? $item->skor->skor_kesiapan_adopsi
|
? $item->skor->skor_kesiapan_adopsi
|
||||||
: null,
|
: null,
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user