diff --git a/app/Http/Controllers/Web/Dashboard/DemografiPetaniController.php b/app/Http/Controllers/Web/Dashboard/DemografiPetaniController.php index ccf18ad..9226aff 100644 --- a/app/Http/Controllers/Web/Dashboard/DemografiPetaniController.php +++ b/app/Http/Controllers/Web/Dashboard/DemografiPetaniController.php @@ -39,8 +39,29 @@ class DemografiPetaniController extends Controller $demografiData = $this->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', [ 'activeTab' => $activeTab, + 'tableFilters' => $tableFilters, + 'dashboardFilters' => $request->only([ + 'provinsi_id', + 'kabupatenKota_id', + 'kecamatan_id', + 'desaKelurahan_id', + 'komoditas_id', + 'segmen', + ]), 'indeksFilterAction' => route('dashboard.karakteristik-petani'), ] + $demografiData + $indeksData); } @@ -183,14 +204,11 @@ class DemografiPetaniController extends Controller ->groupBy('sosial_ekonomi.petani_id') ->selectRaw('SUM(pendapatan_komoditas.pendapatan) as total_pendapatan'); - $ratarataPenghasilan = (float) DB::query() - ->fromSub(clone $pendapatanPerPetaniQuery, 'agg') - ->avg('total_pendapatan'); - $penghasilanBuckets = DB::query()->fromSub( clone $pendapatanPerPetaniQuery, 'agg' )->selectRaw(" + AVG(total_pendapatan) as rata_rata, 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, @@ -198,6 +216,8 @@ class DemografiPetaniController extends Controller COUNT(*) FILTER (WHERE total_pendapatan > 10000000) as lebih_10 ")->first(); + $ratarataPenghasilan = (float) ($penghasilanBuckets->rata_rata ?? 0); + $penghasilan = [ 'kurang_1' => $penghasilanBuckets->kurang_1, '1_3' => $penghasilanBuckets->p1_3, @@ -247,13 +267,7 @@ class DemografiPetaniController extends Controller 'penghasilan' => $penghasilan, ]; - $daftarPetani = Petani::with(['komoditas']) - ->whereIn('petani.id', clone $filteredPetaniIds) - ->withSum('lahans as total_luas_lahan', 'luas_lahan') - ->orderBy('id') - ->paginate(10); - - return compact('data', 'daftarPetani'); + return compact('data'); } private function filteredPetaniIdsQuery(Request $request) diff --git a/app/Http/Controllers/Web/Dashboard/IndeksPetaniController.php b/app/Http/Controllers/Web/Dashboard/IndeksPetaniController.php index 23463a1..36c5a80 100644 --- a/app/Http/Controllers/Web/Dashboard/IndeksPetaniController.php +++ b/app/Http/Controllers/Web/Dashboard/IndeksPetaniController.php @@ -5,21 +5,14 @@ namespace App\Http\Controllers\Web\Dashboard; use App\Http\Controllers\Controller; use Illuminate\Http\Request; 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\Database\Eloquent\Builder; use App\Models\Pertanian\Petani; use App\Models\Pertanian\Komoditas; use App\Models\Pertanian\Lahan; -use App\Models\Pertanian\Tanaman; 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 { @@ -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() - ->join('master_desa_kelurahan', 'petani.desa_kelurahan_id', '=', 'master_desa_kelurahan.id') - ->join('master_kecamatan', 'master_desa_kelurahan.kecamatan_id', '=', 'master_kecamatan.id') - ->join('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_desa_kelurahan', 'petani.desa_kelurahan_id', '=', 'master_desa_kelurahan.id') + ->leftJoin('master_kecamatan', 'master_desa_kelurahan.kecamatan_id', '=', 'master_kecamatan.id') + ->leftJoin('master_kabupaten_kota', 'master_kecamatan.kabupaten_kota_id', '=', 'master_kabupaten_kota.id') + ->leftJoin('master_provinsi', 'master_kabupaten_kota.provinsi_id', '=', 'master_provinsi.id') ->whereNull('petani.deleted_at') ->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)) @@ -50,17 +43,21 @@ class IndeksPetaniController extends Controller ->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)); + if ($filters['segmen']) { + $petaniQuery->whereHas('skor', fn (Builder $query) => $this->applySegmentFilter($query, $filters['segmen'])); + } + return $petaniQuery; } - private function skorPetaniQuery(array $filters, array $komoditas): \Illuminate\Database\Eloquent\Builder + private function skorPetaniQuery(array $filters, array $komoditas): Builder { $skor = SkorPetani::query() ->join('petani', 'petani_skor.petani_id', '=', 'petani.id') - ->join('master_desa_kelurahan', 'petani.desa_kelurahan_id', '=', 'master_desa_kelurahan.id') - ->join('master_kecamatan', 'master_desa_kelurahan.kecamatan_id', '=', 'master_kecamatan.id') - ->join('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_desa_kelurahan', 'petani.desa_kelurahan_id', '=', 'master_desa_kelurahan.id') + ->leftJoin('master_kecamatan', 'master_desa_kelurahan.kecamatan_id', '=', 'master_kecamatan.id') + ->leftJoin('master_kabupaten_kota', 'master_kecamatan.kabupaten_kota_id', '=', 'master_kabupaten_kota.id') + ->leftJoin('master_provinsi', 'master_kabupaten_kota.provinsi_id', '=', 'master_provinsi.id') ->whereNull('petani.deleted_at') ->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)) @@ -68,33 +65,31 @@ class IndeksPetaniController extends Controller ->when($filters['desaKelurahan_id'], fn($q, $id) => $q->where('petani.desa_kelurahan_id', $id)) ->whereIn('petani.komoditas_id', $komoditas); - if ($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); - }), + return $this->applySegmentFilter($skor, $filters['segmen']); + } - 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) @@ -112,21 +107,19 @@ class IndeksPetaniController extends Controller { $filters = $this->filters($request); - $title = 'Dashboard Profil Petani'; $segments = $this->segments(); $colors = collect($segments) ->pluck('color') ->map(fn($c) => "var(--bs-{$c})") ->values(); - $komoditas = Komoditas::where('is_utama', true)->get(); - $petaniQuery = $this->petaniQuery($filters); + $komoditas = Komoditas::where('is_utama', true)->get(['id', 'nama']); + $petaniQuery = $this->petaniQuery(array_fill_keys(array_keys($filters), null)); $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, @@ -134,6 +127,7 @@ class IndeksPetaniController extends Controller master_provinsi.id as provinsi_id, master_provinsi.nama as provinsi ") + ->whereNotNull('master_provinsi.id') ->distinct() ->get(); @@ -164,7 +158,6 @@ class IndeksPetaniController extends Controller return [ 'id' => $desa->desa_kelurahan_id, 'nama' => $desa->desa_kelurahan, - 'path' => $desa->path, ]; })->values(), ]; @@ -191,23 +184,21 @@ class IndeksPetaniController extends Controller $petaniQuery = $this->petaniQuery($filters); $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() - ->whereHas('komoditas', fn ($query) => $query->where('is_utama', true)) - ->distinct()->count('komoditas_id'); + $counts = $petaniQuery->clone() + ->selectRaw('COUNT(*) as petani') + ->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 - ->clone() - ->select('petani.id') - ->distinct() - ->pluck('petani.id'); - - $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'); + $filteredPetaniIds = $petaniQuery->clone()->select('petani.id'); + $lahan = Lahan::query() + ->whereIn('petani_id', $filteredPetaniIds) + ->whereIn('komoditas_id', $komoditas->pluck('id')) + ->selectRaw('COALESCE(SUM(luas_lahan), 0) as total, AVG(luas_lahan) as rata_rata') + ->first(); $skorQuery = $this->skorPetaniQuery($filters, $komoditas->pluck('id')->toArray()); $avgSkor = $skorQuery->clone()->avg('skor_kesiapan_adopsi'); @@ -225,12 +216,12 @@ class IndeksPetaniController extends Controller } return response()->json([ - 'petani' => $petaniQuery->clone()->count(), - 'komoditas' => $countKomoditas, - 'sum_lahan' => $sumLahan, - 'avg_lahan' => $avgLahan, - 'desa' => $countDesa, - 'kecamatan' => $countKecamatan, + 'petani' => (int) $counts->petani, + 'komoditas' => (int) $counts->komoditas, + 'sum_lahan' => (float) $lahan->total, + 'avg_lahan' => (float) $lahan->rata_rata, + 'desa' => (int) $counts->desa, + 'kecamatan' => (int) $counts->kecamatan, 'skor' => $avgSkor, 'segmen' => $avgSegmen ]); @@ -289,7 +280,7 @@ class IndeksPetaniController extends Controller $case = $this->cases(); $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()); @@ -333,7 +324,7 @@ class IndeksPetaniController extends Controller $case = $this->cases(); $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()); @@ -375,7 +366,7 @@ class IndeksPetaniController extends Controller $filters = $this->filters($request); $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()); @@ -400,7 +391,7 @@ class IndeksPetaniController extends Controller $filters = $this->filters($request); $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()); @@ -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(); $petaniQuery = $this->petaniQuery($filters); @@ -444,7 +426,6 @@ class IndeksPetaniController extends Controller ->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, @@ -452,11 +433,12 @@ class IndeksPetaniController extends Controller master_provinsi.id as provinsi_id, master_provinsi.nama as provinsi ") + ->when($includePath, fn (Builder $query) => $query->addSelect('master_desa_kelurahan.path as path')) ->distinct() ->get(); $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()); @@ -510,95 +492,18 @@ class IndeksPetaniController extends Controller return $desa; })->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 { - $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(); - - $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(); + $segmentStyles = collect($this->segments())->keyBy('name'); + $mapDesaSegmentasi = $this->villageData($this->filters($request), false); $rows = $mapDesaSegmentasi->map(function ($desa) use ($segmentStyles) { @@ -625,30 +530,21 @@ class IndeksPetaniController extends Controller $filters = $this->filters($request); $segments = $this->segments(); - $colors = collect($segments) - ->pluck('color') - ->map(fn($c) => "var(--bs-{$c})") - ->values(); $segmentStyles = collect($segments)->keyBy('name'); $petaniQuery = $this->petaniQuery($filters); $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() ->select('petani.*') + ->with(['desaKelurahan', 'komoditas', 'skor']) + ->withSum('lahans as total_luas_lahan', 'luas_lahan') ->whereIn('komoditas_id', $komoditas->pluck('id')) ->get(); $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) { $segmen = $item->skor ? $item->segmen() @@ -662,7 +558,7 @@ class IndeksPetaniController extends Controller 'desa' => $item->desaKelurahan?->nama, 'desa_kelurahan_id' => $item->desa_kelurahan_id, 'komoditas' => $item->komoditas?->nama, - 'luas_lahan' => $item->lahans?->sum('luas_lahan') ?? 0, + 'luas_lahan' => (float) ($item->total_luas_lahan ?? 0), 'skor' => $item->skor ? $item->skor->skor_kesiapan_adopsi : null, diff --git a/resources/views/dashboard/karakteristik-petani.blade.php b/resources/views/dashboard/karakteristik-petani.blade.php index 6d0c3f5..dd7f6f6 100644 --- a/resources/views/dashboard/karakteristik-petani.blade.php +++ b/resources/views/dashboard/karakteristik-petani.blade.php @@ -3,6 +3,24 @@ @push('style')