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 @@
+ @php + $skorLahanTanaman = isset($petani) ? $petani->skorLahanTanaman() : null; + $skorPraktikBudidaya = isset($petani) ? $petani->skorPraktikBudidaya() : null; + $skorPendidikan = isset($petani) ? $petani->skorPendidikan() : null; + $skorSosialEkonomiSegmen = isset($petani) ? $petani->skorSosialEkonomi() : null; + $skorAksesPasarSegmen = isset($petani) ? $petani->skorAksesPasar() : null; + + $skorSegmenPetani = collect([ + $skorLahanTanaman, + $skorPraktikBudidaya, + $skorPendidikan, + $skorSosialEkonomiSegmen, + $skorAksesPasarSegmen, + ])->filter(fn ($value) => !is_null($value))->sum(); + + $skorSegmenPetani = $skorSegmenPetani > 0 ? round($skorSegmenPetani, 1) : null; + $segmenPetani = is_null($skorSegmenPetani) ? null : match (true) { + $skorSegmenPetani >= 4.0 => 'Penggerak', + $skorSegmenPetani >= 3.0 => 'Perintis', + $skorSegmenPetani >= 2.0 => 'Pemerhati', + $skorSegmenPetani >= 1.0 => 'Pemula', + default => 'Belum tersegmentasi', + }; + + $lahanPetani = isset($petani) && \Illuminate\Support\Facades\Schema::hasTable('map_lahan') + ? $petani->lahans()->get() + : collect(); + $totalLuasLahan = $lahanPetani->sum('luas_lahan'); + $totalTanaman = $lahanPetani->sum('jumlah_tanaman'); + $pendidikanLabel = isset($petani) ? $petani->pendidikan_terakhir?->label() : null; + @endphp
@@ -31,9 +62,13 @@

Segmen Petani

-
Penggerak
+
{{ $segmenPetani ?? '-' }}

- Skor 4.2 + @if(!is_null($skorSegmenPetani)) + Skor {{ number_format($skorSegmenPetani, 1) }} + @else + Belum isi + @endif

@@ -47,9 +82,19 @@

Lahan & Tanaman

-
12000 m2
+
+ @if($lahanPetani->isNotEmpty()) + {{ number_format($totalLuasLahan, 0, ',', '.') }} m2 + @else + - + @endif +

- 120 tanaman kopisehat + @if(!is_null($skorLahanTanaman)) + Skor {{ number_format($skorLahanTanaman, 1) }}{{ number_format($totalTanaman, 0, ',', '.') }} tanaman + @else + Belum isi + @endif

@@ -63,9 +108,19 @@

Praktik Budidaya

-
$5,345.43
+
+ @if(!is_null($skorPraktikBudidaya)) + {{ number_format(round($skorPraktikBudidaya), 0, ',', '.') }}% + @else + - + @endif +

- 5k orders+5.7% + @if(!is_null($skorPraktikBudidaya)) + Skor {{ number_format($skorPraktikBudidaya, 1) }} + @else + Belum isi + @endif

@@ -88,9 +143,13 @@

Pendidikan

-
$5,345.43
+
{{ $pendidikanLabel ?? '-' }}

- 5k orders+5.7% + @if(!is_null($skorPendidikan)) + Skor {{ number_format($skorPendidikan, 1) }} + @else + Belum isi + @endif

@@ -104,9 +163,37 @@

Sosial Ekonomi

-
$5,345.43
+ @php + $sosialEkonomi = isset($petani) ? $petani->sosialEkonomi : null; + $skorSosialEkonomi = null; + $skorSosialEkonomiBulat = null; + + if($sosialEkonomi) { + $enumValue = fn ($value) => $value instanceof \BackedEnum ? $value->value : $value; + + $periodePaceklik = (int) ($enumValue($sosialEkonomi->skor_periode_paceklik) ?? 0); + $kemampuanMenabung = (int) ($enumValue($sosialEkonomi->skor_kemampuan_menabung) ?? 0); + $kecukupanPenghasilan = (int) ($enumValue($sosialEkonomi->skor_kecukupan_penghasilan) ?? 0); + $kejelasanStatusLahan = (int) ($enumValue($sosialEkonomi->skor_kejelasan_status_lahan) ?? 0); + + $totalSkor = $periodePaceklik + $kemampuanMenabung + $kecukupanPenghasilan + $kejelasanStatusLahan; + $skorSosialEkonomi = ($totalSkor * 20) / 100; + $skorSosialEkonomiBulat = (int) round($skorSosialEkonomi); + } + @endphp +
+ @if($sosialEkonomi) + {{ number_format($skorSosialEkonomiBulat, 0, ',', '.') }}% + @else + - + @endif +

- 5k orders+5.7% + @if($sosialEkonomi) + Skor {{ number_format($skorSosialEkonomi, 1) }} + @else + Belum isi + @endif

@@ -120,9 +207,31 @@

Akses Pasar

-
$5,345.43
+ @php + $aksesPasar = isset($petani) ? $petani->aksesPasar : null; + $skorAksesPasar = null; + $skorAksesPasarBulat = null; + + if($aksesPasar) { + $totalSkorAksesPasar = (int) ($aksesPasar->skor_pengalaman ?? 0) + + (int) ($aksesPasar->skor_kesadaran_premium ?? 0); + $skorAksesPasar = ($totalSkorAksesPasar * 10) / 100; + $skorAksesPasarBulat = (int) round($skorAksesPasar); + } + @endphp +
+ @if($aksesPasar) + {{ number_format($skorAksesPasarBulat, 0, ',', '.') }}% + @else + - + @endif +

- 5k orders+5.7% + @if($aksesPasar) + Skor {{ number_format($skorAksesPasar, 1) }} + @else + Belum isi + @endif