diff --git a/app/Http/Controllers/Web/Produktivitas/SosialEkonomiController.php b/app/Http/Controllers/Web/Produktivitas/SosialEkonomiController.php index 16e08f0..2db7af1 100644 --- a/app/Http/Controllers/Web/Produktivitas/SosialEkonomiController.php +++ b/app/Http/Controllers/Web/Produktivitas/SosialEkonomiController.php @@ -235,6 +235,8 @@ class SosialEkonomiController extends Controller private function validateData(Request $request, ?int $id = null): array { + $this->normalizeCurrencyInput($request); + $section = $request->input('form_section'); $rules = [ @@ -530,6 +532,51 @@ class SosialEkonomiController extends Controller return $request->validate($rules, $this->validationMessages(), $this->validationAttributes()); } + private function normalizeCurrencyInput(Request $request): void + { + $data = $request->all(); + $currencyFields = [ + 'total_estimasi_biaya_kebun_per_musim', + 'estimasi_tabungan_per_bulan', + 'total_hutang_rupiah', + ]; + + foreach ($currencyFields as $field) { + if (array_key_exists($field, $data)) { + $data[$field] = $this->currencyDigits($data[$field]); + } + } + + if (isset($data['pendapatan_komoditas']) && is_array($data['pendapatan_komoditas'])) { + foreach ($data['pendapatan_komoditas'] as $index => $item) { + if (is_array($item) && array_key_exists('pendapatan', $item)) { + $data['pendapatan_komoditas'][$index]['pendapatan'] = $this->currencyDigits($item['pendapatan']); + } + } + } + + if (isset($data['pendapatan_luar_pertanian']) && is_array($data['pendapatan_luar_pertanian'])) { + foreach ($data['pendapatan_luar_pertanian'] as $index => $item) { + if (is_array($item) && array_key_exists('estimasi_per_bulan', $item)) { + $data['pendapatan_luar_pertanian'][$index]['estimasi_per_bulan'] = $this->currencyDigits($item['estimasi_per_bulan']); + } + } + } + + $request->merge($data); + } + + private function currencyDigits(mixed $value): ?string + { + if (is_null($value) || $value === '') { + return null; + } + + $digits = preg_replace('/\D/', '', (string) $value); + + return $digits === '' ? null : $digits; + } + private function sosialEkonomiPayload(array $validated, ?SosialEkonomi $sosialEkonomi = null): array { $payload = collect($validated) diff --git a/resources/views/produktivitas/petani/sosial-ekonomi/edit.blade.php b/resources/views/produktivitas/petani/sosial-ekonomi/edit.blade.php index bf2944b..521563b 100644 --- a/resources/views/produktivitas/petani/sosial-ekonomi/edit.blade.php +++ b/resources/views/produktivitas/petani/sosial-ekonomi/edit.blade.php @@ -1062,6 +1062,49 @@ const pinjamanTokohAdatAda = @json($pinjamanTokohAdatAdaValue); const tekananJualSegeraAda = @json($tekananJualSegeraAdaValue); const kebebasanMemilihPembeliCukupBebas = Number(@json($kebebasanMemilihPembeliCukupBebasValue)); + const fieldExamples = { + jumlah_tanggungan: 'Contoh: 4', + anak_masih_sekolah: 'Contoh: 2', + yang_ikut_bekerja: 'Contoh: 2', + 'pendapatan_komoditas[][pendapatan]': 'Contoh: 3.500.000', + 'pendapatan_luar_pertanian[][jenis_pekerjaan]': 'Contoh: Buruh bangunan', + 'pendapatan_luar_pertanian[][estimasi_per_bulan]': 'Contoh: 1.500.000', + bulan_paceklik: 'Contoh: Januari-Maret', + sumber_penghasilan_paceklik: 'Contoh: Buruh harian', + total_estimasi_biaya_kebun_per_musim: 'Contoh: 2.500.000', + estimasi_tabungan_per_bulan: 'Contoh: 250.000', + alasan_kecukupan_penghasilan: 'Contoh: Cukup untuk makan dan biaya sekolah', + keterangan_sengketa: 'Contoh: Batas lahan belum disepakati', + pihak_membantu_konflik_nama: 'Contoh: Ketua adat setempat', + tahun_bantuan_konflik: 'Contoh: 2025', + alasan_mencoba_praktik_baru: 'Contoh: Ingin meningkatkan hasil panen', + hambatan_mengubah_cara_bertani: 'Contoh: Biaya dan tenaga terbatas', + contoh_pemahaman_mutu_harga: 'Contoh: Biji kering bersih dihargai lebih tinggi', + penyebab_harga_lebih_tinggi: 'Contoh: Kualitas lebih baik dan pembeli premium', + alasan_usaha_mutu_tambahan_harga: 'Contoh: Harga tambahan menutup biaya proses', + nama_lokasi_panutan: 'Contoh: Pak Anton, Dusun Wae', + harapan_program: 'Contoh: Bantuan pelatihan dan akses pembeli', + rencana_jangka_panjang: 'Contoh: Menambah tanaman dan memperbaiki kebun', + nama_kelompok_tani: 'Contoh: Kelompok Tani Maju Bersama', + lama_bergabung_kelompok_tahun: 'Contoh: 3', + topik_biasa_dibahas: 'Contoh: Pemupukan, hama, dan harga jual', + manfaat_lain_kartu_tani: 'Contoh: Lebih mudah membeli pupuk', + nama_bank: 'Contoh: BRI', + alasan_kredit_ditolak_lainnya: 'Contoh: Belum punya agunan', + jenis_aset_produktif_lainnya: 'Contoh: Mesin parut', + keterangan_kondisi_aset: 'Contoh: Pompa air masih berfungsi baik', + program_keuangan_formal_lainnya_nama: 'Contoh: Arisan kelompok', + 'detail_bantuan_ngo_perusahaan[][nama_lembaga]': 'Contoh: Yayasan Tani Sejahtera', + 'detail_bantuan_ngo_perusahaan[][bentuk_bantuan]': 'Contoh: Bibit dan pelatihan', + 'detail_bantuan_ngo_perusahaan[][frekuensi]': 'Contoh: 2', + 'detail_bantuan_ngo_perusahaan[][tahun_terakhir]': 'Contoh: 2025', + keterangan_pinjaman_tokoh_adat: 'Contoh: Pinjaman dibayar setelah panen', + total_hutang_rupiah: 'Contoh: 1.500.000', + total_hutang_setara_kg_panen: 'Contoh: 100', + penyebab_tekanan_jual_segera: 'Contoh: Butuh biaya sekolah', + alasan_tidak_bebas_memilih_pembeli: 'Contoh: Masih punya hutang pada pembeli', + alasan_minat_pembeli_harga_stabil: 'Contoh: Lebih aman untuk rencana biaya keluarga', + }; $('#status-kepemilikan-lahan, #pihak-membantu, #status-konflik, #pengetahuan-harga-hasil-olah, #pernah-jual-harga-lebih-tinggi, #usaha-mutu-tambahan-harga, #kedekatan-sesama-anggota, #status-kartu-tani, #bisa-beli-pupuk-bersubsidi, #minat-pembeli-stabil, .sosial-ekonomi-komoditas').select2(); @@ -1247,6 +1290,7 @@ $tbody.append($row); $row.find('.sosial-ekonomi-komoditas').select2(); + applySosialEkonomiExamples($row); syncKomoditasLainnyaOptions(); } @@ -1534,6 +1578,22 @@ return digits.replace(/\B(?=(\d{3})+(?!\d))/g, '.'); } + function normalizedFieldName(name) { + return String(name || '').replace(/\[\d+\]/g, '[]'); + } + + function applySosialEkonomiExamples($scope = $(document)) { + $scope.find('input:not([type="hidden"]):not([type="radio"]):not([type="checkbox"]), textarea').each(function () { + const $field = $(this); + const name = normalizedFieldName($field.attr('name')); + const example = fieldExamples[name] || ($field.hasClass('currency-input') ? 'Contoh: 150.000' : null); + + if (example) { + $field.attr('placeholder', example); + } + }); + } + function clearPendapatanRow($row) { $row.find('select').val('').trigger('change'); $row.find('input[type="text"], input[type="number"]').val(''); @@ -1567,6 +1627,9 @@ this.setSelectionRange(this.value.length, this.value.length); } }); + $('.currency-input').each(function () { + this.value = formatRupiah(this.value); + }); $('form').on('submit', function () { $(this).find('.currency-input').each(function () { this.value = onlyDigits(this.value); @@ -1587,6 +1650,7 @@ $('#total-hutang-tidak-bersedia').on('change', syncTotalHutangFields); $('input[name="tekanan_jual_segera"]').on('change', syncTekananJualFields); $('input[name="kebebasan_memilih_pembeli"]').on('change', syncKebebasanPembeliFields); + applySosialEkonomiExamples(); syncKomoditasLainnyaOptions(); setupAllPendapatanRows(); syncPihakMembantuFields(); diff --git a/resources/views/produktivitas/petani/sosial-ekonomi/index.blade.php b/resources/views/produktivitas/petani/sosial-ekonomi/index.blade.php index 93968fe..22fc8e3 100644 --- a/resources/views/produktivitas/petani/sosial-ekonomi/index.blade.php +++ b/resources/views/produktivitas/petani/sosial-ekonomi/index.blade.php @@ -1058,6 +1058,49 @@ const pinjamanTokohAdatAda = @json($pinjamanTokohAdatAdaValue); const tekananJualSegeraAda = @json($tekananJualSegeraAdaValue); const kebebasanMemilihPembeliCukupBebas = Number(@json($kebebasanMemilihPembeliCukupBebasValue)); + const fieldExamples = { + jumlah_tanggungan: 'Contoh: 4', + anak_masih_sekolah: 'Contoh: 2', + yang_ikut_bekerja: 'Contoh: 2', + 'pendapatan_komoditas[][pendapatan]': 'Contoh: 3.500.000', + 'pendapatan_luar_pertanian[][jenis_pekerjaan]': 'Contoh: Buruh bangunan', + 'pendapatan_luar_pertanian[][estimasi_per_bulan]': 'Contoh: 1.500.000', + bulan_paceklik: 'Contoh: Januari-Maret', + sumber_penghasilan_paceklik: 'Contoh: Buruh harian', + total_estimasi_biaya_kebun_per_musim: 'Contoh: 2.500.000', + estimasi_tabungan_per_bulan: 'Contoh: 250.000', + alasan_kecukupan_penghasilan: 'Contoh: Cukup untuk makan dan biaya sekolah', + keterangan_sengketa: 'Contoh: Batas lahan belum disepakati', + pihak_membantu_konflik_nama: 'Contoh: Ketua adat setempat', + tahun_bantuan_konflik: 'Contoh: 2025', + alasan_mencoba_praktik_baru: 'Contoh: Ingin meningkatkan hasil panen', + hambatan_mengubah_cara_bertani: 'Contoh: Biaya dan tenaga terbatas', + contoh_pemahaman_mutu_harga: 'Contoh: Biji kering bersih dihargai lebih tinggi', + penyebab_harga_lebih_tinggi: 'Contoh: Kualitas lebih baik dan pembeli premium', + alasan_usaha_mutu_tambahan_harga: 'Contoh: Harga tambahan menutup biaya proses', + nama_lokasi_panutan: 'Contoh: Pak Anton, Dusun Wae', + harapan_program: 'Contoh: Bantuan pelatihan dan akses pembeli', + rencana_jangka_panjang: 'Contoh: Menambah tanaman dan memperbaiki kebun', + nama_kelompok_tani: 'Contoh: Kelompok Tani Maju Bersama', + lama_bergabung_kelompok_tahun: 'Contoh: 3', + topik_biasa_dibahas: 'Contoh: Pemupukan, hama, dan harga jual', + manfaat_lain_kartu_tani: 'Contoh: Lebih mudah membeli pupuk', + nama_bank: 'Contoh: BRI', + alasan_kredit_ditolak_lainnya: 'Contoh: Belum punya agunan', + jenis_aset_produktif_lainnya: 'Contoh: Mesin parut', + keterangan_kondisi_aset: 'Contoh: Pompa air masih berfungsi baik', + program_keuangan_formal_lainnya_nama: 'Contoh: Arisan kelompok', + 'detail_bantuan_ngo_perusahaan[][nama_lembaga]': 'Contoh: Yayasan Tani Sejahtera', + 'detail_bantuan_ngo_perusahaan[][bentuk_bantuan]': 'Contoh: Bibit dan pelatihan', + 'detail_bantuan_ngo_perusahaan[][frekuensi]': 'Contoh: 2', + 'detail_bantuan_ngo_perusahaan[][tahun_terakhir]': 'Contoh: 2025', + keterangan_pinjaman_tokoh_adat: 'Contoh: Pinjaman dibayar setelah panen', + total_hutang_rupiah: 'Contoh: 1.500.000', + total_hutang_setara_kg_panen: 'Contoh: 100', + penyebab_tekanan_jual_segera: 'Contoh: Butuh biaya sekolah', + alasan_tidak_bebas_memilih_pembeli: 'Contoh: Masih punya hutang pada pembeli', + alasan_minat_pembeli_harga_stabil: 'Contoh: Lebih aman untuk rencana biaya keluarga', + }; $('#status-kepemilikan-lahan, #pihak-membantu, #status-konflik, #pengetahuan-harga-hasil-olah, #pernah-jual-harga-lebih-tinggi, #usaha-mutu-tambahan-harga, #kedekatan-sesama-anggota, #status-kartu-tani, #bisa-beli-pupuk-bersubsidi, #minat-pembeli-stabil, .sosial-ekonomi-komoditas').select2(); @@ -1243,6 +1286,7 @@ $tbody.append($row); $row.find('.sosial-ekonomi-komoditas').select2(); + applySosialEkonomiExamples($row); syncKomoditasLainnyaOptions(); } @@ -1530,6 +1574,22 @@ return digits.replace(/\B(?=(\d{3})+(?!\d))/g, '.'); } + function normalizedFieldName(name) { + return String(name || '').replace(/\[\d+\]/g, '[]'); + } + + function applySosialEkonomiExamples($scope = $(document)) { + $scope.find('input:not([type="hidden"]):not([type="radio"]):not([type="checkbox"]), textarea').each(function () { + const $field = $(this); + const name = normalizedFieldName($field.attr('name')); + const example = fieldExamples[name] || ($field.hasClass('currency-input') ? 'Contoh: 150.000' : null); + + if (example) { + $field.attr('placeholder', example); + } + }); + } + function clearPendapatanRow($row) { $row.find('select').val('').trigger('change'); $row.find('input[type="text"], input[type="number"]').val(''); @@ -1563,6 +1623,9 @@ this.setSelectionRange(this.value.length, this.value.length); } }); + $('.currency-input').each(function () { + this.value = formatRupiah(this.value); + }); $('form').on('submit', function () { $(this).find('.currency-input').each(function () { this.value = onlyDigits(this.value); @@ -1583,6 +1646,7 @@ $('#total-hutang-tidak-bersedia').on('change', syncTotalHutangFields); $('input[name="tekanan_jual_segera"]').on('change', syncTekananJualFields); $('input[name="kebebasan_memilih_pembeli"]').on('change', syncKebebasanPembeliFields); + applySosialEkonomiExamples(); syncKomoditasLainnyaOptions(); setupAllPendapatanRows(); syncPihakMembantuFields();