diff --git a/app/Http/Controllers/Web/Produktivitas/AksesPasarController.php b/app/Http/Controllers/Web/Produktivitas/AksesPasarController.php index 8eef63e..6556cfd 100644 --- a/app/Http/Controllers/Web/Produktivitas/AksesPasarController.php +++ b/app/Http/Controllers/Web/Produktivitas/AksesPasarController.php @@ -42,6 +42,7 @@ class AksesPasarController extends Controller $aksesPasarData = $this->aksesPasarPayload($validated); $aksesPasarData['uid'] = 'AKP-' . Str::uuid(); $aksesPasarData['created_by'] = Auth::id(); + $aksesPasarData['updated_by'] = Auth::id(); $aksesPasar = AksesPasar::create($aksesPasarData); @@ -59,7 +60,7 @@ class AksesPasarController extends Controller } } - public function update(Request $request, $id) + public function update(Request $request, $petaniId, $id) { $validated = $this->validateData($request); @@ -143,6 +144,38 @@ class AksesPasarController extends Controller 'harga_jual.*.harga_panen_terakhir' => ['nullable', 'numeric', 'min:0'], 'harga_jual.*.harga_tahun_lalu' => ['nullable', 'numeric', 'min:0'], 'harga_jual.*.harga_dua_tahun_lalu' => ['nullable', 'numeric', 'min:0'], + ], [ + 'petani_id.required' => 'Petani harus dipilih.', + 'petani_id.exists' => 'Petani tidak ditemukan.', + 'skor_pengalaman.integer' => 'Skor pengalaman harus berupa angka.', + 'skor_pengalaman.in' => 'Skor pengalaman tidak valid.', + 'alasan_berhenti.required' => 'Alasan berhenti harus diisi.', + 'alasan_berhenti.string' => 'Alasan berhenti harus berupa string.', + 'alasan_berhenti.max' => 'Alasan berhenti tidak boleh lebih dari 255 karakter.', + 'saluran_terdahulu.array' => 'Saluran terdahulu harus berupa array.', + 'saluran_terdahulu.*.string' => 'Saluran terdahulu harus berupa string.', + 'saluran_terdahulu.*.in' => 'Saluran terdahulu tidak valid.', + 'saluran_terdahulu_lainnya.required' => 'Saluran terdahulu lainnya harus diisi.', + 'saluran_terdahulu_lainnya.string' => 'Saluran terdahulu lainnya harus berupa string.', + 'saluran_terdahulu_lainnya.max' => 'Saluran terdahulu lainnya tidak boleh lebih dari 255 karakter.', + 'praktik_fermentasi.string' => 'Praktik fermentasi harus berupa string.', + 'praktik_fermentasi.in' => 'Praktik fermentasi tidak valid.', + 'proses_fermentasi.required' => 'Proses fermentasi harus diisi.', + 'proses_fermentasi.string' => 'Proses fermentasi harus berupa string.', + 'model_fermentasi_memungkinkan.required' => 'Model fermentasi memungkinkan harus diisi.', + 'model_fermentasi_memungkinkan.string' => 'Model fermentasi memungkinkan harus berupa string.', + 'skor_kesadaran_premium.integer' => 'Skor kesadaran premium harus berupa angka.', + 'skor_kesadaran_premium.in' => 'Skor kesadaran premium tidak valid.', + 'sumber_info_premium.string' => 'Sumber info premium harus berupa string.', + 'sumber_info_premium.max' => 'Sumber info premium tidak boleh lebih dari 255 karakter.', + 'harga_jual.array' => 'Harga jual harus berupa array.', + 'harga_jual.*.bentuk_produk.string' => 'Bentuk produk harus berupa string.', + 'harga_jual.*.harga_panen_terakhir.numeric' => 'Harga panen terakhir harus berupa angka.', + 'harga_jual.*.harga_tahun_lalu.numeric' => 'Harga tahun lalu harus berupa angka.', + 'harga_jual.*.harga_dua_tahun_lalu.numeric' => 'Harga dua tahun lalu harus berupa angka.', + 'harga_jual.*.harga_panen_terakhir.min' => 'Harga panen terakhir minimal 0.', + 'harga_jual.*.harga_tahun_lalu.min' => 'Harga tahun lalu minimal 0.', + 'harga_jual.*.harga_dua_tahun_lalu.min' => 'Harga dua tahun lalu minimal 0.', ]); } diff --git a/app/Models/Pertanian/AksesPasar.php b/app/Models/Pertanian/AksesPasar.php index dd1ea65..f455bd2 100644 --- a/app/Models/Pertanian/AksesPasar.php +++ b/app/Models/Pertanian/AksesPasar.php @@ -8,6 +8,10 @@ use Illuminate\Support\Str; use App\Models\User; use App\Models\Pertanian\Petani; use App\Models\Pertanian\SkorPetani; +use App\Enums\AksesPasar\PraktikFermentasi; +use App\Enums\AksesPasar\SaluranTerdahulu; +use App\Enums\AksesPasar\SkorPengalaman; +use App\Enums\AksesPasar\SkorKesadaranPremium; class AksesPasar extends Model { @@ -58,9 +62,9 @@ class AksesPasar extends Model ]); } $skor->update([ - 'skor_d6_k1_6_pengalaman_menjual_ke_saluran_berbeda' => $aksesPasar->skor_pengalaman->value, - 'skor_d6_k4_1_kesadaran_akses_pasar_premium' => $aksesPasar->skor_kesadaran_premium->value, - 'skor_d6_k5_1_hambatan_mutu' => $aksesPasar->skor_kepercayaan_responden->value + 'skor_d6_k1_6_pengalaman_menjual_ke_saluran_berbeda' => $aksesPasar->skor_pengalaman, + 'skor_d6_k4_1_kesadaran_akses_pasar_premium' => $aksesPasar->skor_kesadaran_premium, + 'skor_d6_k5_1_hambatan_mutu' => $aksesPasar->skor_kepercayaan_responden ]); }); } diff --git a/app/Models/Pertanian/Petani.php b/app/Models/Pertanian/Petani.php index be924c2..5a76df4 100644 --- a/app/Models/Pertanian/Petani.php +++ b/app/Models/Pertanian/Petani.php @@ -11,6 +11,9 @@ use App\Models\Pertanian\SurveyPanen; use App\Models\Pertanian\SurveyPelatihan; use App\Models\Pertanian\SurveyProduktivitas; use App\Models\Pertanian\SurveySertifikasi; +use App\Models\Pertanian\SkorPetani; +use App\Models\Pertanian\AksesPasar; +use App\Models\Pertanian\HargaJualPanen; use Carbon\Carbon; use Illuminate\Database\Eloquent\Model; @@ -153,6 +156,11 @@ class Petani extends Model return $this->hasOne(AksesPasar::class, 'petani_id'); } + public function hargaJualPanen(): HasMany + { + return $this->hasMany(HargaJualPanen::class, 'petani_id'); + } + public function skorLahanTanaman(): ?float { if (! Schema::hasTable('map_lahan')) { @@ -337,4 +345,27 @@ class Petani extends Model { return $value instanceof \BackedEnum ? $value->value : $value; } + + public function segmen(): ?string + { + $skor = $this->skor; + + if (!$skor) { + return null; + } + + if ($skor->skor_kesiapan_adopsi >= 4.0) { + return 'Penggerak'; + } elseif ($skor->skor_kesiapan_adopsi >= 3.0) { + return 'Perintis'; + } elseif ($skor->skor_kesiapan_adopsi >= 2.0) { + return 'Pemerhati'; + } elseif ($skor->skor_kesiapan_adopsi >= 1.0) { + return 'Pemula'; + } else { + return 'Belum tersegmentasi'; + } + + return 'Belum tersegmentasi'; + } } diff --git a/app/Models/Pertanian/SosialEkonomi.php b/app/Models/Pertanian/SosialEkonomi.php index a1aaa2d..4cb082e 100644 --- a/app/Models/Pertanian/SosialEkonomi.php +++ b/app/Models/Pertanian/SosialEkonomi.php @@ -205,14 +205,14 @@ class SosialEkonomi extends Model ]); } $skor->update([ - 'skor_d4_k5_1_kepemilikan_rekening' => $sosialEkonomi->status_rekening_tabungan->value, - 'skor_d4_k5_2_pengalaman_kredit_formal' => $sosialEkonomi->pengalaman_kredit_kebun->value, - 'skor_d4_k5_3_kepemilikan_aset_produktif' => $sosialEkonomi->kondisi_aset_produktif->value, - 'skor_d4_k5_4_akses_program_bantuan' => $sosialEkonomi->keterlibatan_program_keuangan_formal->value, + 'skor_d4_k5_1_kepemilikan_rekening' => $sosialEkonomi->status_rekening_tabungan?->value, + 'skor_d4_k5_2_pengalaman_kredit_formal' => $sosialEkonomi->pengalaman_kredit_kebun?->value, + 'skor_d4_k5_3_kepemilikan_aset_produktif' => $sosialEkonomi->kondisi_aset_produktif?->value, + 'skor_d4_k5_4_akses_program_bantuan' => $sosialEkonomi->keterlibatan_program_keuangan_formal?->value, - 'skor_d4_k6_3_keberadaan_hutang_terkait_panen' => $sosialEkonomi->keterikatan_hutang_panen->value, - 'skor_d4_k6_5a_praktik_ijon' => $sosialEkonomi->praktik_ijon->value, - 'skor_d4_k6_5b_kebebasan_memilih_pembeli' => $sosialEkonomi->kebebasan_memilih_pembeli->value, + 'skor_d4_k6_3_keberadaan_hutang_terkait_panen' => $sosialEkonomi->keterikatan_hutang_panen?->value, + 'skor_d4_k6_5a_praktik_ijon' => $sosialEkonomi->praktik_ijon?->value, + 'skor_d4_k6_5b_kebebasan_memilih_pembeli' => $sosialEkonomi->kebebasan_memilih_pembeli?->value, ]); }); } diff --git a/resources/views/produktivitas/petani/add.blade.php b/resources/views/produktivitas/petani/add.blade.php index f0a115f..c80fd01 100644 --- a/resources/views/produktivitas/petani/add.blade.php +++ b/resources/views/produktivitas/petani/add.blade.php @@ -221,7 +221,7 @@
Kembali - +
diff --git a/resources/views/produktivitas/petani/header.blade.php b/resources/views/produktivitas/petani/header.blade.php index 6beee79..c3e27b4 100644 --- a/resources/views/produktivitas/petani/header.blade.php +++ b/resources/views/produktivitas/petani/header.blade.php @@ -50,9 +50,10 @@ $lahanPetani = isset($petani) && \Illuminate\Support\Facades\Schema::hasTable('map_lahan') ? $petani->lahans()->get() : collect(); - $totalLuasLahan = $lahanPetani->sum('luas_lahan'); - $totalTanaman = $lahanPetani->sum('jumlah_tanaman'); + $totalLuasLahan = $petani ? $lahanPetani->where('komoditas_id', $petani->komoditas_id)->sum('luas_lahan') : 0; + $totalTanaman = $petani ? $lahanPetani->where('komoditas_id', $petani->komoditas_id)->sum('jumlah_tanaman') : 0; $pendidikanLabel = isset($petani) ? $petani->pendidikan_terakhir?->label() : null; + @endphp
@@ -62,12 +63,12 @@

Segmen Petani

-
{{ $segmenPetani ?? '-' }}
+
{{ $petani?->segmen() ?? '-' }}

- @if(!is_null($skorSegmenPetani)) - Skor {{ number_format($skorSegmenPetani, 1) }} + @if(!is_null($petani?->skor)) + Skor {{ number_format($petani?->skor->skor_kesiapan_adopsi, 1) }} @else - Belum isi + Belum terisi @endif

@@ -91,9 +92,9 @@

@if(!is_null($skorLahanTanaman)) - Skor {{ number_format($skorLahanTanaman, 1) }}{{ number_format($totalTanaman, 0, ',', '.') }} tanaman + {{ number_format($totalTanaman, 0, ',', '.') }} tanaman {{ $petani?->komoditas->nama }} @else - Belum isi + Belum terisi @endif

@@ -107,19 +108,15 @@
-

Praktik Budidaya

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

Pendidikan & Pelatihan

+
{{ $pendidikanLabel ?? '-' }}

- @if(!is_null($skorPraktikBudidaya)) - Skor {{ number_format($skorPraktikBudidaya, 1) }} + @if(!is_null($petani?->surveyPelatihan) && !is_null($petani?->surveySertifikasi)) + + {{ $petani?->surveyPelatihan->count() }} pelatihan, {{ $petani?->surveySertifikasi->count() }} sertifikasi + @else - Belum isi + Belum terisi @endif

@@ -141,12 +138,37 @@
+ @php + $skorPraktik = isset($petani?->skor) ? $petani?->skor->skor_d2_sistem_praktik_budidaya : null; + if (!is_null($skorPraktik)) { + if ($skorPraktik >= 4) { + $praktik = 'Menjalankan GAP (' . number_format($skorPraktik, 1, ',', '.') . ')'; + } else if ($skorPraktik >= 2) { + $praktik = 'Menjalankan sebagian GAP (' . number_format($skorPraktik, 1, ',', '.') . ')'; + } else { + $praktik = 'Belum menjalankan GAP (' . number_format($skorPraktik, 1, ',', '.') . ')'; + } + } + @endphp + @php + $produktivitas = isset($petani?->surveyProduktivitas) ? $petani?->surveyProduktivitas : null; + if (!is_null($produktivitas)) { + $produktivitas = $produktivitas->get()->where('komoditas_id', $petani->komoditas_id); + } + @endphp
-

Pendidikan

-
{{ $pendidikanLabel ?? '-' }}
+

Praktik Budidaya

+
+ @if($produktivitas && count($produktivitas) > 0) + {{ number_format($produktivitas->sum('kuantitas'), 0, ',', '.') }} + {{ $produktivitas->first()->satuan == 'ha_tahun' ? 'Ha/Tahun' : 'Pohon/Tahun' }} + @else + - + @endif +

- @if(!is_null($skorPendidikan)) - Skor {{ number_format($skorPendidikan, 1) }} + @if(!is_null($skorPraktik)) + {{ $praktik }} @else Belum isi @endif @@ -168,18 +190,38 @@ $skorSosialEkonomi = isset($petani) ? $petani->skorSosialEkonomi() : null; $skorSosialEkonomiBulat = is_null($skorSosialEkonomi) ? null : (int) round($skorSosialEkonomi); @endphp + @php + $pendapatanKomoditas = isset($sosialEkonomi) ? $sosialEkonomi->pendapatanKomoditas : null; + @endphp + @php + $ekonomi = null; + if ($sosialEkonomi?->status_rekening_tabungan && $sosialEkonomi?->pengalaman_kredit_kebun) { + if ($sosialEkonomi?->status_rekening_tabungan > 1 && $sosialEkonomi?->pengalaman_kredit_kebun > 3) { + $ekonomi = 'Memiliki rekening dan pengalaman kredit'; + } elseif ($sosialEkonomi?->status_rekening_tabungan > 1 && $sosialEkonomi?->pengalaman_kredit_kebun <= 3) { + $ekonomi = 'Memiliki rekening'; + } elseif ($sosialEkonomi?->status_rekening_tabungan == 1 && $sosialEkonomi?->pengalaman_kredit_kebun > 3) { + $ekonomi = 'Memiliki pengalaman kredit'; + } else { + $ekonomi = 'Tidak memiliki akses keuangan'; + } + } else { + $ekonomi = 'Tidak memiliki akses keuangan'; + } + @endphp

- @if(!is_null($skorSosialEkonomi)) - {{ number_format($skorSosialEkonomiBulat, 0, ',', '.') }}% + @if(!is_null($pendapatanKomoditas)) + {{ number_format($pendapatanKomoditas->sum('pendapatan'), 0, ',', '.') }} + pendapatan (Rp) @else - @endif

@if(!is_null($skorSosialEkonomi)) - Skor {{ number_format($skorSosialEkonomi, 1) }} + {{ $ekonomi }} @else - Belum isi + Belum terisi @endif

@@ -203,16 +245,40 @@ $skorAksesPasarBulat = (int) round($skorAksesPasar); } @endphp + @php + $hargaJual = isset($petani) ? $petani->hargaJualPanen : null; + if ($hargaJual) { + $hargaJual = $hargaJual->whereNotNull('bentuk_produk') + ->where('harga_panen_terakhir', '>', 0) + ->sortByDesc('id') + ->first(); + } + @endphp + @php + $pengalaman = null; + if(!is_null($aksesPasar?->skor_pengalaman) && !is_null($aksesPasar->skor_kesadaran_premium)){ + if($aksesPasar->skor_pengalaman > 1){ + if ($aksesPasar->skor_kesadaran_premium == 5) { + $pengalaman = 'Akses saluran lain dan pasar premium'; + } else { + $pengalaman = 'Akses saluran lain'; + } + } else { + $pengalaman = 'Belum akses'; + } + } + @endphp
- @if(!is_null($skorAksesPasar)) - {{ number_format($skorAksesPasarBulat, 0, ',', '.') }}% + @if(!is_null($hargaJual)) + {{ number_format($hargaJual->harga_panen_terakhir, 0, ',', '.') }} + {{ $hargaJual->bentuk_produk }} @else - @endif

- @if(!is_null($skorAksesPasar)) - Skor {{ number_format($skorAksesPasar, 1) }} + @if(!is_null($aksesPasar?->skor_pengalaman) && !is_null($aksesPasar->skor_kesadaran_premium)) + {{ $pengalaman }} @else Belum isi @endif