diff --git a/app/Models/Pertanian/Petani.php b/app/Models/Pertanian/Petani.php index 8c0bd08..243cb89 100644 --- a/app/Models/Pertanian/Petani.php +++ b/app/Models/Pertanian/Petani.php @@ -6,7 +6,9 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasOne; +use Illuminate\Support\Facades\Schema; use Carbon\Carbon; use App\Models\Wilayah\DesaKelurahan; @@ -80,4 +82,194 @@ class Petani extends Model { return $this->hasOne(PraktikBudidaya::class, 'petani_id'); } + + public function praktikBudidaya(): HasOne + { + return $this->hasOne(PraktikBudidaya::class, 'petani_id')->latestOfMany(); + } + + public function lahans(): HasMany + { + return $this->hasMany(Lahan::class, 'petani_id'); + } + + public function sosialEkonomi(): HasOne + { + return $this->hasOne(SosialEkonomi::class, 'petani_id'); + } + + public function aksesPasar(): HasOne + { + return $this->hasOne(AksesPasar::class, 'petani_id'); + } + + public function skorLahanTanaman(): ?float + { + if (!Schema::hasTable('map_lahan')) { + return null; + } + + $lahan = $this->lahans()->get(); + + if ($lahan->isEmpty()) { + return null; + } + + $nilaiKondisi = $lahan + ->map(fn ($item) => match ($this->enumValue($item->kondisi_tanaman)) { + 'baik' => 5, + 'sedang' => 3, + 'buruk' => 1, + 'mati' => 0, + default => null, + }) + ->filter(fn ($value) => !is_null($value)); + + if ($nilaiKondisi->isEmpty()) { + return null; + } + + return round($nilaiKondisi->avg() * 0.1, 1); + } + + public function skorPraktikBudidaya(): ?float + { + if (!Schema::hasTable('praktik_budidaya')) { + return null; + } + + $praktikBudidaya = $this->praktikBudidaya()->first(); + + if (!$praktikBudidaya) { + return null; + } + + $nilai = collect([ + $praktikBudidaya->frekuensi_pemangkasan_utama, + $praktikBudidaya->pemberian_pupuk, + $praktikBudidaya->metode_penanganan_opt, + $praktikBudidaya->frekuensi_sanitasi_lahan, + $praktikBudidaya->penanganan_gulma, + $praktikBudidaya->kondisi_pengelolaan_air, + $praktikBudidaya->nilai_konservasi_tanah, + ])->filter(fn ($value) => !is_null($value) && $value !== ''); + + if ($nilai->isEmpty()) { + return null; + } + + return round($nilai->sum(fn ($value) => (int) $value) * 0.1, 1); + } + + public function skorPendidikan(): ?float + { + if (!$this->pendidikan_terakhir) { + return null; + } + + $nilai = match ($this->enumValue($this->pendidikan_terakhir)) { + Pendidikan::TIDAK_SEKOLAH->value => 1, + Pendidikan::SD->value => 2, + Pendidikan::SMP->value => 3, + Pendidikan::SMA->value, + Pendidikan::PESANTREN->value, + Pendidikan::LAINNYA->value => 4, + Pendidikan::DIPLOMA->value, + Pendidikan::SARJANA->value, + Pendidikan::MAGISTER->value, + Pendidikan::DOKTOR->value => 5, + default => null, + }; + + return is_null($nilai) ? null : round($nilai * 0.1, 1); + } + + public function skorSosialEkonomi(): ?float + { + if (!Schema::hasTable('sosial_ekonomi')) { + return null; + } + + $sosialEkonomi = $this->sosialEkonomi()->first(); + + if (!$sosialEkonomi) { + return null; + } + + $nilai = collect([ + $this->enumValue($sosialEkonomi->skor_periode_paceklik), + $this->enumValue($sosialEkonomi->skor_kemampuan_menabung), + $this->enumValue($sosialEkonomi->skor_kecukupan_penghasilan), + $this->enumValue($sosialEkonomi->skor_kejelasan_status_lahan), + ])->filter(fn ($value) => !is_null($value) && $value !== ''); + + if ($nilai->isEmpty()) { + return null; + } + + return round($nilai->sum(fn ($value) => (int) $value) * 0.2, 1); + } + + public function skorAksesPasar(): ?float + { + if (!Schema::hasTable('akses_pasar')) { + return null; + } + + $aksesPasar = $this->aksesPasar()->first(); + + if (!$aksesPasar) { + return null; + } + + $nilai = collect([ + $aksesPasar->skor_pengalaman, + $aksesPasar->skor_kesadaran_premium, + ])->filter(fn ($value) => !is_null($value) && $value !== ''); + + if ($nilai->isEmpty()) { + return null; + } + + return round($nilai->sum(fn ($value) => (int) $value) * 0.1, 1); + } + + public function skorSegmenPetani(): ?float + { + $nilai = collect([ + $this->skorLahanTanaman(), + $this->skorPraktikBudidaya(), + $this->skorPendidikan(), + $this->skorSosialEkonomi(), + $this->skorAksesPasar(), + ])->filter(fn ($value) => !is_null($value)); + + if ($nilai->isEmpty()) { + return null; + } + + return round($nilai->sum(), 1); + } + + public function segmenPetani(): ?string + { + $skor = $this->skorSegmenPetani(); + + if (is_null($skor)) { + return null; + } + + return match (true) { + $skor >= 4.0 => 'Penggerak', + $skor >= 3.0 => 'Perintis', + $skor >= 2.0 => 'Pemerhati', + $skor >= 1.0 => 'Pemula', + default => 'Belum tersegmentasi', + }; + } + + private function enumValue(mixed $value): mixed + { + return $value instanceof \BackedEnum ? $value->value : $value; + } } diff --git a/resources/views/produktivitas/petani/header.blade.php b/resources/views/produktivitas/petani/header.blade.php index 80236be..77046b6 100644 --- a/resources/views/produktivitas/petani/header.blade.php +++ b/resources/views/produktivitas/petani/header.blade.php @@ -23,6 +23,37 @@