diff --git a/app/Http/Controllers/Web/Produktivitas/ProfilPetaniController.php b/app/Http/Controllers/Web/Produktivitas/ProfilPetaniController.php index 791fba0..15df567 100644 --- a/app/Http/Controllers/Web/Produktivitas/ProfilPetaniController.php +++ b/app/Http/Controllers/Web/Produktivitas/ProfilPetaniController.php @@ -49,20 +49,43 @@ class ProfilPetaniController extends Controller $skorPetani = SkorPetani::where('petani_id', $id)->first(); $enumerator = Profile::where('user_id', $petani->created_by)->first(); $komoditasUtama = Komoditas::where('id', $petani->komoditas_id)->first(); - $lahan = Lahan::where('petani_id', $id )->get(); + $lahan = Lahan::query() + ->select(['id', 'petani_id', 'nama', 'path', 'luas_lahan', 'komoditas_id', 'desa_kelurahan_id']) + ->with([ + 'komoditas:id,nama', + 'desaKelurahan:id,nama,path,kecamatan_id', + 'desaKelurahan.kecamatan:id,nama,path', + ]) + ->where('petani_id', $id) + ->get(); $desaKelurahan = DesaKelurahan::with('kecamatan') ->where('id', $petani->desa_kelurahan_id) ->first(); $ktpMasked = $petani->ktp ? Str::mask($petani->ktp, '*', 4, -4) : '-'; - $profiling = $skorPetani ? $this->buildProfiling($skorPetani) : null; + $assessmentFields = [ + 'skor_kesiapan_adopsi', + 'skor_d2_sistem_praktik_budidaya', + 'skor_d4_sosial_ekonomi', + 'skor_d6_rantai_nilai_akses_pasar', + 'skor_komp_1_d4_k3_motivasi_kapasitas_adopsi', + 'skor_komp_2_d4_k2_ekonomi_rumah_tangga', + 'skor_komp_3_d2_praktik_budidaya_gap', + 'skor_komp_4_d4_k4_keterlibatan_kelembagaan', + 'skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan', + 'skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar', + ]; + $hasAssessment = $skorPetani !== null && collect($assessmentFields)->every( + fn (string $field) => $skorPetani->{$field} !== null + ); + $profiling = $hasAssessment ? $this->buildProfiling($skorPetani) : null; $tanaman = Tanaman::where('petani_id', $petani->id) ->where('komoditas_id', $petani->komoditas_id) ->first(); - if ($tanaman) { + if ($tanaman?->updated_at && $tanaman->umur_tanaman !== null) { $tahunInputTanaman = $tanaman->updated_at->year; $umurTanaman = (int) $tanaman->umur_tanaman; $tahunSekarang = now()->year; @@ -162,8 +185,8 @@ class ProfilPetaniController extends Controller $d4SosialEkonomi = null; - $terdaftarKelompok = $sosialEkonomi->terdaftar_kelompok_tani; - $peranKelompok = $sosialEkonomi->peran_dalam_kelompok; + $terdaftarKelompok = $sosialEkonomi?->terdaftar_kelompok_tani; + $peranKelompok = $sosialEkonomi?->peran_dalam_kelompok; if ($sosialEkonomi) { @@ -207,8 +230,8 @@ class ProfilPetaniController extends Controller 'icon' => 'tabler-minus', ], default => [ - 'label' => Str::headline($status), - 'short' => Str::headline($status), + 'label' => filled($status) ? Str::headline($status) : 'Belum diisi', + 'short' => filled($status) ? Str::headline($status) : 'Belum diisi', 'color' => 'secondary', 'icon' => 'tabler-help-circle', ], @@ -434,12 +457,61 @@ class ProfilPetaniController extends Controller ], ]; + // Report missing profile data without treating an unanswered field as zero. + $missingSections = []; + $identityFields = [ + 'nama' => 'Nama', 'ktp' => 'NIK', 'tanggal_lahir' => 'Tanggal lahir', + 'jenis_kelamin' => 'Jenis kelamin', 'pendidikan_terakhir' => 'Pendidikan terakhir', + 'status_perkawinan' => 'Status perkawinan', + ]; + foreach ($identityFields as $field => $label) { + if (blank($petani->{$field})) { + $missingSections[] = $label; + } + } + if (!$desaKelurahan?->nama || !$desaKelurahan?->kecamatan?->nama) { + $missingSections[] = 'Wilayah desa/kecamatan'; + } + if (!$komoditasUtama?->nama) { + $missingSections[] = 'Komoditas utama'; + } + if ($lahan->isEmpty()) { + $missingSections[] = 'Data lahan'; + } + if ($tahunTanam === null) { + $missingSections[] = 'Umur tanaman'; + } + if (!$praktikBudidaya || $indikatorOnFarm->contains(fn ($item) => $item['skor'] === null)) { + $missingSections[] = 'Praktik budidaya'; + } + if ($surveyPanen?->hasil_komoditas_utama_permusim === null) { + $missingSections[] = 'Survei panen'; + } + $socialFields = [ + 'jumlah_tanggungan', 'skor_kecukupan_penghasilan', 'skor_kemampuan_menabung', + 'status_kepemilikan_lahan', 'terdaftar_kelompok_tani', 'status_rekening_tabungan', + 'pengalaman_kredit_kebun', 'keterikatan_hutang_panen', 'praktik_ijon', + 'kebebasan_memilih_pembeli', + ]; + if (!$sosialEkonomi || collect($socialFields)->contains(fn ($field) => blank($sosialEkonomi->{$field}))) { + $missingSections[] = 'Sosial ekonomi'; + } + if (!$aksesPasar || blank($aksesPasar->saluran_terdahulu)) { + $missingSections[] = 'Akses pasar'; + } + if (!$hasAssessment) { + $missingSections[] = 'Penilaian kesiapan adopsi belum lengkap'; + } + $data = [ + 'missingSections' => $missingSections, + 'hasAssessment' => $hasAssessment, 'petani' => $petani, 'skorPetani' => $skorPetani, 'enumerator' => $enumerator, 'komoditasUtama' => $komoditasUtama, 'lahan' => $lahan, + 'farmerLandMap' => $this->farmerLandMapData($lahan), 'desaKelurahan' => $desaKelurahan, 'ktpMasked' => $ktpMasked, 'profiling' => $profiling, @@ -447,7 +519,6 @@ class ProfilPetaniController extends Controller 'umurTanaman' => $umurTanaman, 'surveyPanen' => $surveyPanen, 'praktikBudidaya' => $praktikBudidaya, - 'praktikBudidaya' => $praktikBudidaya, 'indikatorOnFarm' => $indikatorOnFarm, 'detailOnFarm' => $detailOnFarm, 'sosialEkonomi' => $sosialEkonomi, @@ -464,6 +535,35 @@ class ProfilPetaniController extends Controller return view('produktivitas.profil-petani.index', $data); } + private function farmerLandMapData(\Illuminate\Support\Collection $lands): array + { + $regions = ['desa' => [], 'kecamatan' => []]; + $plots = []; + + foreach ($lands as $land) { + $plot = [ + 'id' => $land->id, + 'nama' => $land->nama, + 'path' => $land->path, + 'luas' => $land->luas_lahan, + 'komoditas' => $land->komoditas?->nama, + ]; + foreach (['desa' => $land->desaKelurahan, 'kecamatan' => $land->desaKelurahan?->kecamatan] as $level => $region) { + $plot[$level . '_id'] = $region?->id; + if ($region && !isset($regions[$level][$region->id])) { + $regions[$level][$region->id] = [ + 'id' => $region->id, + 'nama' => $region->nama, + 'path' => $region->path, + ]; + } + } + $plots[] = $plot; + } + + return ['lands' => $plots, 'regions' => $regions]; + } + private function getScoreColor(?int $score): string { if ($score === null) { diff --git a/resources/views/produktivitas/petani/edit.blade.php b/resources/views/produktivitas/petani/edit.blade.php index 33764db..b4ed11c 100644 --- a/resources/views/produktivitas/petani/edit.blade.php +++ b/resources/views/produktivitas/petani/edit.blade.php @@ -13,6 +13,7 @@ @push('scripts') +@endpush @section('content')
Alamat: {{ isset($petani) ? $petani->alamat : 'Alamat' }}
-{{ isset($petani) ? $petani->desaKelurahan->nama : 'Desa/Kelurahan' }}, {{ $petani ? $petani->desaKelurahan->kecamatan->nama : 'Kecamatan' }}, {{ $petani ? $petani->desaKelurahan->kecamatan->kabupatenKota->nama : 'Kabupaten/Kota' }}, {{ $petani ? $petani->desaKelurahan->kecamatan->kabupatenKota->provinsi->nama : 'Provinsi' }}
+{{ isset($petani) ? $petani->desaKelurahan?->nama ?? 'Belum diisi' : 'Desa/Kelurahan' }}, {{ $petani ? $petani->desaKelurahan?->kecamatan?->nama ?? 'Belum diisi' : 'Kecamatan' }}, {{ $petani ? $petani->desaKelurahan?->kecamatan?->kabupatenKota?->nama ?? 'Belum diisi' : 'Kabupaten/Kota' }}, {{ $petani ? $petani->desaKelurahan?->kecamatan?->kabupatenKota?->provinsi?->nama ?? 'Belum diisi' : 'Provinsi' }}
@@ -116,7 +116,7 @@@if(!is_null($skorLahanTanaman)) - {{ number_format($totalTanaman, 0, ',', '.') }} tanaman {{ $petani?->komoditas->nama }} + {{ number_format($totalTanaman, 0, ',', '.') }} tanaman {{ $petani?->komoditas?->nama ?? 'Belum diisi' }} @else Belum terisi @endif diff --git a/resources/views/produktivitas/profil-petani/index.blade.php b/resources/views/produktivitas/profil-petani/index.blade.php index 118c13a..a2318e2 100644 --- a/resources/views/produktivitas/profil-petani/index.blade.php +++ b/resources/views/produktivitas/profil-petani/index.blade.php @@ -1,8 +1,80 @@ @extends('layout.main') -@push('styles') +@push('style') +