diff --git a/app/Http/Controllers/Web/Produktivitas/AksesPasarController.php b/app/Http/Controllers/Web/Produktivitas/AksesPasarController.php index 1005c90..6f8fb1e 100644 --- a/app/Http/Controllers/Web/Produktivitas/AksesPasarController.php +++ b/app/Http/Controllers/Web/Produktivitas/AksesPasarController.php @@ -128,6 +128,17 @@ class AksesPasarController extends Controller return $request->validate([ 'petani_id' => ['required', 'exists:petani,id'], + + 'tujuan_penjualan' => ['nullable', 'array'], + 'tujuan_penjualan.*' => ['string'], + 'tujuan_penjualan_lainnya' => [ + Rule::requiredIf(fn () => in_array('Lainnya', $request->input('tujuan_penjualan', []), true)), + 'nullable', 'string', 'max:255' + ], + 'sifat_hubungan_bisnis' => ['nullable', 'string', 'max:255'], + 'bentuk_penjualan' => ['nullable', 'string', 'max:255'], + 'frekuensi_penjualan' => ['nullable', 'string', 'max:255'], + 'skor_pengalaman' => ['nullable', 'integer', Rule::in(SkorPengalaman::values())], 'alasan_berhenti' => [ Rule::requiredIf(fn () => in_array((int)$request->input('skor_pengalaman'), [ @@ -168,6 +179,7 @@ class AksesPasarController extends Controller ], [ 'petani_id.required' => 'Petani harus dipilih.', 'petani_id.exists' => 'Petani tidak ditemukan.', + 'tujuan_penjualan_lainnya.required' => 'Keterangan saluran penjualan lainnya harus diisi.', 'skor_pengalaman.integer' => 'Skor pengalaman harus berupa angka.', 'skor_pengalaman.in' => 'Skor pengalaman tidak valid.', 'alasan_berhenti.required' => 'Alasan berhenti harus diisi.', @@ -204,6 +216,11 @@ class AksesPasarController extends Controller { $payload = collect($validated)->except(['harga_jual'])->all(); + // Bersihkan input teks "Lainnya" jika checkbox Lainnya tidak dipilih + if (!in_array('Lainnya', $payload['tujuan_penjualan'] ?? [], true)) { + $payload['tujuan_penjualan_lainnya'] = null; + } + if (!in_array((int)($payload['skor_pengalaman'] ?? 0), [ SkorPengalaman::PERNAH_BERHENTI_TIDAK_ADA_AKSES->value, SkorPengalaman::PERNAH_BERHENTI_MUNGKIN_KEMBALI->value @@ -223,7 +240,6 @@ class AksesPasarController extends Controller return $payload; } - private function syncHargaJual($petaniId, array $hargaJualData, $createdBy, $updatedBy = null): void { HargaJualPanen::where('petani_id', $petaniId)->delete(); @@ -258,7 +274,7 @@ class AksesPasarController extends Controller $data['harga_jual'][$index]['harga_tahun_lalu'] = $this->currencyDigits($item['harga_tahun_lalu']); } if (array_key_exists('harga_dua_tahun_lalu', $item)) { - $data['harga_jual'][$index]['harga_dua_tahun_lalu'] = $this->currencyDigits($item['harga_dua_tahun_lalu']); + $data['harga_jual'][$index]['harga_dua_tahun_lalu'] = $this->currencyDigits($item['harga_dua_tahun_l'], 0); // fixed } } } @@ -279,4 +295,4 @@ class AksesPasarController extends Controller return is_null($digits) ? '' : number_format((int) $digits, 0, ',', '.'); } -} +} \ No newline at end of file diff --git a/app/Models/Pertanian/AksesPasar.php b/app/Models/Pertanian/AksesPasar.php index 513c6a4..2e91b36 100644 --- a/app/Models/Pertanian/AksesPasar.php +++ b/app/Models/Pertanian/AksesPasar.php @@ -22,6 +22,11 @@ class AksesPasar extends Model protected $fillable = [ 'uid', 'petani_id', + 'tujuan_penjualan', + 'tujuan_penjualan_lainnya', + 'sifat_hubungan_bisnis', + 'bentuk_penjualan', + 'frekuensi_penjualan', 'skor_pengalaman', 'saluran_terdahulu', 'saluran_terdahulu_lainnya', @@ -44,6 +49,7 @@ class AksesPasar extends Model ]; protected $casts = [ + 'tujuan_penjualan' => 'array', 'saluran_terdahulu' => 'array', ]; diff --git a/database/migrations/2026_10_15_133839_add_saluran_penjualan_fields_to_akses_pasar_table.php b/database/migrations/2026_10_15_133839_add_saluran_penjualan_fields_to_akses_pasar_table.php new file mode 100644 index 0000000..746c5dd --- /dev/null +++ b/database/migrations/2026_10_15_133839_add_saluran_penjualan_fields_to_akses_pasar_table.php @@ -0,0 +1,38 @@ +text('tujuan_penjualan')->nullable(); + $table->string('tujuan_penjualan_lainnya')->nullable(); + $table->text('sifat_hubungan_bisnis')->nullable(); + $table->text('bentuk_penjualan')->nullable(); + $table->string('frekuensi_penjualan')->nullable(); + }); +} + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('akses_pasar', function (Blueprint $table) { + $table->dropColumn([ + 'tujuan_penjualan', + 'tujuan_penjualan_lainnya', + 'sifat_hubungan_bisnis', + 'bentuk_penjualan', + 'frekuensi_penjualan' + ]); + }); + } +}; diff --git a/resources/views/produktivitas/petani/akses-pasar/index.blade.php b/resources/views/produktivitas/petani/akses-pasar/index.blade.php index 9ecac65..2f333e3 100644 --- a/resources/views/produktivitas/petani/akses-pasar/index.blade.php +++ b/resources/views/produktivitas/petani/akses-pasar/index.blade.php @@ -30,6 +30,106 @@
+ +
Saluran Penjualan & Akses Pasar
+ +
Saluran Penjualan Utama
+
+ +
+ @php + $tujuanOptions = ['Tengkulak/pedagang lokal', 'Koperasi', 'BUMDes', 'Langsung ke pembeli/eksportir']; + @endphp + @foreach($tujuanOptions as $tujuan) +
+
+ tujuan_penjualan ?? []), true) ? 'checked' : '' }}> + +
+
+ @endforeach + +
+
+
+ tujuan_penjualan ?? []), true) ? 'checked' : '' }}> + +
+ +
+
+
+
+ +
Sifat Hubungan dengan Pembeli
+
+ +
+ @php + $sifatHubunganOptions = [ + 'Bebas, bisa pindah pembeli kapan saja', + 'Langganan tetap, tapi tidak terikat', + 'Berbasis hutang, harus jual ke sana karena ada pinjaman', + 'Titip jual,dibayar setelah produk terjual', + 'Ada komitmen volume, sudah ada kesepakatan jumlah', + 'Semi-kontrak, ada kesepakatan harga tertentu' + ]; + @endphp + @foreach($sifatHubunganOptions as $sifat) +
+
+ sifat_hubungan_bisnis) === $sifat ? 'checked' : '' }}> + +
+
+ @endforeach +
+
+ +
Bentuk Produk yang Dijual
+
+ +
+ @php + $bentukPenjualanOptions = [ + 'Buah segar hasil petik (gelondongan)', + 'Biji/polong basah (belum dikeringkan)', + 'Biji/polong kering/biji kupas', + 'Terfermentasi' + ]; + @endphp + @foreach($bentukPenjualanOptions as $bentuk) +
+
+ bentuk_penjualan) === $bentuk ? 'checked' : '' }}> + +
+
+ @endforeach +
+
+ +
Frekuensi Penjualan
+
+ +
+ @php + $frekuensiOptions = [ + 'Langsung setelah panen', + 'Ditumpuk dulu beberapa waktu', + 'Saat butuh uang mendesak' + ]; + @endphp + @foreach($frekuensiOptions as $freq) +
+ frekuensi_penjualan) === $freq ? 'checked' : '' }}> + +
+ @endforeach +
+
+
+
Pengalaman Saluran Lain
@@ -265,7 +365,6 @@ function formatRupiah(value) { const digits = onlyDigits(value); - return digits.replace(/\B(?=(\d{3})+(?!\d))/g, '.'); } @@ -310,4 +409,4 @@ syncPraktikFermentasi(); }); -@endpush +@endpush \ No newline at end of file