diff --git a/app/Enums/PraktikBudidaya/Bulan.php b/app/Enums/PraktikBudidaya/Bulan.php new file mode 100644 index 0000000..b58fa9d --- /dev/null +++ b/app/Enums/PraktikBudidaya/Bulan.php @@ -0,0 +1,32 @@ +value; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } +} \ No newline at end of file diff --git a/app/Enums/PraktikBudidaya/CaraSortasi.php b/app/Enums/PraktikBudidaya/CaraSortasi.php new file mode 100644 index 0000000..41dd9bb --- /dev/null +++ b/app/Enums/PraktikBudidaya/CaraSortasi.php @@ -0,0 +1,31 @@ + 'Dipilah manual dengan tangan (memilih satu per satu buah/biji yang bagus dan membuang yang rusak)', + self::ALAT_BANTU => 'Menggunakan alat bantu sederhana (tampah, ayakan, atau bak untuk memisahkan kotoran ringan)', + self::PERENDAMAN => 'Metode perendaman/tenggelam (memisahkan buah mengapung dan tenggelam)', + self::GRADING_KRITERIA => 'Grading berdasarkan kriteria (ukuran, warna, atau tingkat kematangan)', + self::PEMBERSIHAN => 'Hanya pembersihan kotoran kasar (membuang dahan atau sampah besar)', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } +} diff --git a/app/Enums/PraktikBudidaya/DasarPenentuanPanen.php b/app/Enums/PraktikBudidaya/DasarPenentuanPanen.php new file mode 100644 index 0000000..eb40d1b --- /dev/null +++ b/app/Enums/PraktikBudidaya/DasarPenentuanPanen.php @@ -0,0 +1,31 @@ + 'Kebutuhan uang mendesak, tanpa mempertimbangkan kematangan', + self::UMUR_TANPA_KONDISI_BUAH => 'Umur/jadwal tetap, tanpa melihat kondisi buah langsung', + self::BUAH_JATUH => 'Buah jatuh/matang pohon (sudah terlalu matang saat dipetik)', + self::TINGKAT_KEPADATAN => 'Bersuara saat diketuk atau tingkat kepadatan buah', + self::WARNA_KULIT_BUAH => 'Warna kulit buah (indikator paling akurat dan konsisten untuk menentukan kematangan optimal)', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } +} diff --git a/app/Enums/PraktikBudidaya/EstimasiKehilanganHasil.php b/app/Enums/PraktikBudidaya/EstimasiKehilanganHasil.php new file mode 100644 index 0000000..a1ac9c5 --- /dev/null +++ b/app/Enums/PraktikBudidaya/EstimasiKehilanganHasil.php @@ -0,0 +1,33 @@ + 'Tidak ada kehilangan', + self::SEDIKIT => 'Sedikit, sekitar 25 % dari total panen', + self::LUMAYAN => 'Lumayan, sekitar 50% dari total panen', + self::BANYAK => 'Banyak, sekitar 75% dari total panen', + self::HAMPIR_SEMUA => 'Hampir semua rusak, lebih dari 75%', + self::TIDAK_TAHU => 'Tidak tahu/sulit memperkirakan', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } +} diff --git a/app/Enums/PraktikBudidaya/PenangananGulma.php b/app/Enums/PraktikBudidaya/PenangananGulma.php index 586ee35..013b474 100644 --- a/app/Enums/PraktikBudidaya/PenangananGulma.php +++ b/app/Enums/PraktikBudidaya/PenangananGulma.php @@ -13,11 +13,11 @@ enum PenangananGulma: int public function label(): string { return match($this) { - self::DIBIARKAN => 'Dibiarkan di kebun', - self::DICABUT => 'Dikumpulkan dan dibuang', - self::DISEMPROT => 'Dijadikan kompos', - self::RUTIN_DICABUT_TANPA_JADWAL => 'Dikumpulkan dan dibuang', - self::RUTIN_TERJADWAL => 'Dijadikan kompos', + self::DIBIARKAN => 'Dibiarkan saja, tidak pernah ditangani', + self::DICABUT => 'Dicabut/dibersihkan sesekali, tidak terjadwal', + self::DISEMPROT => 'Disemprot herbisida sesekali, tidak terjadwal', + self::RUTIN_DICABUT_TANPA_JADWAL => 'Rutin dicabut/dipangkas, tapi tanpa jadwal yang jelas', + self::RUTIN_TERJADWAL => 'Rutin terjadwal dengan metode yang konsisten (dicabut/dipangkas/dikelola sebagai mulsa)', }; } diff --git a/app/Enums/PraktikBudidaya/PraktikSortasi.php b/app/Enums/PraktikBudidaya/PraktikSortasi.php new file mode 100644 index 0000000..57bfb79 --- /dev/null +++ b/app/Enums/PraktikBudidaya/PraktikSortasi.php @@ -0,0 +1,31 @@ + 'Tidak pernah melakukan sortasi sama sekali', + self::SANGAT_SEDERHANA => 'Sortasi sangat sederhana, hanya membuang yang jelas-jelas rusak/busuk', + self::TIDAK_SETIAP_PANEN => 'Sortasi dilakukan tapi tidak setiap panen (kadang dilakukan, kadang tidak)', + self::SETIAP_PANEN => 'Sortasi dilakukan setiap panen, tapi standarnya belum konsisten', + self::KETAT => 'Sortasi ketat dengan standar yang jelas dan konsisten setiap panen', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } +} diff --git a/app/Enums/PraktikBudidaya/TindakanPanenReject.php b/app/Enums/PraktikBudidaya/TindakanPanenReject.php new file mode 100644 index 0000000..b8ce4f4 --- /dev/null +++ b/app/Enums/PraktikBudidaya/TindakanPanenReject.php @@ -0,0 +1,25 @@ + 'Dibuang', + self::JUAL => 'Dijual ke tempat lain', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } +} diff --git a/app/Enums/PraktikBudidaya/TingkatPanenReject.php b/app/Enums/PraktikBudidaya/TingkatPanenReject.php new file mode 100644 index 0000000..d01aba4 --- /dev/null +++ b/app/Enums/PraktikBudidaya/TingkatPanenReject.php @@ -0,0 +1,31 @@ + 'Sering ditolak, lebih dari 50% hasil panen biasanya ditolak/tidak laku karena mutu', + self::CUKUP_SERING => 'Cukup sering, sekitar 25–50% hasil panen ditolak/tidak laku', + self::KADANG => 'Kadang ditolak, sekitar 10–25% hasil panen', + self::JARANG => 'Jarang ditolak, kurang dari 10% hasil panen', + self::TIDAK_ADA => 'Tidak ada yang ditolak, semua hasil panen sesuai standar pasar utama', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } +} diff --git a/app/Enums/SosialEkonomi/AlasanKreditDitolak.php b/app/Enums/SosialEkonomi/AlasanKreditDitolak.php new file mode 100644 index 0000000..99ca4bb --- /dev/null +++ b/app/Enums/SosialEkonomi/AlasanKreditDitolak.php @@ -0,0 +1,36 @@ + 'Tidak punya jaminan-agunan', + self::PROSES_TERLALU_RUMIT => 'Proses terlalu rumit', + self::TAKUT_TIDAK_BISA_BAYAR => 'Takut tidak bisa bayar', + self::TIDAK_TAHU_CARANYA => 'Tidak tahu caranya', + self::LAINNYA => 'Lainnya', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/BisaBeliPupukBersubsidi.php b/app/Enums/SosialEkonomi/BisaBeliPupukBersubsidi.php new file mode 100644 index 0000000..c004434 --- /dev/null +++ b/app/Enums/SosialEkonomi/BisaBeliPupukBersubsidi.php @@ -0,0 +1,30 @@ + 'Ya', + self::TIDAK => 'Tidak', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/JenisAsetProduktif.php b/app/Enums/SosialEkonomi/JenisAsetProduktif.php new file mode 100644 index 0000000..2d3402e --- /dev/null +++ b/app/Enums/SosialEkonomi/JenisAsetProduktif.php @@ -0,0 +1,34 @@ + 'Ternak', + self::KENDARAAN => 'Kendaraan', + self::ALAT_PERTANIAN => 'Alat pertanian', + self::LAINNYA => 'Lainnya', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/KategoriPendapatanKomoditas.php b/app/Enums/SosialEkonomi/KategoriPendapatanKomoditas.php similarity index 86% rename from app/Enums/KategoriPendapatanKomoditas.php rename to app/Enums/SosialEkonomi/KategoriPendapatanKomoditas.php index 98b3cdc..ff6d15a 100644 --- a/app/Enums/KategoriPendapatanKomoditas.php +++ b/app/Enums/SosialEkonomi/KategoriPendapatanKomoditas.php @@ -1,6 +1,6 @@ 'Tidak pernah hadir', + self::JARANG_HADIR => 'Jarang hadir', + self::SERING_HADIR_LEBIH_BANYAK_DIAM => 'Sering hadir tapi lebih banyak diam', + self::HAMPIR_SELALU_HADIR_KADANG_DISKUSI => 'Hampir selalu hadir & kadang diskusi', + self::SELALU_HADIR_AKTIF_DISKUSI => 'Selalu hadir & aktif diskusi', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/KebebasanMemilihPembeli.php b/app/Enums/SosialEkonomi/KebebasanMemilihPembeli.php new file mode 100644 index 0000000..d02b8cf --- /dev/null +++ b/app/Enums/SosialEkonomi/KebebasanMemilihPembeli.php @@ -0,0 +1,36 @@ + 'Tidak bebas, terikat satu pembeli', + self::AGAK_TERIKAT_ADA_TEKANAN => 'Agak terikat, ada tekanan', + self::AGAK_BEBAS_CENDERUNG_PEMBELI_SAMA => 'Agak bebas, cenderung pembeli sama', + self::CUKUP_BEBAS_SESEKALI_PINDAH => 'Cukup bebas, sesekali pindah', + self::SANGAT_BEBAS_PINDAH_KAPAN_SAJA => 'Sangat bebas, pindah kapan saja', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/KedekatanSesamaAnggota.php b/app/Enums/SosialEkonomi/KedekatanSesamaAnggota.php new file mode 100644 index 0000000..2bec04d --- /dev/null +++ b/app/Enums/SosialEkonomi/KedekatanSesamaAnggota.php @@ -0,0 +1,34 @@ + 'Sangat dekat', + self::CUKUP_DEKAT => 'Cukup dekat', + self::SEBATAS_KENAL => 'Sebatas kenal', + self::TIDAK_BEGITU_KENAL => 'Tidak begitu kenal', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/KemauanIkutProgram.php b/app/Enums/SosialEkonomi/KemauanIkutProgram.php new file mode 100644 index 0000000..0f4891f --- /dev/null +++ b/app/Enums/SosialEkonomi/KemauanIkutProgram.php @@ -0,0 +1,36 @@ + 'Tidak mau', + self::RAGU_RAGU => 'Ragu-ragu', + self::MAU_PERLU_DIPASTIKAN_MANFAAT => 'Mau, perlu dipastikan manfaatnya', + self::MAU_LIHAT_PROGRAM_DULU => 'Mau, ingin lihat programnya dulu', + self::MAU_LANGSUNG_IKUT => 'Mau, langsung ikut', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/KemauanMencobaPraktikBaru.php b/app/Enums/SosialEkonomi/KemauanMencobaPraktikBaru.php new file mode 100644 index 0000000..2a67141 --- /dev/null +++ b/app/Enums/SosialEkonomi/KemauanMencobaPraktikBaru.php @@ -0,0 +1,36 @@ + 'Tidak mau', + self::RAGU_RAGU => 'Ragu-ragu', + self::MAU_LIHAT_HASIL_DULU => 'Mau, lihat hasil dulu', + self::MAU_LANGSUNG_COBA => 'Mau langsung coba', + self::MAU_COBA_SAMPAI_BERHASIL => 'Mau coba sampai berhasil', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/KeterikatanHutangPanen.php b/app/Enums/SosialEkonomi/KeterikatanHutangPanen.php new file mode 100644 index 0000000..9a22840 --- /dev/null +++ b/app/Enums/SosialEkonomi/KeterikatanHutangPanen.php @@ -0,0 +1,38 @@ + 'Tidak bersedia menjawab', + self::HUTANG_BESAR_HAMPIR_SELURUH_PANEN_TERIKAT => 'Ada hutang besar, hampir seluruh panen terikat', + self::HUTANG_LEBIH_DARI_SEPARUH_PANEN_TERIKAT => 'Ada hutang, >separuh panen terikat', + self::HUTANG_SEBAGIAN_KECIL_TERIKAT => 'Ada hutang, sebagian kecil terikat', + self::HUTANG_KECIL_TIDAK_MENGIKAT_PANEN => 'Ada hutang kecil, tidak mengikat panen', + self::TIDAK_ADA => 'Tidak ada', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/KeterlibatanProgramKeuanganFormal.php b/app/Enums/SosialEkonomi/KeterlibatanProgramKeuanganFormal.php new file mode 100644 index 0000000..c8f4e82 --- /dev/null +++ b/app/Enums/SosialEkonomi/KeterlibatanProgramKeuanganFormal.php @@ -0,0 +1,36 @@ + 'Tidak pernah menerima', + self::PERNAH_SATU_TIDAK_BERMANFAAT => 'Pernah 1 program, tidak lagi & tidak bermanfaat', + self::SEDANG_MENERIMA_SATU => 'Sedang menerima 1 program', + self::SEDANG_MENERIMA_LEBIH_DARI_SATU => 'Sedang menerima >1 program', + self::AKTIF_BEBERAPA_PROGRAM_BERMANFAAT => 'Aktif beberapa program & merasakan manfaat nyata', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/KondisiAsetProduktif.php b/app/Enums/SosialEkonomi/KondisiAsetProduktif.php new file mode 100644 index 0000000..c2537b1 --- /dev/null +++ b/app/Enums/SosialEkonomi/KondisiAsetProduktif.php @@ -0,0 +1,36 @@ + 'Tidak ada', + self::ADA_SATU_KURANG_BAIK => 'Ada 1 jenis, kondisi kurang baik', + self::ADA_SATU_BAIK => 'Ada 1 jenis, kondisi baik', + self::ADA_DUA_LEBIH_SEBAGIAN_KURANG_BAIK => 'Ada 2+ jenis, sebagian kurang baik', + self::ADA_DUA_LEBIH_SEMUA_BAIK => 'Ada 2+ jenis, semua kondisi baik', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/ManfaatKelompokTani.php b/app/Enums/SosialEkonomi/ManfaatKelompokTani.php new file mode 100644 index 0000000..392837f --- /dev/null +++ b/app/Enums/SosialEkonomi/ManfaatKelompokTani.php @@ -0,0 +1,36 @@ + 'Tidak ada manfaat', + self::MANFAAT_SOSIAL_SAJA => 'Manfaat sosial saja', + self::SEDIKIT_MANFAAT_PRODUKSI_PEMASARAN => 'Sedikit manfaat produksi-pemasaran', + self::MANFAAT_CUKUP_TERASA => 'Manfaat cukup terasa', + self::MANFAAT_NYATA_SIGNIFIKAN => 'Manfaat nyata & signifikan', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/MinatPembeliHargaStabil.php b/app/Enums/SosialEkonomi/MinatPembeliHargaStabil.php new file mode 100644 index 0000000..6fd8f06 --- /dev/null +++ b/app/Enums/SosialEkonomi/MinatPembeliHargaStabil.php @@ -0,0 +1,34 @@ + 'Mau-harga stabil lebih penting', + self::MAU_TAPI_INGIN_BANDINGKAN_DULU => 'Mau tapi ingin bandingkan dulu', + self::RAGU_RAGU => 'Ragu-ragu', + self::TIDAK_MAU_CARI_HARGA_TERBAIK => 'Tidak mau-cari harga terbaik tiap jual', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/OrientasiRencanaJangkaPanjang.php b/app/Enums/SosialEkonomi/OrientasiRencanaJangkaPanjang.php new file mode 100644 index 0000000..e8b4485 --- /dev/null +++ b/app/Enums/SosialEkonomi/OrientasiRencanaJangkaPanjang.php @@ -0,0 +1,36 @@ + 'Belum kepikiran', + self::INGIN_TETAP_SEPERTI_SEKARANG => 'Ingin tetap seperti sekarang', + self::INGIN_BERUBAH_BELUM_TAHU_CARANYA => 'Ada keinginan berubah tapi belum tahu caranya', + self::INGIN_SUDAH_MULAI_DIPIKIRKAN => 'Ada keinginan & sudah mulai dipikirkan', + self::PUNYA_RENCANA_KONKRET => 'Sudah punya rencana konkret', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/PanutanPetaniSukses.php b/app/Enums/SosialEkonomi/PanutanPetaniSukses.php new file mode 100644 index 0000000..7d7e5bb --- /dev/null +++ b/app/Enums/SosialEkonomi/PanutanPetaniSukses.php @@ -0,0 +1,36 @@ + 'Tidak ada', + self::ADA_DENGAR_DARI_ORANG_LAIN => 'Ada, dengar dari orang lain saja', + self::TAHU_SIAPA_TIDAK_KENAL => 'Tahu siapa, tapi tidak kenal', + self::KENAL_BELUM_DISKUSI => 'Kenal, belum pernah diskusi', + self::KENAL_PERNAH_DISKUSI_LANGSUNG => 'Kenal & pernah diskusi langsung', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/PemahamanMutuHarga.php b/app/Enums/SosialEkonomi/PemahamanMutuHarga.php new file mode 100644 index 0000000..24b262b --- /dev/null +++ b/app/Enums/SosialEkonomi/PemahamanMutuHarga.php @@ -0,0 +1,36 @@ + 'Tidak tahu', + self::PERNAH_DENGAR_TIDAK_YAKIN => 'Pernah dengar, tidak yakin', + self::TAHU_BEDA_BELUM_BUKTIKAN => 'Tahu ada beda, belum buktikan', + self::TAHU_PERNAH_HARGA_LEBIH_TINGGI => 'Tahu & pernah dapat harga lebih tinggi', + self::TAHU_BETUL_BISA_JELASKAN_RINCI => 'Tahu betul & bisa jelaskan rinci', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/PengalamanKreditKebun.php b/app/Enums/SosialEkonomi/PengalamanKreditKebun.php new file mode 100644 index 0000000..8040ca1 --- /dev/null +++ b/app/Enums/SosialEkonomi/PengalamanKreditKebun.php @@ -0,0 +1,36 @@ + 'Tidak pernah mencoba', + self::PERNAH_COBA_DITOLAK => 'Pernah coba tapi ditolak', + self::SEDANG_PROSES => 'Sedang dalam proses', + self::BERHASIL_MASIH_PELUNASAN => 'Berhasil, masih proses pelunasan', + self::BERHASIL_SUDAH_LUNAS => 'Berhasil & sudah lunas', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/PengetahuanHargaHasilOlah.php b/app/Enums/SosialEkonomi/PengetahuanHargaHasilOlah.php new file mode 100644 index 0000000..1887814 --- /dev/null +++ b/app/Enums/SosialEkonomi/PengetahuanHargaHasilOlah.php @@ -0,0 +1,34 @@ + 'Tidak tahu', + self::PERNAH_DENGAR_TIDAK_TAHU_PENGARUH => 'Pernah dengar tapi tidak tahu pengaruh ke harga', + self::TAHU_BEDA_HARGA_BELUM_COBA => 'Tahu ada beda harga tapi belum coba', + self::PERNAH_JUAL_HASIL_OLAH_HARGA_LEBIH_TINGGI => 'Sudah pernah jual hasil olah dengan harga lebih tinggi', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/PeranDalamKelompok.php b/app/Enums/SosialEkonomi/PeranDalamKelompok.php new file mode 100644 index 0000000..7630d4e --- /dev/null +++ b/app/Enums/SosialEkonomi/PeranDalamKelompok.php @@ -0,0 +1,36 @@ + 'Anggota pasif', + self::ANGGOTA_BIASA_KADANG_DILIBATKAN => 'Anggota biasa, kadang dilibatkan', + self::ANGGOTA_BIASA_CUKUP_AKTIF => 'Anggota biasa, cukup aktif', + self::PENGURUS_BELUM_BANYAK_TANGGUNG_JAWAB => 'Pengurus, belum banyak menjalankan tanggung jawab', + self::KETUA_PENGURUS_AKTIF => 'Ketua-pengurus aktif & menjalankan tanggung jawab nyata', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/PeriodePendapatan.php b/app/Enums/SosialEkonomi/PeriodePendapatan.php similarity index 85% rename from app/Enums/PeriodePendapatan.php rename to app/Enums/SosialEkonomi/PeriodePendapatan.php index ed280aa..0270266 100644 --- a/app/Enums/PeriodePendapatan.php +++ b/app/Enums/SosialEkonomi/PeriodePendapatan.php @@ -1,6 +1,6 @@ 'Pernah', + self::TIDAK_PERNAH => 'Tidak pernah', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/PernahJualHargaLebihTinggi.php b/app/Enums/SosialEkonomi/PernahJualHargaLebihTinggi.php new file mode 100644 index 0000000..839b364 --- /dev/null +++ b/app/Enums/SosialEkonomi/PernahJualHargaLebihTinggi.php @@ -0,0 +1,30 @@ + 'Belum pernah', + self::PERNAH => 'Pernah', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/PihakMembantuKonflik.php b/app/Enums/SosialEkonomi/PihakMembantuKonflik.php similarity index 93% rename from app/Enums/PihakMembantuKonflik.php rename to app/Enums/SosialEkonomi/PihakMembantuKonflik.php index 4120f83..4be60ee 100644 --- a/app/Enums/PihakMembantuKonflik.php +++ b/app/Enums/SosialEkonomi/PihakMembantuKonflik.php @@ -1,6 +1,6 @@ 'Tidak ada', + self::ADA => 'Ada', + self::TIDAK_BERSEDIA_MENJAWAB => 'Tidak bersedia menjawab', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/PraktikIjon.php b/app/Enums/SosialEkonomi/PraktikIjon.php new file mode 100644 index 0000000..cc1a476 --- /dev/null +++ b/app/Enums/SosialEkonomi/PraktikIjon.php @@ -0,0 +1,38 @@ + 'Tidak bersedia menjawab', + self::HAMPIR_SELURUH_PANEN_TERIKAT => 'Hampir seluruh panen terikat ijon', + self::SEBAGIAN_BESAR_TERIKAT => 'Sebagian besar terikat', + self::SESEKALI_SEBAGIAN_KECIL => 'Sesekali-sebagian kecil', + self::PERNAH_SUDAH_LAMA_TIDAK_LAGI => 'Pernah, sudah lama tidak lagi', + self::TIDAK_PERNAH => 'Tidak pernah', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SkorKecukupanPenghasilan.php b/app/Enums/SosialEkonomi/SkorKecukupanPenghasilan.php similarity index 96% rename from app/Enums/SkorKecukupanPenghasilan.php rename to app/Enums/SosialEkonomi/SkorKecukupanPenghasilan.php index d359b3a..7e38576 100644 --- a/app/Enums/SkorKecukupanPenghasilan.php +++ b/app/Enums/SosialEkonomi/SkorKecukupanPenghasilan.php @@ -1,6 +1,6 @@ 'Belum punya', + self::SUDAH_PUNYA_BELUM_AKTIF => 'Sudah punya tapi belum aktif', + self::SUDAH_PUNYA_AKTIF_DIGUNAKAN => 'Sudah punya & aktif digunakan', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/StatusKepemilikanLahanSosialEkonomi.php b/app/Enums/SosialEkonomi/StatusKepemilikanLahanSosialEkonomi.php similarity index 95% rename from app/Enums/StatusKepemilikanLahanSosialEkonomi.php rename to app/Enums/SosialEkonomi/StatusKepemilikanLahanSosialEkonomi.php index 935ef44..74e6a0a 100644 --- a/app/Enums/StatusKepemilikanLahanSosialEkonomi.php +++ b/app/Enums/SosialEkonomi/StatusKepemilikanLahanSosialEkonomi.php @@ -1,6 +1,6 @@ 'Sedang Menerima', + self::PERNAH_TAPI_TIDAK_LAGI => 'Pernah tapi Tidak Lagi', + self::BELUM_PERNAH => 'Belum Pernah', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/StatusRekeningTabungan.php b/app/Enums/SosialEkonomi/StatusRekeningTabungan.php new file mode 100644 index 0000000..e234fe8 --- /dev/null +++ b/app/Enums/SosialEkonomi/StatusRekeningTabungan.php @@ -0,0 +1,36 @@ + 'Tidak punya rekening', + self::PUNYA_TIDAK_AKTIF => 'Punya tapi tidak aktif', + self::PUNYA_KADANG_DIGUNAKAN => 'Punya, kadang digunakan', + self::PUNYA_CUKUP_RUTIN => 'Punya, cukup rutin', + self::AKTIF_RUTIN_DIGUNAKAN => 'Aktif & rutin digunakan', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/TekananJualSegera.php b/app/Enums/SosialEkonomi/TekananJualSegera.php new file mode 100644 index 0000000..82b4e35 --- /dev/null +++ b/app/Enums/SosialEkonomi/TekananJualSegera.php @@ -0,0 +1,30 @@ + 'Tidak ada', + self::ADA => 'Ada', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/TerdaftarKelompokTani.php b/app/Enums/SosialEkonomi/TerdaftarKelompokTani.php new file mode 100644 index 0000000..f0ca12a --- /dev/null +++ b/app/Enums/SosialEkonomi/TerdaftarKelompokTani.php @@ -0,0 +1,30 @@ + 'Ya', + self::TIDAK => 'Tidak', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Enums/SosialEkonomi/UsahaMutuTambahanHarga.php b/app/Enums/SosialEkonomi/UsahaMutuTambahanHarga.php new file mode 100644 index 0000000..eb3f327 --- /dev/null +++ b/app/Enums/SosialEkonomi/UsahaMutuTambahanHarga.php @@ -0,0 +1,32 @@ + 'Sebanding-cocok dicoba', + self::TIDAK_YAKIN => 'Tidak yakin', + self::TIDAK_SEBANDING_TERLALU_BANYAK_USAHA => 'Tidak sebanding-terlalu banyak usaha', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } + + public static function values(): array + { + return array_column(self::cases(), 'value'); + } +} diff --git a/app/Http/Controllers/Web/Konfigurasi/AuthController.php b/app/Http/Controllers/Web/Konfigurasi/AuthController.php index 67f2662..89ab07a 100644 --- a/app/Http/Controllers/Web/Konfigurasi/AuthController.php +++ b/app/Http/Controllers/Web/Konfigurasi/AuthController.php @@ -8,7 +8,7 @@ use App\Models\User; use Illuminate\Support\Str; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; -use Illuminate\Support\Facades\Validator; +use Illuminate\Support\Str; use Illuminate\Validation\ValidationException; class AuthController extends Controller @@ -27,27 +27,24 @@ class AuthController extends Controller public function createAccount(Request $request) { - $validator = Validator::make($request->all(), [ - 'name' => 'required|string|max:255', - 'email' => 'required|string|email|max:255|unique:users', + $credentials = $request->validate([ + 'username' => 'required|string|max:255|unique:users,username', + 'email' => 'required|string|email|max:255|unique:users,email', 'password' => 'required|string|min:8|confirmed', ]); User::create([ - 'name' => $request->name, - 'username' => $request->name, - 'email' => $request->email, - 'password' => Hash::make($request->password), - 'uid' => Str::uuid(), - 'status' => 'pending', - 'role' => null, - 'email_verified_at' => null, - 'created_by' => null, - 'updated_by' => null, - 'deleted_by' => null, - ]); - - return redirect('/login')->with('success', 'Account created successfully. Please login.'); + 'uid' => (string) Str::uuid(), + 'name' => $request->name, + 'username' => $request->name, + 'email' => $request->email, + 'password' => Hash::make($request->password), + 'status' => 'pending', + 'role' => null, + 'email_verified_at' => null, + ]); + + return redirect()->route('login')->with('success', 'Account created successfully. Please login.'); } public function verify(User $user) diff --git a/app/Http/Controllers/Web/Produktivitas/PraktikBudidayaController.php b/app/Http/Controllers/Web/Produktivitas/PraktikBudidayaController.php index bf4eb20..a6dc6b3 100644 --- a/app/Http/Controllers/Web/Produktivitas/PraktikBudidayaController.php +++ b/app/Http/Controllers/Web/Produktivitas/PraktikBudidayaController.php @@ -11,6 +11,9 @@ use Illuminate\Validation\Rules\Enum; use App\Models\Pertanian\Petani; use App\Models\Pertanian\PraktikBudidaya; +use App\Models\Pertanian\SurveyPanen; +use App\Models\Pertanian\SurveyProduktivitas; +use App\Models\Pertanian\Komoditas; use App\Enums\PraktikBudidaya\TenagaKerja; use App\Enums\PraktikBudidaya\FrekuensiPemangkasanUtama; @@ -27,6 +30,13 @@ use App\Enums\PraktikBudidaya\PenangananGulma; use App\Enums\PraktikBudidaya\KondisiPengelolaanAir; use App\Enums\PraktikBudidaya\KebutuhanAirPermusim; use App\Enums\PraktikBudidaya\PemahamanManfaatKonservasi; +use App\Enums\PraktikBudidaya\DasarPenentuanPanen; +use App\Enums\PraktikBudidaya\Bulan; +use App\Enums\PraktikBudidaya\PraktikSortasi; +use App\Enums\PraktikBudidaya\CaraSortasi; +use App\Enums\PraktikBudidaya\TingkatPanenReject; +use App\Enums\PraktikBudidaya\TindakanPanenReject; +use App\Enums\PraktikBudidaya\EstimasiKehilanganHasil; class PraktikBudidayaController extends Controller { @@ -86,6 +96,11 @@ class PraktikBudidayaController extends Controller $title = 'Petani - Praktik Budidaya'; $petani = Petani::findOrFail($petaniId); $praktikBudidaya = PraktikBudidaya::where('petani_id', $petaniId)->latest()->first(); + $surveyPanen = SurveyPanen:: where('petani_id', $petaniId)->latest()->first(); + + $komoditas = Komoditas::all(); + + $surveyProduktivitas = SurveyProduktivitas::where('petani_id', $petaniId)->get(); $teknikPemangkasan = $praktikBudidaya->teknik_pemangkasan ?? []; $teknikPemangkasanLainnya = collect($teknikPemangkasan) @@ -95,7 +110,7 @@ class PraktikBudidayaController extends Controller $alasanTidakPenyerbukanLainnya = collect(explode(', ', $alasanTidakPenyerbukan)) ->first(fn ($item) => !in_array($item, $defaultAlasanTidakPenyerbukan)); - $frekuensiPemupukan = $praktikBudidaya->frekuensi_pemupukan ?? ''; + $frekuensiPemupukan = $praktikBudidaya->frekuensi_pemberian_pupuk ?? ''; $frekuensiPemupukanLainnya = collect(explode(', ', $frekuensiPemupukan)) ->first(fn ($item) => !in_array($item, $defaultFrekuensiPemupukan)); @@ -116,7 +131,7 @@ class PraktikBudidayaController extends Controller ->first(fn ($item) => !in_array($item, $defaultSistemIrigasi)); if (!empty($praktikBudidaya)) { - return view('produktivitas.petani.praktik-budidaya.edit', compact('title', 'petani', 'praktikBudidaya', 'teknikPemangkasanLainnya', 'alasanTidakPenyerbukanLainnya', 'frekuensiPemupukanLainnya', 'waktuPemberianPupukLainnya', 'caraPemberianPupukLainnya', 'sumberAirLainnya', 'sistemIrigasiLainnya')); + return view('produktivitas.petani.praktik-budidaya.edit', compact('title', 'petani', 'praktikBudidaya', 'surveyPanen', 'komoditas', 'surveyProduktivitas', 'teknikPemangkasanLainnya', 'alasanTidakPenyerbukanLainnya', 'frekuensiPemupukanLainnya', 'waktuPemberianPupukLainnya', 'caraPemberianPupukLainnya', 'sumberAirLainnya', 'sistemIrigasiLainnya')); } return view('produktivitas.petani.praktik-budidaya.add', compact('title', 'petani', 'teknikPemangkasanLainnya', 'alasanTidakPenyerbukanLainnya', 'frekuensiPemupukanLainnya', 'waktuPemberianPupukLainnya', 'caraPemberianPupukLainnya')); @@ -165,7 +180,7 @@ class PraktikBudidayaController extends Controller $petani = Petani::findOrFail($petaniId); - $praktikBudidaya = $petani->praktik_budidaya()->create([ + $praktikBudidaya = $petani->praktikBudidaya()->create([ 'petani_id' => $petani->id, 'uid' => 'PB-' . strtoupper(Str::random(10)), 'tenaga_kerja' => $validatedData['tenaga_kerja'], @@ -184,6 +199,34 @@ class PraktikBudidayaController extends Controller 'estimasi_dosis_pupuk_anorganik' => $validatedData['estimasi_dosis_pupuk_anorganik'] ?? null, 'waktu_pemberian_pupuk' => ($validatedData['waktu_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['waktu_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['waktu_pemberian_pupuk'] ?? null), 'cara_pemberian_pupuk' => ($validatedData['cara_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['cara_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['cara_pemberian_pupuk'] ?? null), + 'created_by' => auth()->id(), + 'updated_by' => auth()->id(), + ], [ + 'string' => ':attribute harus berupa teks.', + 'integer' => ':attribute harus berupa angka.', + 'array' => ':attribute harus berupa pilihan.', + 'enum' => 'Pilihan :attribute tidak valid.', + ], [ + 'tenaga_kerja' => 'tenaga kerja', + 'frekuensi_pemangkasan_komoditas_utama' => 'frekuensi pemangkasan komoditas utama', + 'teknik_pemangkasan' => 'teknik pemangkasan', + 'teknik_pemangkasan_lainnya' => 'teknik pemangkasan lainnya', + 'frekuensi_pemangkasan_pohon_penaung' => 'frekuensi pemangkasan pohon penaung', + + 'penyerbukan_manual' => 'penyerbukan manual', + 'alasan_tidak_penyerbukan' => 'alasan tidak melakukan penyerbukan manual', + 'alasan_tidak_penyerbukan_lainnya' => 'alasan lainnya tidak melakukan penyerbukan manual', + 'tingkat_keberhasilan_penyerbukan' => 'tingkat keberhasilan penyerbukan', + 'pemberian_pupuk' => 'pemberian pupuk', + 'jenis_pupuk' => 'jenis pupuk', + 'frekuensi_pemupukan' => 'frekuensi pemupukan', + 'frekuensi_pemupukan_lainnya' => 'frekuensi pemupukan lainnya', + 'estimasi_dosis_pupuk_organik' => 'estimasi dosis pupuk organik', + 'estimasi_dosis_pupuk_anorganik' => 'estimasi dosis pupuk anorganik', + 'waktu_pemberian_pupuk' => 'waktu pemberian pupuk', + 'waktu_pemberian_pupuk_lainnya' => 'waktu pemberian pupuk lainnya', + 'cara_pemberian_pupuk' => 'cara pemberian pupuk', + 'cara_pemberian_pupuk_lainnya' => 'cara pemberian pupuk lainnya', ]); return redirect()->route('petani.praktik-budidaya.edit', [$petani->id , $praktikBudidaya->id]) @@ -246,6 +289,11 @@ class PraktikBudidayaController extends Controller $title = 'Petani - Praktik Budidaya'; $petani = Petani::findOrFail($petaniId); $praktikBudidaya = PraktikBudidaya::where('petani_id', $petaniId)->where('id', $praktikBudidayaId)->latest()->first(); + $surveyPanen = SurveyPanen:: where('petani_id', $petaniId)->latest()->first(); + + $komoditas = Komoditas::all(); + + $surveyProduktivitas = SurveyProduktivitas::where('petani_id', $petaniId)->get(); $teknikPemangkasan = $praktikBudidaya->teknik_pemangkasan ?? []; $teknikPemangkasanLainnya = collect($teknikPemangkasan) @@ -255,7 +303,7 @@ class PraktikBudidayaController extends Controller $alasanTidakPenyerbukanLainnya = collect(explode(', ', $alasanTidakPenyerbukan)) ->first(fn ($item) => !in_array($item, $defaultAlasanTidakPenyerbukan)); - $frekuensiPemupukan = $praktikBudidaya->frekuensi_pemupukan ?? ''; + $frekuensiPemupukan = $praktikBudidaya->frekuensi_pemberian_pupuk ?? ''; $frekuensiPemupukanLainnya = collect(explode(', ', $frekuensiPemupukan)) ->first(fn ($item) => !in_array($item, $defaultFrekuensiPemupukan)); @@ -275,7 +323,7 @@ class PraktikBudidayaController extends Controller $sistemIrigasiLainnya = collect(explode(', ', $sistemIrigasi)) ->first(fn ($item) => !in_array($item, $defaultSistemIrigasi)); - return view('produktivitas.petani.praktik-budidaya.edit', compact('title', 'petani', 'praktikBudidaya', 'teknikPemangkasanLainnya', 'alasanTidakPenyerbukanLainnya', 'frekuensiPemupukanLainnya', 'waktuPemberianPupukLainnya', 'caraPemberianPupukLainnya', 'sumberAirLainnya', 'sistemIrigasiLainnya')); + return view('produktivitas.petani.praktik-budidaya.edit', compact('title', 'petani', 'praktikBudidaya', 'surveyPanen', 'komoditas', 'surveyProduktivitas', 'teknikPemangkasanLainnya', 'alasanTidakPenyerbukanLainnya', 'frekuensiPemupukanLainnya', 'waktuPemberianPupukLainnya', 'caraPemberianPupukLainnya', 'sumberAirLainnya', 'sistemIrigasiLainnya')); } public function update($petaniId, $praktikBudidayaId, Request $request) @@ -284,8 +332,6 @@ class PraktikBudidayaController extends Controller abort(403); } - // dd($request->all()); - $praktikBudidaya = PraktikBudidaya::where('petani_id', $petaniId) ->where('id', $praktikBudidayaId) ->firstOrFail(); @@ -299,15 +345,15 @@ class PraktikBudidayaController extends Controller 'teknik_pemangkasan' => ['nullable', 'array'], 'teknik_pemangkasan.*' => ['string'], 'teknik_pemangkasan_lainnya' => ['nullable', 'string'], - 'frekuensi_pemangkasan_pohon_penaung' => ['nullable', 'integer', new Enum(FrekuensiPemangkasanPendamping::class)], - 'penyerbukan_manual' => ['nullable', 'integer', new Enum(PenyerbukanManual::class)], + 'frekuensi_pemangkasan_pohon_penaung' => ['nullable', 'string', new Enum(FrekuensiPemangkasanPendamping::class)], + 'penyerbukan_manual' => ['nullable', 'string', new Enum(PenyerbukanManual::class)], 'alasan_tidak_penyerbukan' => ['nullable', 'string'], 'alasan_tidak_penyerbukan_lainnya' => ['nullable', 'string'], 'tingkat_keberhasilan_penyerbukan' => ['nullable', 'string'], // 2.4 Praktik Pemupukan 'pemberian_pupuk' => ['nullable', 'integer', new Enum(PemberianPupuk::class)], - 'jenis_pupuk' => ['nullable', 'integer', new Enum(JenisPupuk::class)], + 'jenis_pupuk' => ['nullable', 'string', new Enum(JenisPupuk::class)], 'frekuensi_pemupukan' => ['nullable', 'string'], 'frekuensi_pemupukan_lainnya' => ['nullable', 'string'], @@ -358,9 +404,142 @@ class PraktikBudidayaController extends Controller 'kebiasaan_konservasi_tanah.*' => ['string'], 'pemahaman_manfaat_konservasi' => ['nullable', 'string', new Enum(PemahamanManfaatKonservasi::class)], - ]); - $data = []; + 'upah_tenaga_kerja' => ['nullable', 'numeric'], + 'biaya_bibit' => ['nullable', 'numeric'], + 'biaya_pupuk' => ['nullable', 'numeric'], + 'biaya_pestisida' => ['nullable', 'numeric'], + 'biaya_sewa_alat' => ['nullable', 'numeric'], + 'biaya_penyediaan_air' => ['nullable', 'numeric'], + 'biaya_lainnya' => ['nullable', 'numeric'], + 'total_estimasi_biaya_produksi' => ['nullable', 'numeric'], + + 'dasar_penentuan_panen' => ['nullable', 'integer', new Enum(DasarPenentuanPanen::class)], + 'frekuensi_panen_pertahun' => ['nullable', 'integer'], + 'bulan_panen_utama' => ['nullable', 'string', new Enum(Bulan::class)], + 'hasil_komoditas_utama_permusim' => ['nullable', 'numeric'], + 'hasil_komoditas_lainnya_permusim' => ['nullable', 'numeric'], + 'disimpan_untuk_sendiri' => ['nullable', 'boolean'], + 'hasil_panen_disimpan' => ['nullable', 'numeric'], + 'tujuan_disimpan' => ['nullable', 'string'], + + 'praktik_sortasi' => ['nullable', 'integer', new Enum(PraktikSortasi::class)], + 'bentuk_sortasi' => ['nullable', 'string', new Enum(CaraSortasi::class)], + 'tingkat_reject' => ['nullable', 'integer', new Enum(TingkatPanenReject::class)], + 'hasil_panen_reject' => ['nullable', 'numeric'], + 'tindakan_hasil_reject' => ['nullable', 'string', new Enum(TindakanPanenReject::class)], + 'upah_tenaga_panen' => ['nullable', 'numeric'], + 'biaya_pengangkutan' => ['nullable', 'numeric'], + 'biaya_wadah_kemasan' => ['nullable', 'numeric'], + 'biaya_sewa_alat_panen' => ['nullable', 'numeric'], + 'biaya_panen_lainnya' => ['nullable', 'numeric'], + 'total_estimasi_biaya_panen' => ['nullable', 'numeric'], + + 'estimasi_kehilangan_akibat_opt' => ['nullable', 'string', new Enum(EstimasiKehilanganHasil::class)], + 'estimasi_kehilangan_akibat_hama' => ['nullable', 'string', new Enum(EstimasiKehilanganHasil::class)], + ], [ + 'string' => ':attribute harus berupa teks.', + 'integer' => ':attribute harus berupa angka.', + 'numeric' => ':attribute harus berupa angka.', + 'array' => ':attribute harus berupa daftar pilihan.', + 'boolean' => ':attribute harus bernilai ya atau tidak.', + 'enum' => 'Pilihan :attribute tidak valid.', + + 'teknik_pemangkasan.*.string' => 'Setiap pilihan teknik pemangkasan harus berupa teks.', + 'kebiasaan_konservasi_tanah.*.string' => 'Setiap pilihan kebiasaan konservasi tanah harus berupa teks.', + ], [ + // 2.2 Persiapan Lahan & Penanaman + 'tenaga_kerja' => 'tenaga kerja', + + // 2.3 Praktik Pemangkasan & Penyerbukan + 'frekuensi_pemangkasan_komoditas_utama' => 'frekuensi pemangkasan komoditas utama', + 'teknik_pemangkasan' => 'teknik pemangkasan', + 'teknik_pemangkasan.*' => 'pilihan teknik pemangkasan', + 'teknik_pemangkasan_lainnya' => 'teknik pemangkasan lainnya', + 'frekuensi_pemangkasan_pohon_penaung' => 'frekuensi pemangkasan pohon penaung', + 'penyerbukan_manual' => 'penyerbukan manual', + 'alasan_tidak_penyerbukan' => 'alasan tidak melakukan penyerbukan manual', + 'alasan_tidak_penyerbukan_lainnya' => 'alasan lainnya tidak melakukan penyerbukan manual', + 'tingkat_keberhasilan_penyerbukan' => 'tingkat keberhasilan penyerbukan', + + // 2.4 Praktik Pemupukan + 'pemberian_pupuk' => 'pemberian pupuk', + 'jenis_pupuk' => 'jenis pupuk', + 'frekuensi_pemupukan' => 'frekuensi pemupukan', + 'frekuensi_pemupukan_lainnya' => 'frekuensi pemupukan lainnya', + 'estimasi_dosis_pupuk_organik' => 'estimasi dosis pupuk organik', + 'estimasi_dosis_pupuk_anorganik' => 'estimasi dosis pupuk anorganik', + 'waktu_pemberian_pupuk' => 'waktu pemberian pupuk', + 'waktu_pemberian_pupuk_lainnya' => 'waktu pemberian pupuk lainnya', + 'cara_pemberian_pupuk' => 'cara pemberian pupuk', + 'cara_pemberian_pupuk_lainnya' => 'cara pemberian pupuk lainnya', + + // 2.5 Pengendalian OPT + 'metode_penanganan_hama_penyakit' => 'metode penanganan hama dan penyakit', + 'jenis_hama' => 'jenis hama', + 'jenis_penyakit' => 'jenis penyakit', + 'intensitas_serangan' => 'intensitas serangan', + 'waktu_kemunculan_terparah' => 'waktu kemunculan terparah', + 'metode_paling_sering_dilakukan' => 'metode yang paling sering dilakukan', + 'volume_obat_obatan_permusim' => 'volume obat-obatan per musim', + + // 2.6 Sanitasi Kebun + 'frekuensi_sanitasi_lahan' => 'frekuensi sanitasi lahan', + 'penanganan_sisa_buah_ranting' => 'penanganan sisa buah dan ranting', + 'penanganan_gulma' => 'penanganan gulma', + + // 2.7 Pengelolaan Air & Irigasi + 'kondisi_pengelolaan_air_irigasi' => 'kondisi pengelolaan air dan irigasi', + 'sumber_air' => 'sumber air', + 'sumber_air_lainnya' => 'sumber air lainnya', + 'sistem_irigasi' => 'sistem irigasi', + 'sistem_irigasi_lainnya' => 'sistem irigasi lainnya', + 'kebutuhan_air_permusim' => 'kebutuhan air per musim', + 'kebiasaan_konservasi_tanah' => 'kebiasaan konservasi tanah', + 'kebiasaan_konservasi_tanah.*' => 'pilihan kebiasaan konservasi tanah', + 'pemahaman_manfaat_konservasi' => 'pemahaman manfaat konservasi', + + // Biaya Produksi + 'upah_tenaga_kerja' => 'upah tenaga kerja', + 'biaya_bibit' => 'biaya bibit', + 'biaya_pupuk' => 'biaya pupuk', + 'biaya_pestisida' => 'biaya pestisida', + 'biaya_sewa_alat' => 'biaya sewa alat', + 'biaya_penyediaan_air' => 'biaya penyediaan air', + 'biaya_lainnya' => 'biaya lainnya', + 'total_estimasi_biaya_produksi' => 'total estimasi biaya produksi', + + // Panen + 'dasar_penentuan_panen' => 'dasar penentuan panen', + 'frekuensi_panen_pertahun' => 'frekuensi panen per tahun', + 'bulan_panen_utama' => 'bulan panen utama', + 'hasil_komoditas_utama_permusim' => 'hasil komoditas utama per musim', + 'hasil_komoditas_lainnya_permusim' => 'hasil komoditas lainnya per musim', + 'disimpan_untuk_sendiri' => 'disimpan untuk sendiri', + 'hasil_panen_disimpan' => 'hasil panen yang disimpan', + 'tujuan_disimpan' => 'tujuan disimpan', + + // Sortasi & Reject + 'praktik_sortasi' => 'praktik sortasi', + 'bentuk_sortasi' => 'bentuk sortasi', + 'tingkat_reject' => 'tingkat reject', + 'hasil_panen_reject' => 'hasil panen reject', + 'tindakan_hasil_reject' => 'tindakan terhadap hasil reject', + + // Biaya Panen + 'upah_tenaga_panen' => 'upah tenaga panen', + 'biaya_pengangkutan' => 'biaya pengangkutan', + 'biaya_wadah_kemasan' => 'biaya wadah kemasan', + 'biaya_sewa_alat_panen' => 'biaya sewa alat panen', + 'biaya_panen_lainnya' => 'biaya panen lainnya', + 'total_estimasi_biaya_panen' => 'total estimasi biaya panen', + + // Kehilangan Hasil + 'estimasi_kehilangan_akibat_opt' => 'estimasi kehilangan akibat OPT', + 'estimasi_kehilangan_akibat_hama' => 'estimasi kehilangan akibat hama', + ]); + $dataPraktikBudidaya = []; + $dataSurveyPanen = []; $petani = Petani::findOrFail($petaniId); @@ -372,11 +551,13 @@ class PraktikBudidayaController extends Controller $teknik_pemangkasan[] = $request->teknik_pemangkasan_lainnya; } } - $data = [ + $teknikPemangkasan = array_values($teknik_pemangkasan); + + $dataPraktikBudidaya = [ 'tenaga_kerja' => $validatedData['tenaga_kerja'], 'frekuensi_pemangkasan_utama' => $validatedData['frekuensi_pemangkasan_komoditas_utama'], - 'teknik_pemangkasan' => array_values($teknikPemangkasan), + 'teknik_pemangkasan' => $teknikPemangkasan, 'frekuensi_pemangkasan_penaung' => $validatedData['frekuensi_pemangkasan_pohon_penaung'], 'penyerbukan_manual' => $validatedData['penyerbukan_manual'] ?? null, @@ -393,7 +574,7 @@ class PraktikBudidayaController extends Controller } if ($request->has('metode_penanganan_hama_penyakit')) { - $data = [ + $dataPraktikBudidaya = [ 'metode_penanganan_opt' => $validatedData['metode_penanganan_hama_penyakit'] ?? null, 'jenis_hama' => $validatedData['jenis_hama'] ?? [], 'jenis_penyakit' => $validatedData['jenis_penyakit'] ?? [], @@ -413,7 +594,75 @@ class PraktikBudidayaController extends Controller ]; } - $praktikBudidaya->update($data); + if ($request->has('upah_tenaga_kerja')) { + $dataPraktikBudidaya = [ + 'upah_tenaga_kerja' => $validatedData['upah_tenaga_kerja'] ?? null, + 'biaya_bibit' => $validatedData['biaya_bibit'] ?? null, + 'biaya_pupuk' => $validatedData['biaya_pupuk'] ?? null, + 'biaya_obat_obatan' => $validatedData['biaya_pestisida'] ?? null, + 'biaya_sewa_alat_produksi' => $validatedData['biaya_sewa_alat'] ?? null, + 'biaya_penyediaan_air' => $validatedData['biaya_penyediaan_air'] ?? null, + 'biaya_produksi_lainnya' => $validatedData['biaya_lainnya'] ?? null, + 'total_estimasi_biaya_produksi' => $validatedData['total_estimasi_biaya_produksi'] ?? null, + ]; + } + + if ($request->has('dasar_penentuan_panen')) { + $dataSurveyPanen = [ + 'dasar_penentuan_panen' => $validatedData['dasar_penentuan_panen'] ?? null, + 'frekuensi_panen_pertahun' => $validatedData['frekuensi_panen_pertahun'] ?? null, + 'bulan_panen_utama' => $validatedData['bulan_panen_utama'] ?? null, + 'hasil_komoditas_utama_permusim' => $validatedData['hasil_komoditas_utama_permusim'] ?? null, + 'hasil_komoditas_lainnya_permusim' => $validatedData['hasil_komoditas_lainnya_permusim'] ?? null, + 'disimpan_untuk_sendiri' => $validatedData['disimpan_untuk_sendiri'] ?? false, + 'hasil_panen_disimpan' => $validatedData['hasil_panen_disimpan'] ?? null, + 'tujuan_disimpan' => $validatedData['tujuan_disimpan'] ?? null, + ]; + } + + if ($request->has('praktik_sortasi')) { + $dataSurveyPanen = [ + 'praktik_sortasi' => $validatedData['praktik_sortasi'] ?? null, + 'bentuk_sortasi' => $validatedData['bentuk_sortasi'] ?? null, + 'hasil_panen_reject' => $validatedData['tingkat_reject'] ?? null, + 'jumlah_panen_reject' => $validatedData['hasil_panen_reject'] ?? null, + 'tindakan_panen_reject' => $validatedData['tindakan_hasil_reject'] ?? null, + 'upah_tenaga_panen' => $validatedData['upah_tenaga_panen'] ?? null, + 'biaya_pengangkutan_panen' => $validatedData['biaya_pengangkutan'] ?? null, + 'biaya_wadah_panen' => $validatedData['biaya_wadah_kemasan'] ?? null, + 'biaya_sewa_alat_panen' => $validatedData['biaya_sewa_alat_panen'] ?? null, + 'biaya_panen_lainnya' => $validatedData['biaya_panen_lainnya'] ?? null, + 'total_estimasi_biaya_panen' => $validatedData['total_estimasi_biaya_panen'] ?? null, + ]; + } + + if ($request->has('estimasi_kehilangan_akibat_opt')) { + $dataSurveyPanen = [ + 'estimasi_kehilangan_akibat_opt' => $validatedData['estimasi_kehilangan_akibat_opt'] ?? null, + 'estimasi_kehilangan_akibat_hama_penyakit' => $validatedData['estimasi_kehilangan_akibat_hama'] ?? null, + ]; + } + + if (!empty($dataPraktikBudidaya)) { + $dataPraktikBudidaya['updated_by'] = auth()->id(); + $praktikBudidaya->update($dataPraktikBudidaya); + } + + if (!empty($dataSurveyPanen)) { + $surveyPanen = SurveyPanen::where('petani_id', $petani->id)->first(); + + if ($surveyPanen) { + $dataSurveyPanen['updated_by'] = auth()->id(); + $surveyPanen->update($dataSurveyPanen); + } else { + SurveyPanen::create(array_merge([ + 'uid' => 'SP-' . strtoupper(Str::random(10)), + 'petani_id' => $petani->id, + 'created_by' => auth()->id(), + 'updated_by_by' => auth()->id() + ], $dataSurveyPanen)); + } + } return back()->with('success', 'Data berhasil diperbarui.'); } diff --git a/app/Http/Controllers/Web/Produktivitas/SosialEkonomiController.php b/app/Http/Controllers/Web/Produktivitas/SosialEkonomiController.php index 632dcb3..16e08f0 100644 --- a/app/Http/Controllers/Web/Produktivitas/SosialEkonomiController.php +++ b/app/Http/Controllers/Web/Produktivitas/SosialEkonomiController.php @@ -3,15 +3,44 @@ namespace App\Http\Controllers\Web\Produktivitas; use App\Http\Controllers\Controller; -use App\Enums\KategoriPendapatanKomoditas; -use App\Enums\PeriodePendapatan; -use App\Enums\PihakMembantuKonflik; -use App\Enums\SkorKecukupanPenghasilan; -use App\Enums\SkorKejelasanStatusLahan; -use App\Enums\SkorKemampuanMenabung; -use App\Enums\SkorPeriodePaceklik; -use App\Enums\StatusKepemilikanLahanSosialEkonomi; -use App\Enums\StatusKonflik; +use App\Enums\SosialEkonomi\AlasanKreditDitolak; +use App\Enums\SosialEkonomi\BisaBeliPupukBersubsidi; +use App\Enums\SosialEkonomi\JenisAsetProduktif; +use App\Enums\SosialEkonomi\KategoriPendapatanKomoditas; +use App\Enums\SosialEkonomi\KemauanIkutProgram; +use App\Enums\SosialEkonomi\KemauanMencobaPraktikBaru; +use App\Enums\SosialEkonomi\KeaktifanPertemuanKelompok; +use App\Enums\SosialEkonomi\KedekatanSesamaAnggota; +use App\Enums\SosialEkonomi\KebebasanMemilihPembeli; +use App\Enums\SosialEkonomi\KeterikatanHutangPanen; +use App\Enums\SosialEkonomi\KeterlibatanProgramKeuanganFormal; +use App\Enums\SosialEkonomi\KondisiAsetProduktif; +use App\Enums\SosialEkonomi\ManfaatKelompokTani; +use App\Enums\SosialEkonomi\MinatPembeliHargaStabil; +use App\Enums\SosialEkonomi\OrientasiRencanaJangkaPanjang; +use App\Enums\SosialEkonomi\PanutanPetaniSukses; +use App\Enums\SosialEkonomi\PemahamanMutuHarga; +use App\Enums\SosialEkonomi\PengetahuanHargaHasilOlah; +use App\Enums\SosialEkonomi\PengalamanKreditKebun; +use App\Enums\SosialEkonomi\PeriodePendapatan; +use App\Enums\SosialEkonomi\PeranDalamKelompok; +use App\Enums\SosialEkonomi\PernahBantuanNgoPerusahaan; +use App\Enums\SosialEkonomi\PernahJualHargaLebihTinggi; +use App\Enums\SosialEkonomi\PinjamanTokohAdatPanen; +use App\Enums\SosialEkonomi\PihakMembantuKonflik; +use App\Enums\SosialEkonomi\PraktikIjon; +use App\Enums\SosialEkonomi\SkorKecukupanPenghasilan; +use App\Enums\SosialEkonomi\SkorKejelasanStatusLahan; +use App\Enums\SosialEkonomi\SkorKemampuanMenabung; +use App\Enums\SosialEkonomi\SkorPeriodePaceklik; +use App\Enums\SosialEkonomi\StatusKartuTani; +use App\Enums\SosialEkonomi\StatusKepemilikanLahanSosialEkonomi; +use App\Enums\SosialEkonomi\StatusKonflik; +use App\Enums\SosialEkonomi\StatusProgramKeuanganFormal; +use App\Enums\SosialEkonomi\StatusRekeningTabungan; +use App\Enums\SosialEkonomi\TekananJualSegera; +use App\Enums\SosialEkonomi\TerdaftarKelompokTani; +use App\Enums\SosialEkonomi\UsahaMutuTambahanHarga; use App\Models\Pertanian\Komoditas; use App\Models\Pertanian\Lahan; use App\Models\Pertanian\Petani; @@ -35,20 +64,14 @@ class SosialEkonomiController extends Controller ->where('petani_id', $petaniId) ->first(); - $pendapatanKomoditas = $sosialEkonomi?->pendapatanKomoditas ?? collect(); - $pendapatanKomoditasUtama = $pendapatanKomoditas->where('kategori', 'utama')->values(); - $pendapatanKomoditasLainnya = $pendapatanKomoditas->where('kategori', 'lainnya')->values(); - $pendapatanLuarPertanian = $sosialEkonomi?->pendapatanLuarPertanian?->values() ?? collect(); - $komoditasPetani = $this->komoditasPetani($petani); - - return view('produktivitas.petani.sosial-ekonomi.index', array_merge(compact( - 'petani', - 'sosialEkonomi', - 'pendapatanKomoditasUtama', - 'pendapatanKomoditasLainnya', - 'pendapatanLuarPertanian', - 'komoditasPetani' - ), $this->sosialEkonomiOptions())); + return $this->formView( + request(), + $petani, + $sosialEkonomi, + $sosialEkonomi + ? 'produktivitas.petani.sosial-ekonomi.edit' + : 'produktivitas.petani.sosial-ekonomi.index' + ); } public function index(Request $request, Petani $petani) @@ -163,7 +186,7 @@ class SosialEkonomiController extends Controller $validated = $this->validateData($request, $sosialEkonomi->id); $sosialEkonomi = DB::transaction(function () use ($request, $validated, $sosialEkonomi) { - $sosialEkonomi->update($this->sosialEkonomiPayload($validated) + [ + $sosialEkonomi->update($this->sosialEkonomiPayload($validated, $sosialEkonomi) + [ 'updated_by' => auth()->id(), ]); @@ -212,14 +235,17 @@ class SosialEkonomiController extends Controller private function validateData(Request $request, ?int $id = null): array { - return $request->validate([ + $section = $request->input('form_section'); + + $rules = [ + 'form_section' => ['required', 'string', Rule::in(['utama', 'sosial_budaya', 'keanggotaan_kelompok', 'akses_keuangan', 'keterikatan_hutang'])], 'uid' => [ 'nullable', 'string', 'max:255', Rule::unique('sosial_ekonomi', 'uid')->ignore($id), ], - 'petani_id' => ['nullable', 'exists:petani,id'], + 'petani_id' => ['required', 'exists:petani,id'], 'jumlah_tanggungan' => ['nullable', 'integer', 'min:0'], 'anak_masih_sekolah' => ['nullable', 'integer', 'min:0'], 'yang_ikut_bekerja' => ['nullable', 'integer', 'min:0'], @@ -240,6 +266,67 @@ class SosialEkonomiController extends Controller 'pihak_membantu_konflik_nama' => ['nullable', 'string', 'max:255'], 'tahun_bantuan_konflik' => ['nullable', 'integer', 'digits:4'], 'status_konflik' => ['nullable', 'string', Rule::in(StatusKonflik::values())], + 'kemauan_mencoba_praktik_baru' => ['nullable', 'integer', Rule::in(KemauanMencobaPraktikBaru::values())], + 'alasan_mencoba_praktik_baru' => ['nullable', 'string'], + 'hambatan_mengubah_cara_bertani' => ['nullable', 'string'], + 'pemahaman_mutu_harga' => ['nullable', 'integer', Rule::in(PemahamanMutuHarga::values())], + 'contoh_pemahaman_mutu_harga' => ['nullable', 'string'], + 'pengetahuan_harga_hasil_olah' => ['nullable', 'string', Rule::in(PengetahuanHargaHasilOlah::values())], + 'pernah_jual_harga_lebih_tinggi' => ['nullable', 'string', Rule::in(PernahJualHargaLebihTinggi::values())], + 'penyebab_harga_lebih_tinggi' => ['nullable', 'string'], + 'usaha_mutu_tambahan_harga' => ['nullable', 'string', Rule::in(UsahaMutuTambahanHarga::values())], + 'alasan_usaha_mutu_tambahan_harga' => ['nullable', 'string'], + 'panutan_petani_sukses' => ['nullable', 'integer', Rule::in(PanutanPetaniSukses::values())], + 'nama_lokasi_panutan' => ['nullable', 'string'], + 'kemauan_ikut_program' => ['nullable', 'integer', Rule::in(KemauanIkutProgram::values())], + 'harapan_program' => ['nullable', 'string'], + 'orientasi_rencana_jangka_panjang' => ['nullable', 'integer', Rule::in(OrientasiRencanaJangkaPanjang::values())], + 'rencana_jangka_panjang' => ['nullable', 'string'], + 'terdaftar_kelompok_tani' => ['nullable', 'string', Rule::in(TerdaftarKelompokTani::values())], + 'nama_kelompok_tani' => ['nullable', 'string', 'max:255'], + 'lama_bergabung_kelompok_tahun' => ['nullable', 'integer', 'min:0'], + 'kedekatan_sesama_anggota' => ['nullable', 'string', Rule::in(KedekatanSesamaAnggota::values())], + 'keaktifan_pertemuan_kelompok' => ['nullable', 'integer', Rule::in(KeaktifanPertemuanKelompok::values())], + 'topik_biasa_dibahas' => ['nullable', 'string'], + 'peran_dalam_kelompok' => ['nullable', 'integer', Rule::in(PeranDalamKelompok::values())], + 'manfaat_kelompok_tani' => ['nullable', 'integer', Rule::in(ManfaatKelompokTani::values())], + 'status_kartu_tani' => ['nullable', 'string', Rule::in(StatusKartuTani::values())], + 'bisa_beli_pupuk_bersubsidi' => ['nullable', 'string', Rule::in(BisaBeliPupukBersubsidi::values())], + 'manfaat_lain_kartu_tani' => ['nullable', 'string'], + 'status_rekening_tabungan' => ['nullable', 'integer', Rule::in(StatusRekeningTabungan::values())], + 'nama_bank' => ['nullable', 'string', 'max:255'], + 'pengalaman_kredit_kebun' => ['nullable', 'integer', Rule::in(PengalamanKreditKebun::values())], + 'alasan_kredit_ditolak' => ['nullable', 'array'], + 'alasan_kredit_ditolak.*' => ['string', Rule::in(AlasanKreditDitolak::values())], + 'alasan_kredit_ditolak_lainnya' => ['nullable', 'string', 'max:255'], + 'kondisi_aset_produktif' => ['nullable', 'integer', Rule::in(KondisiAsetProduktif::values())], + 'jenis_aset_produktif' => ['nullable', 'array'], + 'jenis_aset_produktif.*' => ['string', Rule::in(JenisAsetProduktif::values())], + 'jenis_aset_produktif_lainnya' => ['nullable', 'string', 'max:255'], + 'keterangan_kondisi_aset' => ['nullable', 'string'], + 'keterlibatan_program_keuangan_formal' => ['nullable', 'integer', Rule::in(KeterlibatanProgramKeuanganFormal::values())], + 'status_program_keuangan_formal' => ['nullable', 'array'], + 'status_program_keuangan_formal.*' => ['nullable', 'string', Rule::in(StatusProgramKeuanganFormal::values())], + 'program_keuangan_formal_lainnya_nama' => ['nullable', 'string', 'max:255'], + 'pernah_bantuan_ngo_perusahaan' => ['nullable', 'string', Rule::in(PernahBantuanNgoPerusahaan::values())], + 'detail_bantuan_ngo_perusahaan' => ['nullable', 'array'], + 'detail_bantuan_ngo_perusahaan.*.nama_lembaga' => ['nullable', 'string', 'max:255'], + 'detail_bantuan_ngo_perusahaan.*.bentuk_bantuan' => ['nullable', 'string', 'max:255'], + 'detail_bantuan_ngo_perusahaan.*.frekuensi' => ['nullable', 'integer', 'min:0'], + 'detail_bantuan_ngo_perusahaan.*.tahun_terakhir' => ['nullable', 'integer', 'digits:4'], + 'keterikatan_hutang_panen' => ['nullable', 'integer', Rule::in(KeterikatanHutangPanen::values())], + 'pinjaman_tokoh_adat_panen' => ['nullable', 'string', Rule::in(PinjamanTokohAdatPanen::values())], + 'keterangan_pinjaman_tokoh_adat' => ['nullable', 'string'], + 'total_hutang_rupiah' => ['nullable', 'integer', 'min:0'], + 'total_hutang_setara_kg_panen' => ['nullable', 'numeric', 'min:0'], + 'total_hutang_tidak_bersedia' => ['nullable', 'boolean'], + 'praktik_ijon' => ['nullable', 'integer', Rule::in(PraktikIjon::values())], + 'tekanan_jual_segera' => ['nullable', 'string', Rule::in(TekananJualSegera::values())], + 'penyebab_tekanan_jual_segera' => ['nullable', 'string'], + 'kebebasan_memilih_pembeli' => ['nullable', 'integer', Rule::in(KebebasanMemilihPembeli::values())], + 'alasan_tidak_bebas_memilih_pembeli' => ['nullable', 'string'], + 'minat_pembeli_harga_stabil' => ['nullable', 'string', Rule::in(MinatPembeliHargaStabil::values())], + 'alasan_minat_pembeli_harga_stabil' => ['nullable', 'string'], 'pendapatan_komoditas' => ['nullable', 'array'], 'pendapatan_komoditas.*.kategori' => ['required_with:pendapatan_komoditas', 'string', Rule::in(KategoriPendapatanKomoditas::values())], @@ -250,18 +337,209 @@ class SosialEkonomiController extends Controller 'pendapatan_luar_pertanian' => ['nullable', 'array'], 'pendapatan_luar_pertanian.*.jenis_pekerjaan' => ['nullable', 'string', 'max:255'], 'pendapatan_luar_pertanian.*.estimasi_per_bulan' => ['nullable', 'integer', 'min:0'], - ]); + ]; + + if ($section === 'utama') { + $rules = array_merge($rules, [ + 'jumlah_tanggungan' => ['required', 'integer', 'min:0'], + 'anak_masih_sekolah' => ['required', 'integer', 'min:0'], + 'yang_ikut_bekerja' => ['required', 'integer', 'min:0'], + 'skor_periode_paceklik' => ['required', 'integer', Rule::in(SkorPeriodePaceklik::values())], + 'bulan_paceklik' => ['required', 'string', 'max:255'], + 'sumber_penghasilan_paceklik' => ['required', 'string'], + 'total_estimasi_biaya_kebun_per_musim' => ['required', 'integer', 'min:0'], + 'skor_kemampuan_menabung' => ['required', 'integer', Rule::in(SkorKemampuanMenabung::values())], + 'estimasi_tabungan_per_bulan' => ['required', 'integer', 'min:0'], + 'skor_kecukupan_penghasilan' => ['required', 'integer', Rule::in(SkorKecukupanPenghasilan::values())], + 'alasan_kecukupan_penghasilan' => ['required', 'string'], + 'status_kepemilikan_lahan' => ['required', 'string', Rule::in(StatusKepemilikanLahanSosialEkonomi::values())], + 'skor_kejelasan_status_lahan' => ['required', 'integer', Rule::in(SkorKejelasanStatusLahan::values())], + 'ada_sertifikat_dokumen' => ['required', 'boolean'], + 'ada_sengketa' => ['required', 'boolean'], + 'keterangan_sengketa' => ['required_if:ada_sengketa,1', 'nullable', 'string'], + 'pihak_membantu_konflik' => ['required_if:ada_sengketa,1', 'nullable', 'string', Rule::in(PihakMembantuKonflik::values())], + 'pihak_membantu_konflik_nama' => ['required_if:pihak_membantu_konflik,' . PihakMembantuKonflik::ADA->value, 'nullable', 'string', 'max:255'], + 'tahun_bantuan_konflik' => ['required_if:pihak_membantu_konflik,' . PihakMembantuKonflik::ADA->value, 'nullable', 'integer', 'digits:4'], + 'status_konflik' => ['required_if:ada_sengketa,1', 'nullable', 'string', Rule::in(StatusKonflik::values())], + ]); + } + + if ($section === 'sosial_budaya') { + $rules = array_merge($rules, [ + 'kemauan_mencoba_praktik_baru' => ['required', 'integer', Rule::in(KemauanMencobaPraktikBaru::values())], + 'alasan_mencoba_praktik_baru' => ['required', 'string'], + 'hambatan_mengubah_cara_bertani' => ['required', 'string'], + 'pemahaman_mutu_harga' => ['required', 'integer', Rule::in(PemahamanMutuHarga::values())], + 'contoh_pemahaman_mutu_harga' => ['required', 'string'], + 'pengetahuan_harga_hasil_olah' => ['required', 'string', Rule::in(PengetahuanHargaHasilOlah::values())], + 'pernah_jual_harga_lebih_tinggi' => ['required', 'string', Rule::in(PernahJualHargaLebihTinggi::values())], + 'penyebab_harga_lebih_tinggi' => ['required_if:pernah_jual_harga_lebih_tinggi,' . PernahJualHargaLebihTinggi::PERNAH->value, 'nullable', 'string'], + 'usaha_mutu_tambahan_harga' => ['required', 'string', Rule::in(UsahaMutuTambahanHarga::values())], + 'alasan_usaha_mutu_tambahan_harga' => ['required_if:usaha_mutu_tambahan_harga,' . UsahaMutuTambahanHarga::TIDAK_SEBANDING_TERLALU_BANYAK_USAHA->value, 'nullable', 'string'], + 'panutan_petani_sukses' => ['required', 'integer', Rule::in(PanutanPetaniSukses::values())], + 'nama_lokasi_panutan' => ['required_unless:panutan_petani_sukses,' . PanutanPetaniSukses::TIDAK_ADA->value, 'nullable', 'string'], + 'kemauan_ikut_program' => ['required', 'integer', Rule::in(KemauanIkutProgram::values())], + 'harapan_program' => ['required', 'string'], + 'orientasi_rencana_jangka_panjang' => ['required', 'integer', Rule::in(OrientasiRencanaJangkaPanjang::values())], + 'rencana_jangka_panjang' => ['required', 'string'], + ]); + } + + if ($section === 'keanggotaan_kelompok') { + $rules = array_merge($rules, [ + 'terdaftar_kelompok_tani' => ['nullable', 'string', Rule::in(TerdaftarKelompokTani::values())], + 'nama_kelompok_tani' => ['required_if:terdaftar_kelompok_tani,' . TerdaftarKelompokTani::YA->value, 'nullable', 'string', 'max:255'], + 'lama_bergabung_kelompok_tahun' => ['required_if:terdaftar_kelompok_tani,' . TerdaftarKelompokTani::YA->value, 'nullable', 'integer', 'min:0'], + 'kedekatan_sesama_anggota' => ['required_if:terdaftar_kelompok_tani,' . TerdaftarKelompokTani::YA->value, 'nullable', 'string', Rule::in(KedekatanSesamaAnggota::values())], + 'keaktifan_pertemuan_kelompok' => ['required', 'integer', Rule::in(KeaktifanPertemuanKelompok::values())], + 'topik_biasa_dibahas' => ['required', 'string'], + 'peran_dalam_kelompok' => ['required', 'integer', Rule::in(PeranDalamKelompok::values())], + 'manfaat_kelompok_tani' => ['required', 'integer', Rule::in(ManfaatKelompokTani::values())], + 'status_kartu_tani' => ['nullable', 'string', Rule::in(StatusKartuTani::values())], + 'bisa_beli_pupuk_bersubsidi' => ['nullable', 'string', Rule::in(BisaBeliPupukBersubsidi::values())], + 'manfaat_lain_kartu_tani' => ['nullable', 'string'], + ]); + } + + if ($section === 'akses_keuangan') { + $pengalamanKredit = (int) $request->input('pengalaman_kredit_kebun'); + $kondisiAset = (int) $request->input('kondisi_aset_produktif'); + $tidakPernahMenerimaProgram = (int) $request->input('keterlibatan_program_keuangan_formal') === KeterlibatanProgramKeuanganFormal::TIDAK_PERNAH_MENERIMA->value; + + $rules = array_merge($rules, [ + 'status_rekening_tabungan' => ['required', 'integer', Rule::in(StatusRekeningTabungan::values())], + 'nama_bank' => [ + Rule::requiredIf(fn () => (int) $request->input('status_rekening_tabungan') > StatusRekeningTabungan::TIDAK_PUNYA_REKENING->value), + 'nullable', + 'string', + 'max:255', + ], + 'pengalaman_kredit_kebun' => ['required', 'integer', Rule::in(PengalamanKreditKebun::values())], + 'alasan_kredit_ditolak' => [ + Rule::requiredIf(fn () => in_array($pengalamanKredit, [ + PengalamanKreditKebun::TIDAK_PERNAH_MENCOBA->value, + PengalamanKreditKebun::PERNAH_COBA_DITOLAK->value, + ], true)), + 'nullable', + 'array', + ], + 'alasan_kredit_ditolak.*' => ['string', Rule::in(AlasanKreditDitolak::values())], + 'alasan_kredit_ditolak_lainnya' => [ + Rule::requiredIf(fn () => in_array(AlasanKreditDitolak::LAINNYA->value, $request->input('alasan_kredit_ditolak', []), true)), + 'nullable', + 'string', + 'max:255', + ], + 'kondisi_aset_produktif' => ['required', 'integer', Rule::in(KondisiAsetProduktif::values())], + 'jenis_aset_produktif' => [ + Rule::requiredIf(fn () => $kondisiAset > KondisiAsetProduktif::TIDAK_ADA->value), + 'nullable', + 'array', + ], + 'jenis_aset_produktif.*' => ['string', Rule::in(JenisAsetProduktif::values())], + 'jenis_aset_produktif_lainnya' => [ + Rule::requiredIf(fn () => in_array(JenisAsetProduktif::LAINNYA->value, $request->input('jenis_aset_produktif', []), true)), + 'nullable', + 'string', + 'max:255', + ], + 'keterangan_kondisi_aset' => [ + Rule::requiredIf(fn () => $kondisiAset > KondisiAsetProduktif::TIDAK_ADA->value), + 'nullable', + 'string', + ], + 'keterlibatan_program_keuangan_formal' => ['required', 'integer', Rule::in(KeterlibatanProgramKeuanganFormal::values())], + 'status_program_keuangan_formal' => [Rule::requiredIf(fn () => !$tidakPernahMenerimaProgram), 'nullable', 'array'], + 'status_program_keuangan_formal.pkh' => [Rule::requiredIf(fn () => !$tidakPernahMenerimaProgram), 'nullable', 'string', Rule::in(StatusProgramKeuanganFormal::values())], + 'status_program_keuangan_formal.blt' => [Rule::requiredIf(fn () => !$tidakPernahMenerimaProgram), 'nullable', 'string', Rule::in(StatusProgramKeuanganFormal::values())], + 'status_program_keuangan_formal.kur' => [Rule::requiredIf(fn () => !$tidakPernahMenerimaProgram), 'nullable', 'string', Rule::in(StatusProgramKeuanganFormal::values())], + 'status_program_keuangan_formal.kredit_koperasi_resmi' => [Rule::requiredIf(fn () => !$tidakPernahMenerimaProgram), 'nullable', 'string', Rule::in(StatusProgramKeuanganFormal::values())], + 'status_program_keuangan_formal.credit_union_cu' => [Rule::requiredIf(fn () => !$tidakPernahMenerimaProgram), 'nullable', 'string', Rule::in(StatusProgramKeuanganFormal::values())], + 'status_program_keuangan_formal.pinjaman_bumdes' => [Rule::requiredIf(fn () => !$tidakPernahMenerimaProgram), 'nullable', 'string', Rule::in(StatusProgramKeuanganFormal::values())], + 'status_program_keuangan_formal.modal_hibah_dinas_pertanian' => [Rule::requiredIf(fn () => !$tidakPernahMenerimaProgram), 'nullable', 'string', Rule::in(StatusProgramKeuanganFormal::values())], + 'status_program_keuangan_formal.lainnya' => ['nullable', 'string', Rule::in(StatusProgramKeuanganFormal::values())], + 'program_keuangan_formal_lainnya_nama' => [ + Rule::requiredIf(fn () => !$tidakPernahMenerimaProgram && filled($request->input('status_program_keuangan_formal.lainnya'))), + 'nullable', + 'string', + 'max:255', + ], + 'pernah_bantuan_ngo_perusahaan' => ['required', 'string', Rule::in(PernahBantuanNgoPerusahaan::values())], + 'detail_bantuan_ngo_perusahaan' => [ + Rule::requiredIf(fn () => $request->input('pernah_bantuan_ngo_perusahaan') === PernahBantuanNgoPerusahaan::PERNAH->value), + 'nullable', + 'array', + ], + 'detail_bantuan_ngo_perusahaan.0.nama_lembaga' => [ + Rule::requiredIf(fn () => $request->input('pernah_bantuan_ngo_perusahaan') === PernahBantuanNgoPerusahaan::PERNAH->value), + 'nullable', + 'string', + 'max:255', + ], + 'detail_bantuan_ngo_perusahaan.0.bentuk_bantuan' => [ + Rule::requiredIf(fn () => $request->input('pernah_bantuan_ngo_perusahaan') === PernahBantuanNgoPerusahaan::PERNAH->value), + 'nullable', + 'string', + 'max:255', + ], + 'detail_bantuan_ngo_perusahaan.0.frekuensi' => [ + Rule::requiredIf(fn () => $request->input('pernah_bantuan_ngo_perusahaan') === PernahBantuanNgoPerusahaan::PERNAH->value), + 'nullable', + 'integer', + 'min:0', + ], + 'detail_bantuan_ngo_perusahaan.0.tahun_terakhir' => [ + Rule::requiredIf(fn () => $request->input('pernah_bantuan_ngo_perusahaan') === PernahBantuanNgoPerusahaan::PERNAH->value), + 'nullable', + 'integer', + 'digits:4', + ], + ]); + } + + if ($section === 'keterikatan_hutang') { + $totalHutangTidakBersedia = $request->boolean('total_hutang_tidak_bersedia'); + $kebebasanMemilihPembeli = (int) $request->input('kebebasan_memilih_pembeli'); + + $rules = array_merge($rules, [ + 'keterikatan_hutang_panen' => ['required', 'integer', Rule::in(KeterikatanHutangPanen::values())], + 'pinjaman_tokoh_adat_panen' => ['required', 'string', Rule::in(PinjamanTokohAdatPanen::values())], + 'keterangan_pinjaman_tokoh_adat' => ['required_if:pinjaman_tokoh_adat_panen,' . PinjamanTokohAdatPanen::ADA->value, 'nullable', 'string'], + 'total_hutang_rupiah' => [ + Rule::requiredIf(fn () => !$totalHutangTidakBersedia && !filled($request->input('total_hutang_setara_kg_panen'))), + 'nullable', + 'integer', + 'min:0', + ], + 'total_hutang_setara_kg_panen' => ['nullable', 'numeric', 'min:0'], + 'total_hutang_tidak_bersedia' => ['nullable', 'boolean'], + 'praktik_ijon' => ['required', 'integer', Rule::in(PraktikIjon::values())], + 'tekanan_jual_segera' => ['required', 'string', Rule::in(TekananJualSegera::values())], + 'penyebab_tekanan_jual_segera' => ['required_if:tekanan_jual_segera,' . TekananJualSegera::ADA->value, 'nullable', 'string'], + 'kebebasan_memilih_pembeli' => ['required', 'integer', Rule::in(KebebasanMemilihPembeli::values())], + 'alasan_tidak_bebas_memilih_pembeli' => [ + Rule::requiredIf(fn () => $kebebasanMemilihPembeli > 0 && $kebebasanMemilihPembeli < KebebasanMemilihPembeli::CUKUP_BEBAS_SESEKALI_PINDAH->value), + 'nullable', + 'string', + ], + 'minat_pembeli_harga_stabil' => ['required', 'string', Rule::in(MinatPembeliHargaStabil::values())], + 'alasan_minat_pembeli_harga_stabil' => ['required', 'string'], + ]); + } + + return $request->validate($rules, $this->validationMessages(), $this->validationAttributes()); } - private function sosialEkonomiPayload(array $validated): array + private function sosialEkonomiPayload(array $validated, ?SosialEkonomi $sosialEkonomi = null): array { $payload = collect($validated) - ->except(['pendapatan_komoditas', 'pendapatan_luar_pertanian']) - ->merge([ - 'uid' => $validated['uid'] ?? 'SEK-' . Str::uuid(), - ]) + ->except(['form_section', 'pendapatan_komoditas', 'pendapatan_luar_pertanian']) ->all(); + if (!$sosialEkonomi && !array_key_exists('uid', $payload)) { + $payload['uid'] = 'SEK-' . Str::uuid(); + } + $payload = $this->normalizeSkorPayload($payload); if (($payload['pihak_membantu_konflik'] ?? null) === PihakMembantuKonflik::TIDAK_ADA_SELESAIKAN_SENDIRI->value) { @@ -269,9 +547,241 @@ class SosialEkonomiController extends Controller $payload['tahun_bantuan_konflik'] = null; } + if ( + array_key_exists('pernah_jual_harga_lebih_tinggi', $payload) + && ($payload['pernah_jual_harga_lebih_tinggi'] ?? null) !== PernahJualHargaLebihTinggi::PERNAH->value + ) { + $payload['penyebab_harga_lebih_tinggi'] = null; + } + + if ( + array_key_exists('panutan_petani_sukses', $payload) + && (int) ($payload['panutan_petani_sukses'] ?? 0) === PanutanPetaniSukses::TIDAK_ADA->value + ) { + $payload['nama_lokasi_panutan'] = null; + } + + if ( + array_key_exists('terdaftar_kelompok_tani', $payload) + && ($payload['terdaftar_kelompok_tani'] ?? null) === TerdaftarKelompokTani::TIDAK->value + ) { + $payload['nama_kelompok_tani'] = null; + $payload['lama_bergabung_kelompok_tahun'] = null; + $payload['kedekatan_sesama_anggota'] = null; + } + + if ( + array_key_exists('status_rekening_tabungan', $payload) + && (int) ($payload['status_rekening_tabungan'] ?? 0) === StatusRekeningTabungan::TIDAK_PUNYA_REKENING->value + ) { + $payload['nama_bank'] = null; + } + + if ( + array_key_exists('pengalaman_kredit_kebun', $payload) + && !in_array((int) ($payload['pengalaman_kredit_kebun'] ?? 0), [ + PengalamanKreditKebun::TIDAK_PERNAH_MENCOBA->value, + PengalamanKreditKebun::PERNAH_COBA_DITOLAK->value, + ], true) + ) { + $payload['alasan_kredit_ditolak'] = null; + $payload['alasan_kredit_ditolak_lainnya'] = null; + } + + if ( + array_key_exists('alasan_kredit_ditolak', $payload) + && !in_array(AlasanKreditDitolak::LAINNYA->value, $payload['alasan_kredit_ditolak'] ?? [], true) + ) { + $payload['alasan_kredit_ditolak_lainnya'] = null; + } + + if ( + array_key_exists('kondisi_aset_produktif', $payload) + && (int) ($payload['kondisi_aset_produktif'] ?? 0) === KondisiAsetProduktif::TIDAK_ADA->value + ) { + $payload['jenis_aset_produktif'] = null; + $payload['jenis_aset_produktif_lainnya'] = null; + $payload['keterangan_kondisi_aset'] = null; + } + + if ( + array_key_exists('jenis_aset_produktif', $payload) + && !in_array(JenisAsetProduktif::LAINNYA->value, $payload['jenis_aset_produktif'] ?? [], true) + ) { + $payload['jenis_aset_produktif_lainnya'] = null; + } + + if ( + array_key_exists('keterlibatan_program_keuangan_formal', $payload) + && (int) ($payload['keterlibatan_program_keuangan_formal'] ?? 0) === KeterlibatanProgramKeuanganFormal::TIDAK_PERNAH_MENERIMA->value + ) { + $payload['status_program_keuangan_formal'] = null; + $payload['program_keuangan_formal_lainnya_nama'] = null; + } + + if (!filled($payload['status_program_keuangan_formal']['lainnya'] ?? null)) { + $payload['program_keuangan_formal_lainnya_nama'] = null; + } + + if ( + array_key_exists('pernah_bantuan_ngo_perusahaan', $payload) + && ($payload['pernah_bantuan_ngo_perusahaan'] ?? null) === PernahBantuanNgoPerusahaan::TIDAK_PERNAH->value + ) { + $payload['detail_bantuan_ngo_perusahaan'] = null; + } + + if (array_key_exists('detail_bantuan_ngo_perusahaan', $payload) && is_array($payload['detail_bantuan_ngo_perusahaan'])) { + $payload['detail_bantuan_ngo_perusahaan'] = collect($payload['detail_bantuan_ngo_perusahaan']) + ->filter(fn ($row) => collect($row)->filter(fn ($value) => filled($value))->isNotEmpty()) + ->values() + ->all(); + } + + if ( + array_key_exists('pinjaman_tokoh_adat_panen', $payload) + && ($payload['pinjaman_tokoh_adat_panen'] ?? null) !== PinjamanTokohAdatPanen::ADA->value + ) { + $payload['keterangan_pinjaman_tokoh_adat'] = null; + } + + if (!empty($payload['total_hutang_tidak_bersedia'])) { + $payload['total_hutang_rupiah'] = null; + $payload['total_hutang_setara_kg_panen'] = null; + } + + if ( + array_key_exists('tekanan_jual_segera', $payload) + && ($payload['tekanan_jual_segera'] ?? null) !== TekananJualSegera::ADA->value + ) { + $payload['penyebab_tekanan_jual_segera'] = null; + } + + if ( + array_key_exists('kebebasan_memilih_pembeli', $payload) + && (int) ($payload['kebebasan_memilih_pembeli'] ?? 0) >= KebebasanMemilihPembeli::CUKUP_BEBAS_SESEKALI_PINDAH->value + ) { + $payload['alasan_tidak_bebas_memilih_pembeli'] = null; + } + return $payload; } + private function validationMessages(): array + { + return [ + 'required' => ':attribute wajib diisi.', + 'required_if' => ':attribute wajib diisi.', + 'required_unless' => ':attribute wajib diisi.', + 'required_with' => ':attribute wajib diisi.', + 'integer' => ':attribute harus berupa angka.', + 'numeric' => ':attribute harus berupa angka.', + 'boolean' => ':attribute harus dipilih.', + 'min' => ':attribute tidak boleh kurang dari :min.', + 'max' => ':attribute tidak boleh lebih dari :max karakter.', + 'digits' => ':attribute harus terdiri dari :digits digit.', + 'exists' => ':attribute tidak valid.', + 'in' => ':attribute tidak valid.', + 'array' => ':attribute harus berupa daftar data.', + 'string' => ':attribute harus berupa teks.', + 'unique' => ':attribute sudah digunakan.', + ]; + } + + private function validationAttributes(): array + { + return [ + 'form_section' => 'Bagian form', + 'petani_id' => 'Petani', + 'jumlah_tanggungan' => 'Jumlah tanggungan', + 'anak_masih_sekolah' => 'Anak masih sekolah', + 'yang_ikut_bekerja' => 'Yang ikut bekerja', + 'skor_periode_paceklik' => 'Periode paceklik', + 'bulan_paceklik' => 'Bulan paceklik biasanya', + 'sumber_penghasilan_paceklik' => 'Sumber penghasilan saat paceklik', + 'total_estimasi_biaya_kebun_per_musim' => 'Total estimasi biaya kebun per musim', + 'skor_kemampuan_menabung' => 'Kemampuan menabung', + 'estimasi_tabungan_per_bulan' => 'Estimasi tabungan per bulan', + 'skor_kecukupan_penghasilan' => 'Kecukupan penghasilan untuk keluarga', + 'alasan_kecukupan_penghasilan' => 'Alasan kecukupan penghasilan', + 'status_kepemilikan_lahan' => 'Status kepemilikan lahan', + 'skor_kejelasan_status_lahan' => 'Kejelasan status lahan', + 'ada_sertifikat_dokumen' => 'Ada sertifikat/dokumen', + 'ada_sengketa' => 'Ada sengketa', + 'keterangan_sengketa' => 'Keterangan sengketa', + 'pihak_membantu_konflik' => 'Pihak yang membantu', + 'pihak_membantu_konflik_nama' => 'Nama pihak', + 'tahun_bantuan_konflik' => 'Tahun bantuan', + 'status_konflik' => 'Status konflik', + 'kemauan_mencoba_praktik_baru' => 'Kemauan mencoba cara baru', + 'alasan_mencoba_praktik_baru' => 'Alasan mencoba praktik baru', + 'hambatan_mengubah_cara_bertani' => 'Hambatan utama mengubah cara berkebun', + 'pemahaman_mutu_harga' => 'Pemahaman mutu vs. harga jual', + 'contoh_pemahaman_mutu_harga' => 'Contoh/penjelasan petani', + 'pengetahuan_harga_hasil_olah' => 'Pengetahuan harga hasil olah', + 'pernah_jual_harga_lebih_tinggi' => 'Pengalaman jual dengan harga lebih tinggi', + 'penyebab_harga_lebih_tinggi' => 'Penyebab harga lebih tinggi', + 'usaha_mutu_tambahan_harga' => 'Usaha meningkatkan mutu vs. tambahan harga', + 'alasan_usaha_mutu_tambahan_harga' => 'Alasan usaha mutu tambahan harga', + 'panutan_petani_sukses' => 'Panutan di sekitar petani', + 'nama_lokasi_panutan' => 'Nama dan lokasi panutan', + 'kemauan_ikut_program' => 'Kemauan ikut program', + 'harapan_program' => 'Harapan dari program', + 'orientasi_rencana_jangka_panjang' => 'Orientasi rencana 3-5 tahun ke depan', + 'rencana_jangka_panjang' => 'Rencana yang akan dilakukan', + 'terdaftar_kelompok_tani' => 'Status terdaftar di kelompok tani', + 'nama_kelompok_tani' => 'Nama kelompok', + 'lama_bergabung_kelompok_tahun' => 'Lama bergabung', + 'kedekatan_sesama_anggota' => 'Kedekatan dengan sesama anggota', + 'keaktifan_pertemuan_kelompok' => 'Kehadiran dan keaktifan di pertemuan', + 'topik_biasa_dibahas' => 'Topik yang biasa dibahas', + 'peran_dalam_kelompok' => 'Jabatan atau peran di kelompok', + 'manfaat_kelompok_tani' => 'Manfaat dari kelompok tani', + 'status_kartu_tani' => 'Status Kartu Tani', + 'bisa_beli_pupuk_bersubsidi' => 'Kemampuan menggunakan Kartu Tani untuk membeli pupuk bersubsidi', + 'manfaat_lain_kartu_tani' => 'Manfaat lain setelah daftar Kartu Tani', + 'status_rekening_tabungan' => 'Status rekening atau tabungan', + 'nama_bank' => 'Nama bank', + 'pengalaman_kredit_kebun' => 'Pengalaman kredit untuk kebun', + 'alasan_kredit_ditolak' => 'Alasan kredit ditolak atau tidak jadi', + 'alasan_kredit_ditolak.*' => 'Alasan kredit ditolak atau tidak jadi', + 'alasan_kredit_ditolak_lainnya' => 'Alasan kredit lainnya', + 'kondisi_aset_produktif' => 'Kondisi aset produktif selain lahan', + 'jenis_aset_produktif' => 'Jenis aset', + 'jenis_aset_produktif.*' => 'Jenis aset', + 'jenis_aset_produktif_lainnya' => 'Jenis aset lainnya', + 'keterangan_kondisi_aset' => 'Keterangan kondisi aset', + 'keterlibatan_program_keuangan_formal' => 'Keterlibatan dalam program bantuan', + 'status_program_keuangan_formal' => 'Status per program', + 'status_program_keuangan_formal.*' => 'Status per program', + 'program_keuangan_formal_lainnya_nama' => 'Nama program lainnya', + 'pernah_bantuan_ngo_perusahaan' => 'Status bantuan NGO atau perusahaan', + 'detail_bantuan_ngo_perusahaan' => 'Detail bantuan NGO atau perusahaan', + 'detail_bantuan_ngo_perusahaan.*.nama_lembaga' => 'Nama lembaga', + 'detail_bantuan_ngo_perusahaan.*.bentuk_bantuan' => 'Bentuk bantuan', + 'detail_bantuan_ngo_perusahaan.*.frekuensi' => 'Frekuensi bantuan', + 'detail_bantuan_ngo_perusahaan.*.tahun_terakhir' => 'Tahun terakhir bantuan', + 'keterikatan_hutang_panen' => 'Hutang yang dikaitkan dengan hasil panen', + 'pinjaman_tokoh_adat_panen' => 'Pinjaman dari tokoh adat atau mosalaki terkait panen', + 'keterangan_pinjaman_tokoh_adat' => 'Keterangan pinjaman dari tokoh adat atau mosalaki', + 'total_hutang_rupiah' => 'Total hutang saat ini', + 'total_hutang_setara_kg_panen' => 'Total hutang setara hasil panen', + 'total_hutang_tidak_bersedia' => 'Status tidak bersedia menjawab total hutang', + 'praktik_ijon' => 'Praktik ijon', + 'tekanan_jual_segera' => 'Tekanan jual segera meski harga rendah', + 'penyebab_tekanan_jual_segera' => 'Penyebab tekanan jual segera', + 'kebebasan_memilih_pembeli' => 'Kebebasan memilih pembeli', + 'alasan_tidak_bebas_memilih_pembeli' => 'Alasan jika tidak bebas', + 'minat_pembeli_harga_stabil' => 'Minat ke pembeli harga stabil jangka panjang', + 'alasan_minat_pembeli_harga_stabil' => 'Alasan minat ke pembeli harga stabil', + 'pendapatan_komoditas.*.kategori' => 'Kategori pendapatan komoditas', + 'pendapatan_komoditas.*.komoditas' => 'Komoditas', + 'pendapatan_komoditas.*.pendapatan' => 'Pendapatan', + 'pendapatan_komoditas.*.periode' => 'Periode', + 'pendapatan_luar_pertanian.*.jenis_pekerjaan' => 'Jenis pekerjaan', + 'pendapatan_luar_pertanian.*.estimasi_per_bulan' => 'Estimasi per bulan', + ]; + } + private function normalizeSkorPayload(array $payload): array { foreach ([ @@ -279,6 +789,21 @@ class SosialEkonomiController extends Controller 'skor_kemampuan_menabung', 'skor_kecukupan_penghasilan', 'skor_kejelasan_status_lahan', + 'kemauan_mencoba_praktik_baru', + 'pemahaman_mutu_harga', + 'panutan_petani_sukses', + 'kemauan_ikut_program', + 'orientasi_rencana_jangka_panjang', + 'keaktifan_pertemuan_kelompok', + 'peran_dalam_kelompok', + 'manfaat_kelompok_tani', + 'status_rekening_tabungan', + 'pengalaman_kredit_kebun', + 'kondisi_aset_produktif', + 'keterlibatan_program_keuangan_formal', + 'keterikatan_hutang_panen', + 'praktik_ijon', + 'kebebasan_memilih_pembeli', ] as $field) { if (array_key_exists($field, $payload) && !is_null($payload[$field]) && $payload[$field] !== '') { $payload[$field] = (int) $payload[$field]; @@ -371,6 +896,62 @@ class SosialEkonomiController extends Controller 'pihakMembantuKonflikOptions' => PihakMembantuKonflik::options(), 'pihakMembantuTanpaBantuanValue' => PihakMembantuKonflik::TIDAK_ADA_SELESAIKAN_SENDIRI->value, 'statusKonflikOptions' => StatusKonflik::options(), + 'kemauanMencobaPraktikBaruOptions' => KemauanMencobaPraktikBaru::options(), + 'pemahamanMutuHargaOptions' => PemahamanMutuHarga::options(), + 'pengetahuanHargaHasilOlahOptions' => PengetahuanHargaHasilOlah::options(), + 'pernahJualHargaLebihTinggiOptions' => PernahJualHargaLebihTinggi::options(), + 'pernahJualHargaLebihTinggiPernahValue' => PernahJualHargaLebihTinggi::PERNAH->value, + 'usahaMutuTambahanHargaOptions' => UsahaMutuTambahanHarga::options(), + 'panutanPetaniSuksesOptions' => PanutanPetaniSukses::options(), + 'panutanPetaniSuksesTidakAdaValue' => PanutanPetaniSukses::TIDAK_ADA->value, + 'kemauanIkutProgramOptions' => KemauanIkutProgram::options(), + 'orientasiRencanaJangkaPanjangOptions' => OrientasiRencanaJangkaPanjang::options(), + 'terdaftarKelompokTaniOptions' => TerdaftarKelompokTani::options(), + 'terdaftarKelompokTaniYaValue' => TerdaftarKelompokTani::YA->value, + 'terdaftarKelompokTaniTidakValue' => TerdaftarKelompokTani::TIDAK->value, + 'kedekatanSesamaAnggotaOptions' => KedekatanSesamaAnggota::options(), + 'keaktifanPertemuanKelompokOptions' => KeaktifanPertemuanKelompok::options(), + 'peranDalamKelompokOptions' => PeranDalamKelompok::options(), + 'manfaatKelompokTaniOptions' => ManfaatKelompokTani::options(), + 'statusKartuTaniOptions' => StatusKartuTani::options(), + 'bisaBeliPupukBersubsidiOptions' => BisaBeliPupukBersubsidi::options(), + 'statusRekeningTabunganOptions' => StatusRekeningTabungan::options(), + 'statusRekeningTidakPunyaValue' => StatusRekeningTabungan::TIDAK_PUNYA_REKENING->value, + 'pengalamanKreditKebunOptions' => PengalamanKreditKebun::options(), + 'pengalamanKreditPerluAlasanValues' => [ + PengalamanKreditKebun::TIDAK_PERNAH_MENCOBA->value, + PengalamanKreditKebun::PERNAH_COBA_DITOLAK->value, + ], + 'alasanKreditDitolakOptions' => AlasanKreditDitolak::options(), + 'alasanKreditLainnyaValue' => AlasanKreditDitolak::LAINNYA->value, + 'kondisiAsetProduktifOptions' => KondisiAsetProduktif::options(), + 'kondisiAsetTidakAdaValue' => KondisiAsetProduktif::TIDAK_ADA->value, + 'jenisAsetProduktifOptions' => JenisAsetProduktif::options(), + 'jenisAsetLainnyaValue' => JenisAsetProduktif::LAINNYA->value, + 'keterlibatanProgramKeuanganFormalOptions' => KeterlibatanProgramKeuanganFormal::options(), + 'keterlibatanProgramKeuanganFormalTidakPernahValue' => KeterlibatanProgramKeuanganFormal::TIDAK_PERNAH_MENERIMA->value, + 'statusProgramKeuanganFormalOptions' => StatusProgramKeuanganFormal::options(), + 'programKeuanganFormalRows' => [ + 'pkh' => 'PKH', + 'blt' => 'BLT', + 'kur' => 'KUR', + 'kredit_koperasi_resmi' => 'Kredit koperasi resmi', + 'credit_union_cu' => 'Credit Union (CU)', + 'pinjaman_bumdes' => 'Pinjaman BUMDes', + 'modal_hibah_dinas_pertanian' => 'Modal-hibah dinas pertanian', + 'lainnya' => 'Lainnya', + ], + 'pernahBantuanNgoPerusahaanOptions' => PernahBantuanNgoPerusahaan::options(), + 'pernahBantuanNgoPerusahaanPernahValue' => PernahBantuanNgoPerusahaan::PERNAH->value, + 'keterikatanHutangPanenOptions' => KeterikatanHutangPanen::options(), + 'pinjamanTokohAdatPanenOptions' => PinjamanTokohAdatPanen::options(), + 'pinjamanTokohAdatAdaValue' => PinjamanTokohAdatPanen::ADA->value, + 'praktikIjonOptions' => PraktikIjon::options(), + 'tekananJualSegeraOptions' => TekananJualSegera::options(), + 'tekananJualSegeraAdaValue' => TekananJualSegera::ADA->value, + 'kebebasanMemilihPembeliOptions' => KebebasanMemilihPembeli::options(), + 'kebebasanMemilihPembeliCukupBebasValue' => KebebasanMemilihPembeli::CUKUP_BEBAS_SESEKALI_PINDAH->value, + 'minatPembeliHargaStabilOptions' => MinatPembeliHargaStabil::options(), ]; } diff --git a/app/Http/Controllers/Web/Produktivitas/SurveyProduktivitasController.php b/app/Http/Controllers/Web/Produktivitas/SurveyProduktivitasController.php new file mode 100644 index 0000000..cb9ba6a --- /dev/null +++ b/app/Http/Controllers/Web/Produktivitas/SurveyProduktivitasController.php @@ -0,0 +1,50 @@ +all()); + $validated = $request->validate([ + 'produktivitas_komoditas' => ['required', 'array'], + 'produktivitas_komoditas.*.komoditas_id' => ['nullable', 'exists:master_komoditas,id'], + 'produktivitas_komoditas.*.hasil_panen_3_musim' => ['nullable', 'numeric'], + 'produktivitas_komoditas.*.satuan' => ['nullable', 'string'], + ]); + foreach ($validated['produktivitas_komoditas'] as $row) { + SurveyProduktivitas::create([ + 'uid' => 'SPV-' . strtoupper(Str::random(10)), + 'petani_id' => $petani->id, + 'komoditas_id' => $row['komoditas_id'], + 'kuantitas' => $row['hasil_panen_3_musim'], + 'satuan' => $row['satuan'], + 'created_by' => auth()->id(), + 'updated_by' => auth()->id(), + ]); + } + + return back()->with('success', 'Data produktivitas berhasil disimpan.'); + } + + public function destroy($petaniId, $surveyProduktivitasId) + { + $surveyProduktivitas = SurveyProduktivitas::where('petani_id', $petaniId) + ->where('id', $surveyProduktivitasId) + ->firstOrFail(); + $surveyProduktivitas->deleted_by = auth()->id(); + $surveyProduktivitas->save(); + $surveyProduktivitas->delete(); + + return back()->with('success', 'Data produktivitas berhasil dihapus.'); + } +} diff --git a/app/Models/Pertanian/Petani.php b/app/Models/Pertanian/Petani.php index 8c0bd08..7c9f3ae 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; @@ -76,8 +78,218 @@ class Petani extends Model return $this->belongsTo(User::class, 'user_id'); } - public function praktik_budidaya(): HasOne + public function praktikBudidaya(): HasOne { - return $this->hasOne(PraktikBudidaya::class, 'petani_id'); + return $this->hasOne(PraktikBudidaya::class, 'petani_id')->latestOfMany(); + } + + public function surveyPanen(): HasOne + { + return $this->hasOne(surveyPanen::class, 'petani_id')->latestOfMany(); + } + + public function surveyProduktivitas(): HasOne + { + return $this->hasOne(surveyProduktivitas::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.2, 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), + $this->enumValue($sosialEkonomi->kemauan_mencoba_praktik_baru), + $this->enumValue($sosialEkonomi->pemahaman_mutu_harga), + $this->enumValue($sosialEkonomi->panutan_petani_sukses), + $this->enumValue($sosialEkonomi->kemauan_ikut_program), + $this->enumValue($sosialEkonomi->orientasi_rencana_jangka_panjang), + $this->enumValue($sosialEkonomi->keaktifan_pertemuan_kelompok), + $this->enumValue($sosialEkonomi->peran_dalam_kelompok), + $this->enumValue($sosialEkonomi->manfaat_kelompok_tani), + $this->enumValue($sosialEkonomi->status_rekening_tabungan), + $this->enumValue($sosialEkonomi->pengalaman_kredit_kebun), + $this->enumValue($sosialEkonomi->kondisi_aset_produktif), + $this->enumValue($sosialEkonomi->keterlibatan_program_keuangan_formal), + $this->enumValue($sosialEkonomi->keterikatan_hutang_panen), + $this->enumValue($sosialEkonomi->praktik_ijon), + $this->enumValue($sosialEkonomi->kebebasan_memilih_pembeli), + ])->filter(fn ($value) => !is_null($value) && $value !== '' && (int) $value > 0); + + 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(Schema::getColumnListing($aksesPasar->getTable())) + ->filter(fn ($field) => str_starts_with($field, 'skor_')) + ->map(fn ($field) => $aksesPasar->getAttribute($field)) + ->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/app/Models/Pertanian/PraktikBudidaya.php b/app/Models/Pertanian/PraktikBudidaya.php index d9ed8cf..64f818a 100644 --- a/app/Models/Pertanian/PraktikBudidaya.php +++ b/app/Models/Pertanian/PraktikBudidaya.php @@ -53,11 +53,20 @@ class PraktikBudidaya extends Model 'kondisi_pengelolaan_air', 'sumber_air', 'sistem_irigasi', - 'kebutuan_air_permusim', + 'kebutuhan_air_permusim', 'kebiasaan_konservasi_tanah', 'pemahaman_manfaat_konservasi_tanah', - // 'nilai_konservasi_tanah', - // 'upah_tenaga_kerja' + 'upah_tenaga_kerja', + 'biaya_bibit', + 'biaya_pupuk', + 'biaya_obat_obatan', + 'biaya_sewa_alat_produksi', + 'biaya_penyediaan_air', + 'biaya_produksi_lainnya', + 'total_estimasi_biaya_produksi', + 'created_by', + 'updated_by', + 'deleted_by', ]; public function petani(): BelongsTo diff --git a/app/Models/Pertanian/SosialEkonomi.php b/app/Models/Pertanian/SosialEkonomi.php index f3e2a1a..a6300a6 100644 --- a/app/Models/Pertanian/SosialEkonomi.php +++ b/app/Models/Pertanian/SosialEkonomi.php @@ -2,13 +2,42 @@ namespace App\Models\Pertanian; -use App\Enums\PihakMembantuKonflik; -use App\Enums\SkorKecukupanPenghasilan; -use App\Enums\SkorKejelasanStatusLahan; -use App\Enums\SkorKemampuanMenabung; -use App\Enums\SkorPeriodePaceklik; -use App\Enums\StatusKepemilikanLahanSosialEkonomi; -use App\Enums\StatusKonflik; +use App\Enums\SosialEkonomi\AlasanKreditDitolak; +use App\Enums\SosialEkonomi\BisaBeliPupukBersubsidi; +use App\Enums\SosialEkonomi\JenisAsetProduktif; +use App\Enums\SosialEkonomi\KemauanIkutProgram; +use App\Enums\SosialEkonomi\KemauanMencobaPraktikBaru; +use App\Enums\SosialEkonomi\KeaktifanPertemuanKelompok; +use App\Enums\SosialEkonomi\KedekatanSesamaAnggota; +use App\Enums\SosialEkonomi\KebebasanMemilihPembeli; +use App\Enums\SosialEkonomi\KeterikatanHutangPanen; +use App\Enums\SosialEkonomi\KeterlibatanProgramKeuanganFormal; +use App\Enums\SosialEkonomi\KondisiAsetProduktif; +use App\Enums\SosialEkonomi\ManfaatKelompokTani; +use App\Enums\SosialEkonomi\MinatPembeliHargaStabil; +use App\Enums\SosialEkonomi\OrientasiRencanaJangkaPanjang; +use App\Enums\SosialEkonomi\PanutanPetaniSukses; +use App\Enums\SosialEkonomi\PemahamanMutuHarga; +use App\Enums\SosialEkonomi\PengetahuanHargaHasilOlah; +use App\Enums\SosialEkonomi\PengalamanKreditKebun; +use App\Enums\SosialEkonomi\PeranDalamKelompok; +use App\Enums\SosialEkonomi\PernahBantuanNgoPerusahaan; +use App\Enums\SosialEkonomi\PernahJualHargaLebihTinggi; +use App\Enums\SosialEkonomi\PinjamanTokohAdatPanen; +use App\Enums\SosialEkonomi\PihakMembantuKonflik; +use App\Enums\SosialEkonomi\PraktikIjon; +use App\Enums\SosialEkonomi\SkorKecukupanPenghasilan; +use App\Enums\SosialEkonomi\SkorKejelasanStatusLahan; +use App\Enums\SosialEkonomi\SkorKemampuanMenabung; +use App\Enums\SosialEkonomi\SkorPeriodePaceklik; +use App\Enums\SosialEkonomi\StatusKartuTani; +use App\Enums\SosialEkonomi\StatusKepemilikanLahanSosialEkonomi; +use App\Enums\SosialEkonomi\StatusKonflik; +use App\Enums\SosialEkonomi\StatusProgramKeuanganFormal; +use App\Enums\SosialEkonomi\StatusRekeningTabungan; +use App\Enums\SosialEkonomi\TekananJualSegera; +use App\Enums\SosialEkonomi\TerdaftarKelompokTani; +use App\Enums\SosialEkonomi\UsahaMutuTambahanHarga; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; @@ -43,6 +72,60 @@ class SosialEkonomi extends Model 'pihak_membantu_konflik_nama', 'tahun_bantuan_konflik', 'status_konflik', + 'kemauan_mencoba_praktik_baru', + 'alasan_mencoba_praktik_baru', + 'hambatan_mengubah_cara_bertani', + 'pemahaman_mutu_harga', + 'contoh_pemahaman_mutu_harga', + 'pengetahuan_harga_hasil_olah', + 'pernah_jual_harga_lebih_tinggi', + 'penyebab_harga_lebih_tinggi', + 'usaha_mutu_tambahan_harga', + 'alasan_usaha_mutu_tambahan_harga', + 'panutan_petani_sukses', + 'nama_lokasi_panutan', + 'kemauan_ikut_program', + 'harapan_program', + 'orientasi_rencana_jangka_panjang', + 'rencana_jangka_panjang', + 'terdaftar_kelompok_tani', + 'nama_kelompok_tani', + 'lama_bergabung_kelompok_tahun', + 'kedekatan_sesama_anggota', + 'keaktifan_pertemuan_kelompok', + 'topik_biasa_dibahas', + 'peran_dalam_kelompok', + 'manfaat_kelompok_tani', + 'status_kartu_tani', + 'bisa_beli_pupuk_bersubsidi', + 'manfaat_lain_kartu_tani', + 'status_rekening_tabungan', + 'nama_bank', + 'pengalaman_kredit_kebun', + 'alasan_kredit_ditolak', + 'alasan_kredit_ditolak_lainnya', + 'kondisi_aset_produktif', + 'jenis_aset_produktif', + 'jenis_aset_produktif_lainnya', + 'keterangan_kondisi_aset', + 'keterlibatan_program_keuangan_formal', + 'status_program_keuangan_formal', + 'program_keuangan_formal_lainnya_nama', + 'pernah_bantuan_ngo_perusahaan', + 'detail_bantuan_ngo_perusahaan', + 'keterikatan_hutang_panen', + 'pinjaman_tokoh_adat_panen', + 'keterangan_pinjaman_tokoh_adat', + 'total_hutang_rupiah', + 'total_hutang_setara_kg_panen', + 'total_hutang_tidak_bersedia', + 'praktik_ijon', + 'tekanan_jual_segera', + 'penyebab_tekanan_jual_segera', + 'kebebasan_memilih_pembeli', + 'alasan_tidak_bebas_memilih_pembeli', + 'minat_pembeli_harga_stabil', + 'alasan_minat_pembeli_harga_stabil', 'created_by', 'updated_by', 'deleted_by', @@ -64,6 +147,40 @@ class SosialEkonomi extends Model 'pihak_membantu_konflik' => PihakMembantuKonflik::class, 'tahun_bantuan_konflik' => 'integer', 'status_konflik' => StatusKonflik::class, + 'kemauan_mencoba_praktik_baru' => KemauanMencobaPraktikBaru::class, + 'pemahaman_mutu_harga' => PemahamanMutuHarga::class, + 'pengetahuan_harga_hasil_olah' => PengetahuanHargaHasilOlah::class, + 'pernah_jual_harga_lebih_tinggi' => PernahJualHargaLebihTinggi::class, + 'usaha_mutu_tambahan_harga' => UsahaMutuTambahanHarga::class, + 'panutan_petani_sukses' => PanutanPetaniSukses::class, + 'kemauan_ikut_program' => KemauanIkutProgram::class, + 'orientasi_rencana_jangka_panjang' => OrientasiRencanaJangkaPanjang::class, + 'terdaftar_kelompok_tani' => TerdaftarKelompokTani::class, + 'lama_bergabung_kelompok_tahun' => 'integer', + 'kedekatan_sesama_anggota' => KedekatanSesamaAnggota::class, + 'keaktifan_pertemuan_kelompok' => KeaktifanPertemuanKelompok::class, + 'peran_dalam_kelompok' => PeranDalamKelompok::class, + 'manfaat_kelompok_tani' => ManfaatKelompokTani::class, + 'status_kartu_tani' => StatusKartuTani::class, + 'bisa_beli_pupuk_bersubsidi' => BisaBeliPupukBersubsidi::class, + 'status_rekening_tabungan' => StatusRekeningTabungan::class, + 'pengalaman_kredit_kebun' => PengalamanKreditKebun::class, + 'alasan_kredit_ditolak' => 'array', + 'kondisi_aset_produktif' => KondisiAsetProduktif::class, + 'jenis_aset_produktif' => 'array', + 'keterlibatan_program_keuangan_formal' => KeterlibatanProgramKeuanganFormal::class, + 'status_program_keuangan_formal' => 'array', + 'pernah_bantuan_ngo_perusahaan' => PernahBantuanNgoPerusahaan::class, + 'detail_bantuan_ngo_perusahaan' => 'array', + 'keterikatan_hutang_panen' => KeterikatanHutangPanen::class, + 'pinjaman_tokoh_adat_panen' => PinjamanTokohAdatPanen::class, + 'total_hutang_rupiah' => 'integer', + 'total_hutang_setara_kg_panen' => 'float', + 'total_hutang_tidak_bersedia' => 'boolean', + 'praktik_ijon' => PraktikIjon::class, + 'tekanan_jual_segera' => TekananJualSegera::class, + 'kebebasan_memilih_pembeli' => KebebasanMemilihPembeli::class, + 'minat_pembeli_harga_stabil' => MinatPembeliHargaStabil::class, ]; public function petani(): BelongsTo diff --git a/app/Models/Pertanian/SurveyPanen.php b/app/Models/Pertanian/SurveyPanen.php new file mode 100644 index 0000000..04a4c18 --- /dev/null +++ b/app/Models/Pertanian/SurveyPanen.php @@ -0,0 +1,51 @@ +belongsTo(Petani::class, 'petani_id'); + } +} diff --git a/app/Models/Pertanian/SurveyProduktivitas.php b/app/Models/Pertanian/SurveyProduktivitas.php new file mode 100644 index 0000000..cbacdc5 --- /dev/null +++ b/app/Models/Pertanian/SurveyProduktivitas.php @@ -0,0 +1,31 @@ +belongsTo(Petani::class, 'petani_id'); + } +} diff --git a/database/migrations/2026_06_29_141634_create_praktik_budidaya_table.php b/database/migrations/2026_06_29_141634_create_praktik_budidaya_table.php index 4c1fa6b..0cac968 100644 --- a/database/migrations/2026_06_29_141634_create_praktik_budidaya_table.php +++ b/database/migrations/2026_06_29_141634_create_praktik_budidaya_table.php @@ -41,7 +41,6 @@ return new class extends Migration $table->string('waktu_kemunculan_terparah')->nullable(); $table->string('metode_paling_sering_dilakukan')->nullable(); $table->integer('volume_obat_obatan_permusim')->nullable(); - $table->string('satuan_volume_obat_obatan')->nullable(); // 2.6 Sanitasi Kebun $table->integer('frekuensi_sanitasi_lahan')->nullable(); $table->string('penanganan_sisa_buah_ranting')->nullable(); @@ -53,24 +52,19 @@ return new class extends Migration $table->string('kebutuhan_air_permusim')->nullable(); // 2.8 Praktik konservasi tanah - $table->string('praktik_konservasi_tanah')->nullable(); + $table->string('kebiasaan_konservasi_tanah')->nullable(); $table->string('pemahaman_manfaat_konservasi_tanah')->nullable(); $table->integer('nilai_konservasi_tanah')->nullable(); // 2.9 Struktur Biaya Produksi Per Musim - $table->decimal('upah_tenaga_kerja', 10, 2)->nullable(); - $table->decimal('biaya_bibit', 10, 2)->nullable(); - $table->decimal('biaya_pupuk', 10, 2)->nullable(); - $table->decimal('biaya_obat_obatan', 10, 2)->nullable(); - $table->decimal('biaya_sewa_alat', 10, 2)->nullable(); - $table->decimal('biaya_penyediaan_air', 10, 2)->nullable(); - $table->decimal('biaya_lainnya', 10, 2)->nullable(); - $table->decimal('total_estimasi_biaya', 10, 2)->nullable(); - - // K4 Produktivitas - // 4.3 Kehilangan Akibat OPT - $table->string('estimasi_kehilangan_akibat_opt')->nullable(); - $table->string('estimasi_kehilangan_akibat_hama_penyakit')->nullable(); + $table->decimal('upah_tenaga_kerja', 13, 2)->nullable(); + $table->decimal('biaya_bibit', 13, 2)->nullable(); + $table->decimal('biaya_pupuk', 13, 2)->nullable(); + $table->decimal('biaya_obat_obatan', 13, 2)->nullable(); + $table->decimal('biaya_sewa_alat_produksi', 13, 2)->nullable(); + $table->decimal('biaya_penyediaan_air', 13, 2)->nullable(); + $table->decimal('biaya_produksi_lainnya', 13, 2)->nullable(); + $table->decimal('total_estimasi_biaya_produksi', 13, 2)->nullable(); $table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null'); $table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null'); @@ -79,35 +73,36 @@ return new class extends Migration $table->softDeletes(); }); - Schema::create('panen', function (Blueprint $table) { + Schema::create('survey_panen', function (Blueprint $table) { $table->id(); $table->string('uid')->unique(); $table->foreignId('petani_id')->nullable()->constrained('petani')->onDelete('set null'); // K3 PANEN & PENANGANAN AWAL // 3.1 Cara Menetukan Kematangan - $table->integer('cara_menetukan_kematangan')->nullable(); + $table->integer('dasar_penentuan_panen')->nullable(); // 3.2 Frekuensi Panen $table->integer('frekuensi_panen_pertahun')->nullable(); $table->string('bulan_panen_utama')->nullable(); // 3.4 Hasil Panen Aktual - $table->decimal('hasil_komoditas_utama_permusim_kg', 10, 2)->nullable(); - $table->decimal('hasil_komoditas_lainnya_permusim_kg', 10, 2)->nullable(); - $table->string('tujuan_panen')->nullable(); + $table->decimal('hasil_komoditas_utama_permusim', 10, 2)->nullable(); + $table->decimal('hasil_komoditas_lainnya_permusim', 10, 2)->nullable(); + $table->boolean('disimpan_untuk_sendiri')->nullable(); + $table->decimal('hasil_panen_disimpan', 10, 2)->nullable(); + $table->string('tujuan_disimpan')->nullable(); // 3.5 Penanganan Awal Setelah Panen $table->integer('praktik_sortasi')->nullable(); $table->string('bentuk_sortasi')->nullable(); // 3.8 Hasil Panen Reject & Estimasi Biaya Panen $table->integer('hasil_panen_reject')->nullable(); $table->string('jumlah_panen_reject')->nullable(); - $table->string('tindakan_terhadap_panen_reject')->nullable(); - $table->decimal('estimasi_biaya_panen', 10, 2)->nullable(); - $table->decimal('upah_tenaga_panen', 10, 2)->nullable(); - $table->decimal('biaya_pengangkutan', 10, 2)->nullable(); - $table->decimal('biaya_wadah', 10, 2)->nullable(); - $table->decimal('biaya_sewa_alat', 10, 2)->nullable(); - $table->decimal('biaya_lainnya', 10, 2)->nullable(); - $table->decimal('total_estimasi_biaya_panen', 10, 2)->nullable(); + $table->string('tindakan_panen_reject')->nullable(); + $table->decimal('upah_tenaga_panen', 13, 2)->nullable(); + $table->decimal('biaya_pengangkutan_panen', 13, 2)->nullable(); + $table->decimal('biaya_wadah-Panen', 13, 2)->nullable(); + $table->decimal('biaya_sewa_alat_panen', 13, 2)->nullable(); + $table->decimal('biaya_panen_lainnya', 13, 2)->nullable(); + $table->decimal('total_estimasi_biaya_panen', 13, 2)->nullable(); // K4 Produktivitas // 4.3 Kehilangan Akibat OPT $table->string('estimasi_kehilangan_akibat_opt')->nullable(); @@ -120,43 +115,13 @@ return new class extends Migration $table->softDeletes(); }); - Schema::create('produktivitas', function (Blueprint $table) { + Schema::create('survey_produktivitas', function (Blueprint $table) { $table->id(); $table->string('uid')->unique(); $table->foreignId('petani_id')->nullable()->constrained('petani')->onDelete('set null'); $table->foreignId('komoditas_id')->nullable()->constrained('master_komoditas')->onDelete('set null'); - $table->foreignId('jenis_komoditas_id')->nullable()->constrained('jenis_komoditas')->onDelete('set null'); - $table->foreignId('varietas_id')->nullable()->constrained('master_varietas')->onDelete('set null'); - $table->decimal('kuantitas_pertahun', 10, 2)->nullable(); - $table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null'); - $table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null'); - $table->foreignId('deleted_by')->nullable()->constrained('users')->onDelete('set null'); - $table->timestamps(); - $table->softDeletes(); - }); - - Schema::create('pelatihan', function (Blueprint $table) { - $table->id(); - $table->string('uid')->unique(); - $table->foreignId('petani_id')->nullable()->constrained('petani')->onDelete('set null'); - $table->string('jenis_pelatihan'); - $table->string('penyelenggara'); - $table->date('tahun_pelaksanaan'); - $table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null'); - $table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null'); - $table->foreignId('deleted_by')->nullable()->constrained('users')->onDelete('set null'); - $table->timestamps(); - $table->softDeletes(); - }); - - Schema::create('sertifikasi', function (Blueprint $table) { - $table->id(); - $table->string('uid')->unique(); - $table->foreignId('petani_id')->nullable()->constrained('petani')->onDelete('set null'); - $table->string('jenis_sertifikasi'); - $table->string('lembaga_penerbit'); - $table->date('tahun_pelaksanaan'); - $table->boolean('is_aktif')->default(false); + $table->decimal('kuantitas')->nullable(); + $table->string('satuan')->nullable(); $table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null'); $table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null'); $table->foreignId('deleted_by')->nullable()->constrained('users')->onDelete('set null'); @@ -171,8 +136,7 @@ return new class extends Migration public function down(): void { Schema::dropIfExists('praktik_budidaya'); - Schema::dropIfExists('pelatihan'); - Schema::dropIfExists('sertifikasi'); + Schema::dropIfExists('survey_panen'); Schema::dropIfExists('produktivitas'); } }; diff --git a/database/migrations/2026_07_09_000001_add_fields_to_sosial_ekonomi_table.php b/database/migrations/2026_07_09_000001_add_fields_to_sosial_ekonomi_table.php new file mode 100644 index 0000000..5276785 --- /dev/null +++ b/database/migrations/2026_07_09_000001_add_fields_to_sosial_ekonomi_table.php @@ -0,0 +1,153 @@ +tinyInteger('kemauan_mencoba_praktik_baru')->nullable()->after('status_konflik'); + $table->text('alasan_mencoba_praktik_baru')->nullable()->after('kemauan_mencoba_praktik_baru'); + $table->text('hambatan_mengubah_cara_bertani')->nullable()->after('alasan_mencoba_praktik_baru'); + + $table->tinyInteger('pemahaman_mutu_harga')->nullable()->after('hambatan_mengubah_cara_bertani'); + $table->text('contoh_pemahaman_mutu_harga')->nullable()->after('pemahaman_mutu_harga'); + $table->string('pengetahuan_harga_hasil_olah')->nullable()->after('contoh_pemahaman_mutu_harga'); + $table->string('pernah_jual_harga_lebih_tinggi')->nullable()->after('pengetahuan_harga_hasil_olah'); + $table->text('penyebab_harga_lebih_tinggi')->nullable()->after('pernah_jual_harga_lebih_tinggi'); + $table->string('usaha_mutu_tambahan_harga')->nullable()->after('penyebab_harga_lebih_tinggi'); + $table->text('alasan_usaha_mutu_tambahan_harga')->nullable()->after('usaha_mutu_tambahan_harga'); + + $table->tinyInteger('panutan_petani_sukses')->nullable()->after('alasan_usaha_mutu_tambahan_harga'); + $table->text('nama_lokasi_panutan')->nullable()->after('panutan_petani_sukses'); + + $table->tinyInteger('kemauan_ikut_program')->nullable()->after('nama_lokasi_panutan'); + $table->text('harapan_program')->nullable()->after('kemauan_ikut_program'); + + $table->tinyInteger('orientasi_rencana_jangka_panjang')->nullable()->after('harapan_program'); + $table->text('rencana_jangka_panjang')->nullable()->after('orientasi_rencana_jangka_panjang'); + + // Keanggotaan Kelompok Fields + $table->string('terdaftar_kelompok_tani')->nullable()->after('rencana_jangka_panjang'); + $table->string('nama_kelompok_tani')->nullable()->after('terdaftar_kelompok_tani'); + $table->unsignedInteger('lama_bergabung_kelompok_tahun')->nullable()->after('nama_kelompok_tani'); + $table->string('kedekatan_sesama_anggota')->nullable()->after('lama_bergabung_kelompok_tahun'); + + $table->tinyInteger('keaktifan_pertemuan_kelompok')->nullable()->after('kedekatan_sesama_anggota'); + $table->text('topik_biasa_dibahas')->nullable()->after('keaktifan_pertemuan_kelompok'); + + $table->tinyInteger('peran_dalam_kelompok')->nullable()->after('topik_biasa_dibahas'); + $table->tinyInteger('manfaat_kelompok_tani')->nullable()->after('peran_dalam_kelompok'); + + $table->string('status_kartu_tani')->nullable()->after('manfaat_kelompok_tani'); + $table->string('bisa_beli_pupuk_bersubsidi')->nullable()->after('status_kartu_tani'); + $table->text('manfaat_lain_kartu_tani')->nullable()->after('bisa_beli_pupuk_bersubsidi'); + + // Akses Keuangan Fields + $table->tinyInteger('status_rekening_tabungan')->nullable()->after('manfaat_lain_kartu_tani'); + $table->string('nama_bank')->nullable()->after('status_rekening_tabungan'); + + $table->tinyInteger('pengalaman_kredit_kebun')->nullable()->after('nama_bank'); + $table->json('alasan_kredit_ditolak')->nullable()->after('pengalaman_kredit_kebun'); + $table->string('alasan_kredit_ditolak_lainnya')->nullable()->after('alasan_kredit_ditolak'); + + $table->tinyInteger('kondisi_aset_produktif')->nullable()->after('alasan_kredit_ditolak_lainnya'); + $table->json('jenis_aset_produktif')->nullable()->after('kondisi_aset_produktif'); + $table->string('jenis_aset_produktif_lainnya')->nullable()->after('jenis_aset_produktif'); + $table->text('keterangan_kondisi_aset')->nullable()->after('jenis_aset_produktif_lainnya'); + + $table->tinyInteger('keterlibatan_program_keuangan_formal')->nullable()->after('keterangan_kondisi_aset'); + $table->json('status_program_keuangan_formal')->nullable()->after('keterlibatan_program_keuangan_formal'); + $table->string('program_keuangan_formal_lainnya_nama')->nullable()->after('status_program_keuangan_formal'); + + $table->string('pernah_bantuan_ngo_perusahaan')->nullable()->after('program_keuangan_formal_lainnya_nama'); + $table->json('detail_bantuan_ngo_perusahaan')->nullable()->after('pernah_bantuan_ngo_perusahaan'); + + // Keterikatan Hutang Fields + $table->tinyInteger('keterikatan_hutang_panen')->nullable()->after('detail_bantuan_ngo_perusahaan'); + $table->string('pinjaman_tokoh_adat_panen')->nullable()->after('keterikatan_hutang_panen'); + $table->text('keterangan_pinjaman_tokoh_adat')->nullable()->after('pinjaman_tokoh_adat_panen'); + $table->unsignedBigInteger('total_hutang_rupiah')->nullable()->after('keterangan_pinjaman_tokoh_adat'); + $table->decimal('total_hutang_setara_kg_panen', 12, 2)->nullable()->after('total_hutang_rupiah'); + $table->boolean('total_hutang_tidak_bersedia')->nullable()->after('total_hutang_setara_kg_panen'); + $table->tinyInteger('praktik_ijon')->nullable()->after('total_hutang_tidak_bersedia'); + $table->string('tekanan_jual_segera')->nullable()->after('praktik_ijon'); + $table->text('penyebab_tekanan_jual_segera')->nullable()->after('tekanan_jual_segera'); + + $table->tinyInteger('kebebasan_memilih_pembeli')->nullable()->after('penyebab_tekanan_jual_segera'); + $table->text('alasan_tidak_bebas_memilih_pembeli')->nullable()->after('kebebasan_memilih_pembeli'); + $table->string('minat_pembeli_harga_stabil')->nullable()->after('alasan_tidak_bebas_memilih_pembeli'); + $table->text('alasan_minat_pembeli_harga_stabil')->nullable()->after('minat_pembeli_harga_stabil'); + }); + } + + public function down(): void + { + Schema::table('sosial_ekonomi', function (Blueprint $table) { + $table->dropColumn([ + // Sosial Budaya + 'kemauan_mencoba_praktik_baru', + 'alasan_mencoba_praktik_baru', + 'hambatan_mengubah_cara_bertani', + 'pemahaman_mutu_harga', + 'contoh_pemahaman_mutu_harga', + 'pengetahuan_harga_hasil_olah', + 'pernah_jual_harga_lebih_tinggi', + 'penyebab_harga_lebih_tinggi', + 'usaha_mutu_tambahan_harga', + 'alasan_usaha_mutu_tambahan_harga', + 'panutan_petani_sukses', + 'nama_lokasi_panutan', + 'kemauan_ikut_program', + 'harapan_program', + 'orientasi_rencana_jangka_panjang', + 'rencana_jangka_panjang', + // Keanggotaan Kelompok + 'terdaftar_kelompok_tani', + 'nama_kelompok_tani', + 'lama_bergabung_kelompok_tahun', + 'kedekatan_sesama_anggota', + 'keaktifan_pertemuan_kelompok', + 'topik_biasa_dibahas', + 'peran_dalam_kelompok', + 'manfaat_kelompok_tani', + 'status_kartu_tani', + 'bisa_beli_pupuk_bersubsidi', + 'manfaat_lain_kartu_tani', + // Akses Keuangan + 'status_rekening_tabungan', + 'nama_bank', + 'pengalaman_kredit_kebun', + 'alasan_kredit_ditolak', + 'alasan_kredit_ditolak_lainnya', + 'kondisi_aset_produktif', + 'jenis_aset_produktif', + 'jenis_aset_produktif_lainnya', + 'keterangan_kondisi_aset', + 'keterlibatan_program_keuangan_formal', + 'status_program_keuangan_formal', + 'program_keuangan_formal_lainnya_nama', + 'pernah_bantuan_ngo_perusahaan', + 'detail_bantuan_ngo_perusahaan', + // Keterikatan Hutang + 'keterikatan_hutang_panen', + 'pinjaman_tokoh_adat_panen', + 'keterangan_pinjaman_tokoh_adat', + 'total_hutang_rupiah', + 'total_hutang_setara_kg_panen', + 'total_hutang_tidak_bersedia', + 'praktik_ijon', + 'tekanan_jual_segera', + 'penyebab_tekanan_jual_segera', + 'kebebasan_memilih_pembeli', + 'alasan_tidak_bebas_memilih_pembeli', + 'minat_pembeli_harga_stabil', + 'alasan_minat_pembeli_harga_stabil', + ]); + }); + } +}; diff --git a/public/assets/vendor/libs/jquery-repeater/jquery-repeater.js b/public/assets/vendor/libs/jquery-repeater/jquery-repeater.js new file mode 100644 index 0000000..584e2b0 --- /dev/null +++ b/public/assets/vendor/libs/jquery-repeater/jquery-repeater.js @@ -0,0 +1 @@ +!function(n,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t=e();for(var a in t)("object"==typeof exports?exports:n)[a]=t[a]}}(self,(function(){return function(){var __webpack_modules__={"./libs/jquery-repeater/jquery-repeater.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jquery_repeater_jquery_repeater__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery.repeater/jquery.repeater */ "./node_modules/jquery.repeater/jquery.repeater.js");\n/* harmony import */ var jquery_repeater_jquery_repeater__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery_repeater_jquery_repeater__WEBPACK_IMPORTED_MODULE_0__);\n\n\n//# sourceURL=webpack://Vuexy/./libs/jquery-repeater/jquery-repeater.js?')},"./node_modules/jquery.repeater/jquery.repeater.js":function(){eval("// jquery.repeater version 1.2.1\n// https://github.com/DubFriend/jquery.repeater\n// (MIT) 09-10-2016\n// Brian Detering (http://www.briandetering.net/)\n(function ($) {\n'use strict';\n\nvar identity = function (x) {\n return x;\n};\n\nvar isArray = function (value) {\n return $.isArray(value);\n};\n\nvar isObject = function (value) {\n return !isArray(value) && (value instanceof Object);\n};\n\nvar isNumber = function (value) {\n return value instanceof Number;\n};\n\nvar isFunction = function (value) {\n return value instanceof Function;\n};\n\nvar indexOf = function (object, value) {\n return $.inArray(value, object);\n};\n\nvar inArray = function (array, value) {\n return indexOf(array, value) !== -1;\n};\n\nvar foreach = function (collection, callback) {\n for(var i in collection) {\n if(collection.hasOwnProperty(i)) {\n callback(collection[i], i, collection);\n }\n }\n};\n\n\nvar last = function (array) {\n return array[array.length - 1];\n};\n\nvar argumentsToArray = function (args) {\n return Array.prototype.slice.call(args);\n};\n\nvar extend = function () {\n var extended = {};\n foreach(argumentsToArray(arguments), function (o) {\n foreach(o, function (val, key) {\n extended[key] = val;\n });\n });\n return extended;\n};\n\nvar mapToArray = function (collection, callback) {\n var mapped = [];\n foreach(collection, function (value, key, coll) {\n mapped.push(callback(value, key, coll));\n });\n return mapped;\n};\n\nvar mapToObject = function (collection, callback, keyCallback) {\n var mapped = {};\n foreach(collection, function (value, key, coll) {\n key = keyCallback ? keyCallback(key, value) : key;\n mapped[key] = callback(value, key, coll);\n });\n return mapped;\n};\n\nvar map = function (collection, callback, keyCallback) {\n return isArray(collection) ?\n mapToArray(collection, callback) :\n mapToObject(collection, callback, keyCallback);\n};\n\nvar pluck = function (arrayOfObjects, key) {\n return map(arrayOfObjects, function (val) {\n return val[key];\n });\n};\n\nvar filter = function (collection, callback) {\n var filtered;\n\n if(isArray(collection)) {\n filtered = [];\n foreach(collection, function (val, key, coll) {\n if(callback(val, key, coll)) {\n filtered.push(val);\n }\n });\n }\n else {\n filtered = {};\n foreach(collection, function (val, key, coll) {\n if(callback(val, key, coll)) {\n filtered[key] = val;\n }\n });\n }\n\n return filtered;\n};\n\nvar call = function (collection, functionName, args) {\n return map(collection, function (object, name) {\n return object[functionName].apply(object, args || []);\n });\n};\n\n//execute callback immediately and at most one time on the minimumInterval,\n//ignore block attempts\nvar throttle = function (minimumInterval, callback) {\n var timeout = null;\n return function () {\n var that = this, args = arguments;\n if(timeout === null) {\n timeout = setTimeout(function () {\n timeout = null;\n }, minimumInterval);\n callback.apply(that, args);\n }\n };\n};\n\n\nvar mixinPubSub = function (object) {\n object = object || {};\n var topics = {};\n\n object.publish = function (topic, data) {\n foreach(topics[topic], function (callback) {\n callback(data);\n });\n };\n\n object.subscribe = function (topic, callback) {\n topics[topic] = topics[topic] || [];\n topics[topic].push(callback);\n };\n\n object.unsubscribe = function (callback) {\n foreach(topics, function (subscribers) {\n var index = indexOf(subscribers, callback);\n if(index !== -1) {\n subscribers.splice(index, 1);\n }\n });\n };\n\n return object;\n};\n\n// jquery.input version 0.0.0\n// https://github.com/DubFriend/jquery.input\n// (MIT) 09-04-2014\n// Brian Detering (http://www.briandetering.net/)\n(function ($) {\n'use strict';\n\nvar createBaseInput = function (fig, my) {\n var self = mixinPubSub(),\n $self = fig.$;\n\n self.getType = function () {\n throw 'implement me (return type. \"text\", \"radio\", etc.)';\n };\n\n self.$ = function (selector) {\n return selector ? $self.find(selector) : $self;\n };\n\n self.disable = function () {\n self.$().prop('disabled', true);\n self.publish('isEnabled', false);\n };\n\n self.enable = function () {\n self.$().prop('disabled', false);\n self.publish('isEnabled', true);\n };\n\n my.equalTo = function (a, b) {\n return a === b;\n };\n\n my.publishChange = (function () {\n var oldValue;\n return function (e, domElement) {\n var newValue = self.get();\n if(!my.equalTo(newValue, oldValue)) {\n self.publish('change', { e: e, domElement: domElement });\n }\n oldValue = newValue;\n };\n }());\n\n return self;\n};\n\n\nvar createInput = function (fig, my) {\n var self = createBaseInput(fig, my);\n\n self.get = function () {\n return self.$().val();\n };\n\n self.set = function (newValue) {\n self.$().val(newValue);\n };\n\n self.clear = function () {\n self.set('');\n };\n\n my.buildSetter = function (callback) {\n return function (newValue) {\n callback.call(self, newValue);\n };\n };\n\n return self;\n};\n\nvar inputEqualToArray = function (a, b) {\n a = isArray(a) ? a : [a];\n b = isArray(b) ? b : [b];\n\n var isEqual = true;\n if(a.length !== b.length) {\n isEqual = false;\n }\n else {\n foreach(a, function (value) {\n if(!inArray(b, value)) {\n isEqual = false;\n }\n });\n }\n\n return isEqual;\n};\n\nvar createInputButton = function (fig) {\n var my = {},\n self = createInput(fig, my);\n\n self.getType = function () {\n return 'button';\n };\n\n self.$().on('change', function (e) {\n my.publishChange(e, this);\n });\n\n return self;\n};\n\nvar createInputCheckbox = function (fig) {\n var my = {},\n self = createInput(fig, my);\n\n self.getType = function () {\n return 'checkbox';\n };\n\n self.get = function () {\n var values = [];\n self.$().filter(':checked').each(function () {\n values.push($(this).val());\n });\n return values;\n };\n\n self.set = function (newValues) {\n newValues = isArray(newValues) ? newValues : [newValues];\n\n self.$().each(function () {\n $(this).prop('checked', false);\n });\n\n foreach(newValues, function (value) {\n self.$().filter('[value=\"' + value + '\"]')\n .prop('checked', true);\n });\n };\n\n my.equalTo = inputEqualToArray;\n\n self.$().change(function (e) {\n my.publishChange(e, this);\n });\n\n return self;\n};\n\nvar createInputEmail = function (fig) {\n var my = {},\n self = createInputText(fig, my);\n\n self.getType = function () {\n return 'email';\n };\n\n return self;\n};\n\nvar createInputFile = function (fig) {\n var my = {},\n self = createBaseInput(fig, my);\n\n self.getType = function () {\n return 'file';\n };\n\n self.get = function () {\n return last(self.$().val().split('\\\\'));\n };\n\n self.clear = function () {\n // http://stackoverflow.com/questions/1043957/clearing-input-type-file-using-jquery\n this.$().each(function () {\n $(this).wrap('
').closest('form').get(0).reset();\n $(this).unwrap();\n });\n };\n\n self.$().change(function (e) {\n my.publishChange(e, this);\n // self.publish('change', self);\n });\n\n return self;\n};\n\nvar createInputHidden = function (fig) {\n var my = {},\n self = createInput(fig, my);\n\n self.getType = function () {\n return 'hidden';\n };\n\n self.$().change(function (e) {\n my.publishChange(e, this);\n });\n\n return self;\n};\nvar createInputMultipleFile = function (fig) {\n var my = {},\n self = createBaseInput(fig, my);\n\n self.getType = function () {\n return 'file[multiple]';\n };\n\n self.get = function () {\n // http://stackoverflow.com/questions/14035530/how-to-get-value-of-html-5-multiple-file-upload-variable-using-jquery\n var fileListObject = self.$().get(0).files || [],\n names = [], i;\n\n for(i = 0; i < (fileListObject.length || 0); i += 1) {\n names.push(fileListObject[i].name);\n }\n\n return names;\n };\n\n self.clear = function () {\n // http://stackoverflow.com/questions/1043957/clearing-input-type-file-using-jquery\n this.$().each(function () {\n $(this).wrap('').closest('form').get(0).reset();\n $(this).unwrap();\n });\n };\n\n self.$().change(function (e) {\n my.publishChange(e, this);\n });\n\n return self;\n};\n\nvar createInputMultipleSelect = function (fig) {\n var my = {},\n self = createInput(fig, my);\n\n self.getType = function () {\n return 'select[multiple]';\n };\n\n self.get = function () {\n return self.$().val() || [];\n };\n\n self.set = function (newValues) {\n self.$().val(\n newValues === '' ? [] : isArray(newValues) ? newValues : [newValues]\n );\n };\n\n my.equalTo = inputEqualToArray;\n\n self.$().change(function (e) {\n my.publishChange(e, this);\n });\n\n return self;\n};\n\nvar createInputPassword = function (fig) {\n var my = {},\n self = createInputText(fig, my);\n\n self.getType = function () {\n return 'password';\n };\n\n return self;\n};\n\nvar createInputRadio = function (fig) {\n var my = {},\n self = createInput(fig, my);\n\n self.getType = function () {\n return 'radio';\n };\n\n self.get = function () {\n return self.$().filter(':checked').val() || null;\n };\n\n self.set = function (newValue) {\n if(!newValue) {\n self.$().each(function () {\n $(this).prop('checked', false);\n });\n }\n else {\n self.$().filter('[value=\"' + newValue + '\"]').prop('checked', true);\n }\n };\n\n self.$().change(function (e) {\n my.publishChange(e, this);\n });\n\n return self;\n};\n\nvar createInputRange = function (fig) {\n var my = {},\n self = createInput(fig, my);\n\n self.getType = function () {\n return 'range';\n };\n\n self.$().change(function (e) {\n my.publishChange(e, this);\n });\n\n return self;\n};\n\nvar createInputSelect = function (fig) {\n var my = {},\n self = createInput(fig, my);\n\n self.getType = function () {\n return 'select';\n };\n\n self.$().change(function (e) {\n my.publishChange(e, this);\n });\n\n return self;\n};\n\nvar createInputText = function (fig) {\n var my = {},\n self = createInput(fig, my);\n\n self.getType = function () {\n return 'text';\n };\n\n self.$().on('change keyup keydown', function (e) {\n my.publishChange(e, this);\n });\n\n return self;\n};\n\nvar createInputTextarea = function (fig) {\n var my = {},\n self = createInput(fig, my);\n\n self.getType = function () {\n return 'textarea';\n };\n\n self.$().on('change keyup keydown', function (e) {\n my.publishChange(e, this);\n });\n\n return self;\n};\n\nvar createInputURL = function (fig) {\n var my = {},\n self = createInputText(fig, my);\n\n self.getType = function () {\n return 'url';\n };\n\n return self;\n};\n\nvar buildFormInputs = function (fig) {\n var inputs = {},\n $self = fig.$;\n\n var constructor = fig.constructorOverride || {\n button: createInputButton,\n text: createInputText,\n url: createInputURL,\n email: createInputEmail,\n password: createInputPassword,\n range: createInputRange,\n textarea: createInputTextarea,\n select: createInputSelect,\n 'select[multiple]': createInputMultipleSelect,\n radio: createInputRadio,\n checkbox: createInputCheckbox,\n file: createInputFile,\n 'file[multiple]': createInputMultipleFile,\n hidden: createInputHidden\n };\n\n var addInputsBasic = function (type, selector) {\n var $input = isObject(selector) ? selector : $self.find(selector);\n\n $input.each(function () {\n var name = $(this).attr('name');\n inputs[name] = constructor[type]({\n $: $(this)\n });\n });\n };\n\n var addInputsGroup = function (type, selector) {\n var names = [],\n $input = isObject(selector) ? selector : $self.find(selector);\n\n if(isObject(selector)) {\n inputs[$input.attr('name')] = constructor[type]({\n $: $input\n });\n }\n else {\n // group by name attribute\n $input.each(function () {\n if(indexOf(names, $(this).attr('name')) === -1) {\n names.push($(this).attr('name'));\n }\n });\n\n foreach(names, function (name) {\n inputs[name] = constructor[type]({\n $: $self.find('input[name=\"' + name + '\"]')\n });\n });\n }\n };\n\n\n if($self.is('input, select, textarea')) {\n if($self.is('input[type=\"button\"], button, input[type=\"submit\"]')) {\n addInputsBasic('button', $self);\n }\n else if($self.is('textarea')) {\n addInputsBasic('textarea', $self);\n }\n else if(\n $self.is('input[type=\"text\"]') ||\n $self.is('input') && !$self.attr('type')\n ) {\n addInputsBasic('text', $self);\n }\n else if($self.is('input[type=\"password\"]')) {\n addInputsBasic('password', $self);\n }\n else if($self.is('input[type=\"email\"]')) {\n addInputsBasic('email', $self);\n }\n else if($self.is('input[type=\"url\"]')) {\n addInputsBasic('url', $self);\n }\n else if($self.is('input[type=\"range\"]')) {\n addInputsBasic('range', $self);\n }\n else if($self.is('select')) {\n if($self.is('[multiple]')) {\n addInputsBasic('select[multiple]', $self);\n }\n else {\n addInputsBasic('select', $self);\n }\n }\n else if($self.is('input[type=\"file\"]')) {\n if($self.is('[multiple]')) {\n addInputsBasic('file[multiple]', $self);\n }\n else {\n addInputsBasic('file', $self);\n }\n }\n else if($self.is('input[type=\"hidden\"]')) {\n addInputsBasic('hidden', $self);\n }\n else if($self.is('input[type=\"radio\"]')) {\n addInputsGroup('radio', $self);\n }\n else if($self.is('input[type=\"checkbox\"]')) {\n addInputsGroup('checkbox', $self);\n }\n else {\n //in all other cases default to a \"text\" input interface.\n addInputsBasic('text', $self);\n }\n }\n else {\n addInputsBasic('button', 'input[type=\"button\"], button, input[type=\"submit\"]');\n addInputsBasic('text', 'input[type=\"text\"]');\n addInputsBasic('password', 'input[type=\"password\"]');\n addInputsBasic('email', 'input[type=\"email\"]');\n addInputsBasic('url', 'input[type=\"url\"]');\n addInputsBasic('range', 'input[type=\"range\"]');\n addInputsBasic('textarea', 'textarea');\n addInputsBasic('select', 'select:not([multiple])');\n addInputsBasic('select[multiple]', 'select[multiple]');\n addInputsBasic('file', 'input[type=\"file\"]:not([multiple])');\n addInputsBasic('file[multiple]', 'input[type=\"file\"][multiple]');\n addInputsBasic('hidden', 'input[type=\"hidden\"]');\n addInputsGroup('radio', 'input[type=\"radio\"]');\n addInputsGroup('checkbox', 'input[type=\"checkbox\"]');\n }\n\n return inputs;\n};\n\n$.fn.inputVal = function (newValue) {\n var $self = $(this);\n\n var inputs = buildFormInputs({ $: $self });\n\n if($self.is('input, textarea, select')) {\n if(typeof newValue === 'undefined') {\n return inputs[$self.attr('name')].get();\n }\n else {\n inputs[$self.attr('name')].set(newValue);\n return $self;\n }\n }\n else {\n if(typeof newValue === 'undefined') {\n return call(inputs, 'get');\n }\n else {\n foreach(newValue, function (value, inputName) {\n inputs[inputName].set(value);\n });\n return $self;\n }\n }\n};\n\n$.fn.inputOnChange = function (callback) {\n var $self = $(this);\n var inputs = buildFormInputs({ $: $self });\n foreach(inputs, function (input) {\n input.subscribe('change', function (data) {\n callback.call(data.domElement, data.e);\n });\n });\n return $self;\n};\n\n$.fn.inputDisable = function () {\n var $self = $(this);\n call(buildFormInputs({ $: $self }), 'disable');\n return $self;\n};\n\n$.fn.inputEnable = function () {\n var $self = $(this);\n call(buildFormInputs({ $: $self }), 'enable');\n return $self;\n};\n\n$.fn.inputClear = function () {\n var $self = $(this);\n call(buildFormInputs({ $: $self }), 'clear');\n return $self;\n};\n\n}(jQuery));\n\n$.fn.repeaterVal = function () {\n var parse = function (raw) {\n var parsed = [];\n\n foreach(raw, function (val, key) {\n var parsedKey = [];\n if(key !== \"undefined\") {\n parsedKey.push(key.match(/^[^\\[]*/)[0]);\n parsedKey = parsedKey.concat(map(\n key.match(/\\[[^\\]]*\\]/g),\n function (bracketed) {\n return bracketed.replace(/[\\[\\]]/g, '');\n }\n ));\n\n parsed.push({\n val: val,\n key: parsedKey\n });\n }\n });\n\n return parsed;\n };\n\n var build = function (parsed) {\n if(\n parsed.length === 1 &&\n (parsed[0].key.length === 0 || parsed[0].key.length === 1 && !parsed[0].key[0])\n ) {\n return parsed[0].val;\n }\n\n foreach(parsed, function (p) {\n p.head = p.key.shift();\n });\n\n var grouped = (function () {\n var grouped = {};\n\n foreach(parsed, function (p) {\n if(!grouped[p.head]) {\n grouped[p.head] = [];\n }\n grouped[p.head].push(p);\n });\n\n return grouped;\n }());\n\n var built;\n\n if(/^[0-9]+$/.test(parsed[0].head)) {\n built = [];\n foreach(grouped, function (group) {\n built.push(build(group));\n });\n }\n else {\n built = {};\n foreach(grouped, function (group, key) {\n built[key] = build(group);\n });\n }\n\n return built;\n };\n\n return build(parse($(this).inputVal()));\n};\n\n$.fn.repeater = function (fig) {\n fig = fig || {};\n\n var setList;\n\n $(this).each(function () {\n\n var $self = $(this);\n\n var show = fig.show || function () {\n $(this).show();\n };\n\n var hide = fig.hide || function (removeElement) {\n removeElement();\n };\n\n var $list = $self.find('[data-repeater-list]').first();\n\n var $filterNested = function ($items, repeaters) {\n return $items.filter(function () {\n return repeaters ?\n $(this).closest(\n pluck(repeaters, 'selector').join(',')\n ).length === 0 : true;\n });\n };\n\n var $items = function () {\n return $filterNested($list.find('[data-repeater-item]'), fig.repeaters);\n };\n\n var $itemTemplate = $list.find('[data-repeater-item]')\n .first().clone().hide();\n\n var $firstDeleteButton = $filterNested(\n $filterNested($(this).find('[data-repeater-item]'), fig.repeaters)\n .first().find('[data-repeater-delete]'),\n fig.repeaters\n );\n\n if(fig.isFirstItemUndeletable && $firstDeleteButton) {\n $firstDeleteButton.remove();\n }\n\n var getGroupName = function () {\n var groupName = $list.data('repeater-list');\n return fig.$parent ?\n fig.$parent.data('item-name') + '[' + groupName + ']' :\n groupName;\n };\n\n var initNested = function ($listItems) {\n if(fig.repeaters) {\n $listItems.each(function () {\n var $item = $(this);\n foreach(fig.repeaters, function (nestedFig) {\n $item.find(nestedFig.selector).repeater(extend(\n nestedFig, { $parent: $item }\n ));\n });\n });\n }\n };\n\n var $foreachRepeaterInItem = function (repeaters, $item, cb) {\n if(repeaters) {\n foreach(repeaters, function (nestedFig) {\n cb.call($item.find(nestedFig.selector)[0], nestedFig);\n });\n }\n };\n\n var setIndexes = function ($items, groupName, repeaters) {\n $items.each(function (index) {\n var $item = $(this);\n $item.data('item-name', groupName + '[' + index + ']');\n $filterNested($item.find('[name]'), repeaters)\n .each(function () {\n var $input = $(this);\n // match non empty brackets (ex: \"[foo]\")\n var matches = $input.attr('name').match(/\\[[^\\]]+\\]/g);\n\n var name = matches ?\n // strip \"[\" and \"]\" characters\n last(matches).replace(/\\[|\\]/g, '') :\n $input.attr('name');\n\n\n var newName = groupName + '[' + index + '][' + name + ']' +\n ($input.is(':checkbox') || $input.attr('multiple') ? '[]' : '');\n\n $input.attr('name', newName);\n\n $foreachRepeaterInItem(repeaters, $item, function (nestedFig) {\n var $repeater = $(this);\n setIndexes(\n $filterNested($repeater.find('[data-repeater-item]'), nestedFig.repeaters || []),\n groupName + '[' + index + ']' +\n '[' + $repeater.find('[data-repeater-list]').first().data('repeater-list') + ']',\n nestedFig.repeaters\n );\n });\n });\n });\n\n $list.find('input[name][checked]')\n .removeAttr('checked')\n .prop('checked', true);\n };\n\n setIndexes($items(), getGroupName(), fig.repeaters);\n initNested($items());\n if(fig.initEmpty) {\n $items().remove();\n }\n\n if(fig.ready) {\n fig.ready(function () {\n setIndexes($items(), getGroupName(), fig.repeaters);\n });\n }\n\n var appendItem = (function () {\n var setItemsValues = function ($item, data, repeaters) {\n if(data || fig.defaultValues) {\n var inputNames = {};\n $filterNested($item.find('[name]'), repeaters).each(function () {\n var key = $(this).attr('name').match(/\\[([^\\]]*)(\\]|\\]\\[\\])$/)[1];\n inputNames[key] = $(this).attr('name');\n });\n\n $item.inputVal(map(\n filter(data || fig.defaultValues, function (val, name) {\n return inputNames[name];\n }),\n identity,\n function (name) {\n return inputNames[name];\n }\n ));\n }\n\n\n $foreachRepeaterInItem(repeaters, $item, function (nestedFig) {\n var $repeater = $(this);\n $filterNested(\n $repeater.find('[data-repeater-item]'),\n nestedFig.repeaters\n )\n .each(function () {\n var fieldName = $repeater.find('[data-repeater-list]').data('repeater-list');\n if(data && data[fieldName]) {\n var $template = $(this).clone();\n $repeater.find('[data-repeater-item]').remove();\n foreach(data[fieldName], function (data) {\n var $item = $template.clone();\n setItemsValues(\n $item,\n data,\n nestedFig.repeaters || []\n );\n $repeater.find('[data-repeater-list]').append($item);\n });\n }\n else {\n setItemsValues(\n $(this),\n nestedFig.defaultValues,\n nestedFig.repeaters || []\n );\n }\n });\n });\n\n };\n\n return function ($item, data) {\n $list.append($item);\n setIndexes($items(), getGroupName(), fig.repeaters);\n $item.find('[name]').each(function () {\n $(this).inputClear();\n });\n setItemsValues($item, data || fig.defaultValues, fig.repeaters);\n };\n }());\n\n var addItem = function (data) {\n var $item = $itemTemplate.clone();\n appendItem($item, data);\n if(fig.repeaters) {\n initNested($item);\n }\n show.call($item.get(0));\n };\n\n setList = function (rows) {\n $items().remove();\n foreach(rows, addItem);\n };\n\n $filterNested($self.find('[data-repeater-create]'), fig.repeaters).click(function () {\n addItem();\n });\n\n $list.on('click', '[data-repeater-delete]', function () {\n var self = $(this).closest('[data-repeater-item]').get(0);\n hide.call(self, function () {\n $(self).remove();\n setIndexes($items(), getGroupName(), fig.repeaters);\n });\n });\n });\n\n this.setList = setList;\n\n return this;\n};\n\n}(jQuery));\n\n//# sourceURL=webpack://Vuexy/./node_modules/jquery.repeater/jquery.repeater.js?")}},__webpack_module_cache__={};function __webpack_require__(n){var e=__webpack_module_cache__[n];if(void 0!==e)return e.exports;var t=__webpack_module_cache__[n]={exports:{}};return __webpack_modules__[n](t,t.exports,__webpack_require__),t.exports}__webpack_require__.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return __webpack_require__.d(e,{a:e}),e},__webpack_require__.d=function(n,e){for(var t in e)__webpack_require__.o(e,t)&&!__webpack_require__.o(n,t)&&Object.defineProperty(n,t,{enumerable:!0,get:e[t]})},__webpack_require__.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},__webpack_require__.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./libs/jquery-repeater/jquery-repeater.js");return __webpack_exports__}()})); \ No newline at end of file diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php index f80a00e..208cefe 100644 --- a/resources/views/auth/register.blade.php +++ b/resources/views/auth/register.blade.php @@ -56,13 +56,20 @@ type="text" class="form-control" id="username" - name="name" + name="username" + value="{{ old('username') }}" placeholder="Enter your username" autofocus /> + @error('username') +
{{ $message }}
+ @enderror
- + + @error('email') +
{{ $message }}
+ @enderror
@@ -76,6 +83,22 @@ aria-describedby="password" />
+ @error('password') +
{{ $message }}
+ @enderror + +
+ +
+ + +
@@ -119,4 +142,4 @@
-@endsection \ No newline at end of file +@endsection diff --git a/resources/views/layout/main.blade.php b/resources/views/layout/main.blade.php index 036e944..17e62d7 100644 --- a/resources/views/layout/main.blade.php +++ b/resources/views/layout/main.blade.php @@ -70,6 +70,7 @@ + diff --git a/resources/views/produktivitas/petani/header.blade.php b/resources/views/produktivitas/petani/header.blade.php index 80236be..a10b784 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,24 @@

Sosial Ekonomi

-
$5,345.43
+ @php + $sosialEkonomi = isset($petani) ? $petani->sosialEkonomi : null; + $skorSosialEkonomi = isset($petani) ? $petani->skorSosialEkonomi() : null; + $skorSosialEkonomiBulat = is_null($skorSosialEkonomi) ? null : (int) round($skorSosialEkonomi); + @endphp +
+ @if(!is_null($skorSosialEkonomi)) + {{ number_format($skorSosialEkonomiBulat, 0, ',', '.') }}% + @else + - + @endif +

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

@@ -120,9 +194,28 @@

Akses Pasar

-
$5,345.43
+ @php + $aksesPasar = isset($petani) ? $petani->aksesPasar : null; + $skorAksesPasar = isset($petani) ? $petani->skorAksesPasar() : null; + $skorAksesPasarBulat = null; + + if(!is_null($skorAksesPasar)) { + $skorAksesPasarBulat = (int) round($skorAksesPasar); + } + @endphp +
+ @if(!is_null($skorAksesPasar)) + {{ number_format($skorAksesPasarBulat, 0, ',', '.') }}% + @else + - + @endif +

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

diff --git a/resources/views/produktivitas/petani/praktik-budidaya/add.blade.php b/resources/views/produktivitas/petani/praktik-budidaya/add.blade.php index 0537add..a942274 100644 --- a/resources/views/produktivitas/petani/praktik-budidaya/add.blade.php +++ b/resources/views/produktivitas/petani/praktik-budidaya/add.blade.php @@ -31,7 +31,7 @@ + id="teknik-pemangkasan-lainnya" + data-target="#input-teknik-pemangkasan-lainnya">
@@ -167,16 +168,18 @@
-
-
- -
- { + const input = document.querySelector(radio.dataset.target); + + if (!input) return; + + input.disabled = !radio.checked; + + if (!radio.checked) { + input.value = ''; + } + }); + } + } + + document.querySelectorAll('input[type="radio"][data-target]').forEach(function (lainnyaRadio) { + const target = document.querySelector(lainnyaRadio.dataset.target); + + function toggleInput() { + target.disabled = !lainnyaRadio.checked; + + if (!lainnyaRadio.checked) { + target.value = ''; + } + } + + document.querySelectorAll(`input[name="${lainnyaRadio.name}"]`).forEach(function (radio) { + radio.addEventListener('change', toggleInput); + }); + + toggleInput(); + }); + + document.querySelectorAll('.lainnya-checkbox').forEach(function (trigger) { + const target = document.querySelector(trigger.dataset.target); + if (!target) return; + + function toggleInput() { + target.disabled = !trigger.checked; + + if (!trigger.checked) { + target.value = ''; + } + } + + trigger.addEventListener('change', toggleInput); + toggleInput(); + }); + }); @endpush \ No newline at end of file diff --git a/resources/views/produktivitas/petani/praktik-budidaya/edit.blade.php b/resources/views/produktivitas/petani/praktik-budidaya/edit.blade.php index 054d1e9..aca2652 100644 --- a/resources/views/produktivitas/petani/praktik-budidaya/edit.blade.php +++ b/resources/views/produktivitas/petani/praktik-budidaya/edit.blade.php @@ -16,6 +16,13 @@ @use('App\Enums\PraktikBudidaya\KondisiPengelolaanAir') @use('App\Enums\PraktikBudidaya\KebutuhanAirPermusim') @use('App\Enums\PraktikBudidaya\PemahamanManfaatKonservasi') +@use('App\Enums\PraktikBudidaya\DasarPenentuanPanen') +@use('App\Enums\PraktikBudidaya\Bulan') +@use('App\Enums\PraktikBudidaya\PraktikSortasi') +@use('App\Enums\PraktikBudidaya\CaraSortasi') +@use('App\Enums\PraktikBudidaya\EstimasiKehilanganHasil') +@use('App\Enums\PraktikBudidaya\TingkatPanenReject') +@use('App\Enums\PraktikBudidaya\TindakanPanenReject')
@if ($errors->any())
@@ -554,7 +561,7 @@ @error('metode_penanganan_hama_penyakit')
{{ $message }}
@enderror
- +
- +
-
- Kebiasaan Konservasi Tanah*
-
-
-
-
- kebiasaan_konservasi_tanah ?? [])) ? 'checked' : '' }}>
- @error('jenis_hama') + @error('kebiasaan_konservasi_tanah')
{{ $message }}
@enderror
@@ -1055,7 +1066,7 @@ class="form-control rupiah-input @error('biaya_pestisida') is-invalid @enderror" id="biaya-pestisida" name="biaya_pestisida" - value="{{ old('biaya_pestisida', filled($praktikBudidaya->biaya_pestisida) ? number_format($praktikBudidaya->biaya_pestisida, 0, ',', '.') : '') }}" + value="{{ old('biaya_pestisida', filled($praktikBudidaya->biaya_obat_obatan) ? number_format($praktikBudidaya->biaya_obat_obatan, 0, ',', '.') : '') }}" placeholder="Contoh: 150.000">
@error('biaya_pestisida') @@ -1072,7 +1083,7 @@ class="form-control rupiah-input @error('biaya_sewa_alat') is-invalid @enderror" id="biaya-sewa-alat" name="biaya_sewa_alat" - value="{{ old('biaya_sewa_alat', filled($praktikBudidaya->biaya_sewa_alat) ? number_format($praktikBudidaya->biaya_sewa_alat, 0, ',', '.') : '') }}" + value="{{ old('biaya_sewa_alat', filled($praktikBudidaya->biaya_sewa_alat_produksi) ? number_format($praktikBudidaya->biaya_sewa_alat_produksi, 0, ',', '.') : '') }}" placeholder="Contoh: 150.000">
@error('biaya_sewa_alat') @@ -1106,7 +1117,7 @@ class="form-control rupiah-input @error('biaya_lainnya') is-invalid @enderror" id="biaya-lainnya" name="biaya_lainnya" - value="{{ old('biaya_lainnya', filled($praktikBudidaya->biaya_lainnya) ? number_format($praktikBudidaya->biaya_lainnya, 0, ',', '.') : '') }}" + value="{{ old('biaya_lainnya', filled($praktikBudidaya->biaya_produksi_lainnya) ? number_format($praktikBudidaya->biaya_produksi_lainnya, 0, ',', '.') : '') }}" placeholder="Contoh: 150.000">
@error('biaya_lainnya') @@ -1124,7 +1135,8 @@ id="total-estimasi-biaya-produksi" name="total_estimasi_biaya_produksi" value="{{ old('total_estimasi_biaya_produksi', filled($praktikBudidaya->total_estimasi_biaya_produksi) ? number_format($praktikBudidaya->total_estimasi_biaya_produksi, 0, ',', '.') : '') }}" - placeholder="Contoh: 150.000"> + placeholder="Otomatis terhitung" + readonly>
@error('total_estimasi_biaya_produksi')
{{ $message }}
@@ -1135,11 +1147,14 @@
- - - - + @foreach (DasarPenentuanPanen::options() as $option) + + @endforeach @error('dasar_penentuan_panen')
{{ $message }}
@enderror
@@ -1150,15 +1165,15 @@ -
- + value="{{ old('frekuensi_panen_pertahun', $surveyPanen?->frekuensi_panen_pertahun) }}" + step="0.01" + min="0"> Panen/Tahun
@@ -1168,62 +1183,82 @@
- - @error('bulan_panen_utama')
{{ $message }}
@enderror + + + + @error('bulan_panen_utama') +
{{ $message }}
+ @enderror
Hasil Panen Aktual
-
-
-
-
- - +
+
+
- - Kg/Tahun + value="{{ old('hasil_panen_disimpan', $surveyPanen?->hasil_panen_disimpan) }}" + step="0.01" + min="0"> + Kg/Musim
@error('hasil_panen_disimpan') @@ -1260,8 +1299,8 @@ @enderror
- - + + @error('tujuan_disimpan')
{{ $message }}
@enderror
@@ -1283,19 +1322,27 @@
- - - + @foreach (PraktikSortasi::options() as $option) + + @endforeach @error('praktik_sortasi')
{{ $message }}
@enderror
- - - + @foreach (CaraSortasi::options() as $option) + + @endforeach @error('bentuk_sortasi')
{{ $message }}
@enderror
@@ -1303,34 +1350,146 @@
Hasil Panen Reject & Estimasi Biaya Panen
- - - @error('upah_tenaga_panen')
{{ $message }}
@enderror + + + @error('praktik_sortasi')
{{ $message }}
@enderror
- - - @error('biaya_pengangkutan')
{{ $message }}
@enderror + +
+ + Kg/Musim +
+ + @error('hasil_panen_reject') +
{{ $message }}
+ @enderror
- - - @error('biaya_wadah_kemasan')
{{ $message }}
@enderror + + + @error('bentuk_sortasi')
{{ $message }}
@enderror
- - - @error('biaya_sewa_alat_panen')
{{ $message }}
@enderror -
-
- - - @error('biaya_panen_lainnya')
{{ $message }}
@enderror + +
+ Rp + +
+ @error('upah_tenaga_panen') +
{{ $message }}
+ @enderror
- - - @error('total_estimasi_biaya_panen')
{{ $message }}
@enderror + +
+ Rp + +
+ @error('biaya_pengangkutan') +
{{ $message }}
+ @enderror +
+
+ +
+ Rp + +
+ @error('biaya_wadah_kemasan') +
{{ $message }}
+ @enderror +
+
+ +
+ Rp + +
+ @error('biaya_sewa_alat_panen') +
{{ $message }}
+ @enderror +
+
+ +
+ Rp + +
+ @error('biaya_panen_lainnya') +
{{ $message }}
+ @enderror +
+
+ +
+ Rp + +
+ @error('total_estimasi_biaya_panen') +
{{ $message }}
+ @enderror
@@ -1347,48 +1506,105 @@
Produktivitas Rata-rata 3 Musim Panen Terakhir per Komoditas
- + {{-- DATA LAMA --}} + @if ($surveyProduktivitas->count() > 0) + @foreach ($surveyProduktivitas as $row) +
+
+ + +
+ +
+ +
+ + Kg +
+
+ +
+ + +
+ +
+ + @csrf + @method('DELETE') + + +
+
+ @endforeach + @endif + + {{-- FORM TAMBAH DATA BARU --}} +
+ @csrf +
+
- + @foreach ($komoditas as $item) + + @endforeach
+
- + Kg
+
-
+ +
-
+ Ha/Tahun + + +
+ Pohon/Tahun +
+
- - +
+

-
- -
+ +
+ + +
@@ -1401,56 +1617,32 @@
Kehilangan Hasil Akibat Organisme Pengganggu Tumbuhan (OPT)
- - -
- estimasi_kehilangan_hasil) == 'Selalu, setiap musim berbunga' ? 'checked' : '' }}> - -
- -
- estimasi_kehilangan_hasil) == 'Kadang-kadang, tergantung kondisi' ? 'checked' : '' }}> - -
- -
- estimasi_kehilangan_hasil) == 'Tidak pernah' ? 'checked' : '' }}> - -
- -
- estimasi_kehilangan_hasil) == 'Lainnya' ? 'checked' : '' }}> - - - - -
- - @error('estimasi_kehilangan_hasil') + + + @error('estimasi_kehilangan_akibat_opt') +
{{ $message }}
+ @enderror +
+
+ + + @error('estimasi_kehilangan_akibat_hama')
{{ $message }}
@enderror
@@ -1474,7 +1666,7 @@ 'use strict'; $(document).ready(function () { - $('#tenaga-kerja, #frekuensi-pemangkasan-komoditas-utama, #frekuensi-pemangkasan-pohon-penaung, #penyerbukan-manual, #pemberian-pupuk, #jenis-pupuk, #metode-penanganan-hama-penyakit, #intensitas-serangan, #waktu-kemunculan-terparah, #frekuensi-sanitasi-lahan, #penanganan-sisa-buah-ranting, #penanganan-gulma, #kondisi-pengelolaan-air-irigasi, #kebutuhan-air-permusim, #pemahaman-manfaat-konservasi').select2(); + $('#tenaga-kerja, #frekuensi-pemangkasan-komoditas-utama, #frekuensi-pemangkasan-pohon-penaung, #penyerbukan-manual, #pemberian-pupuk, #jenis-pupuk, #metode-penanganan-hama-penyakit, #intensitas-serangan, #waktu-kemunculan-terparah, #frekuensi-sanitasi-lahan, #penanganan-sisa-buah-ranting, #penanganan-gulma, #kondisi-pengelolaan-air-irigasi, #kebutuhan-air-permusim, #pemahaman-manfaat-konservasi, #dasar-penentuan-panen, #praktik-sortasi, #bentuk-sortasi, #estimasi-kehilangan-akibat-opt, #tingkat-reject, #tindakan-hasil-reject, #estimasi-kehilangan-akibat-hama, #komoditas-id').select2(); const $switch = $('input[name="disimpan_untuk_diri_sendiri"]'); const $text = $('#switch-text'); @@ -1584,6 +1776,128 @@ trigger.addEventListener('change', toggleInput); toggleInput(); }); + + const biayaProduksiFields = [ + 'upah-tenaga-kerja', + 'biaya-bibit', + 'biaya-pupuk', + 'biaya-pestisida', + 'biaya-sewa-alat', + 'biaya-penyediaan-air', + 'biaya-lainnya' + ]; + + const biayaPanenFields = [ + 'upah-tenaga-panen', + 'biaya-pengangkutan', + 'biaya-wadah-kemasan', + 'biaya-sewa-alat-panen', + 'biaya-panen-lainnya' + ]; + + const totalBiayaProduksiField = document.getElementById('total-estimasi-biaya-produksi'); + const totalBiayaPanenField = document.getElementById('total-estimasi-biaya-panen'); + + function parseRupiah(value) { + if (!value) return 0; + + return parseInt(value.replace(/[^0-9]/g, '')) || 0; + } + + function formatRupiah(value) { + return value.toLocaleString('id-ID'); + } + + function hitungTotal(fields, totalField) { + if (!totalField) return; + + let total = 0; + + fields.forEach(function (id) { + const field = document.getElementById(id); + + if (field) { + total += parseRupiah(field.value); + } + }); + + totalField.value = total > 0 ? formatRupiah(total) : ''; + } + + function hitungTotalBiayaProduksi() { + hitungTotal(biayaProduksiFields, totalBiayaProduksiField); + } + + function hitungTotalBiayaPanen() { + hitungTotal(biayaPanenFields, totalBiayaPanenField); + } + + biayaProduksiFields.forEach(function (id) { + const field = document.getElementById(id); + + if (field) { + field.addEventListener('input', hitungTotalBiayaProduksi); + field.addEventListener('change', hitungTotalBiayaProduksi); + } + }); + + biayaPanenFields.forEach(function (id) { + const field = document.getElementById(id); + + if (field) { + field.addEventListener('input', hitungTotalBiayaPanen); + field.addEventListener('change', hitungTotalBiayaPanen); + } + }); + + hitungTotalBiayaProduksi(); + hitungTotalBiayaPanen(); + + const switchInput = document.getElementById('disimpan-untuk-sendiri'); + const switchText = document.getElementById('switch-text'); + + const detailWrapper = document.getElementById('detail-disimpan-wrapper'); + const hasilPanenDisimpan = document.getElementById('hasil-panen-disimpan'); + const tujuanDisimpan = document.getElementById('tujuan-disimpan'); + + function toggleDetailDisimpan() { + const isChecked = switchInput.checked; + + if (isChecked) { + detailWrapper.classList.remove('d-none'); + + hasilPanenDisimpan.disabled = false; + tujuanDisimpan.disabled = false; + + switchText.textContent = 'Ya, Sebagian Disimpan'; + } else { + detailWrapper.classList.add('d-none'); + + hasilPanenDisimpan.disabled = true; + tujuanDisimpan.disabled = true; + + hasilPanenDisimpan.value = ''; + tujuanDisimpan.value = ''; + + switchText.textContent = 'Tidak, Semua Dijual'; + } + } + + switchInput.addEventListener('change', toggleDetailDisimpan); + + toggleDetailDisimpan(); }); + @endpush \ No newline at end of file diff --git a/resources/views/produktivitas/petani/sosial-ekonomi/edit.blade.php b/resources/views/produktivitas/petani/sosial-ekonomi/edit.blade.php index df75a1f..bf2944b 100644 --- a/resources/views/produktivitas/petani/sosial-ekonomi/edit.blade.php +++ b/resources/views/produktivitas/petani/sosial-ekonomi/edit.blade.php @@ -20,30 +20,29 @@
@include('produktivitas.petani.header', ['petani' => $petani]) -
+ @csrf - @if($sosialEkonomi) - @method('PUT') - @endif + @method('PUT') +
Komposisi Anggota Keluarga
- + @error('jumlah_tanggungan')
{{ $message }}
@enderror
- + @error('anak_masih_sekolah')
{{ $message }}
@enderror
- + @error('yang_ikut_bekerja')
{{ $message }}
@enderror
@@ -62,6 +61,7 @@ Komoditas Pendapatan Periode + Aksi @@ -98,18 +98,23 @@
+ + + @endfor
-
-
Pendapatan dari Komoditas Lain
+
Pendapatan dari Komoditas Lainnya
@@ -117,6 +122,7 @@ + @@ -154,14 +160,19 @@ + @endfor
Komoditas Pendapatan PeriodeAksi
+ +
-
@@ -172,6 +183,7 @@ Jenis Pekerjaan Estimasi per Bulan + Aksi @@ -188,13 +200,18 @@
+ + + @endfor
-
@@ -203,7 +220,7 @@
@php $skorPeriodePaceklikValue = old('skor_periode_paceklik', $sosialEkonomi?->skor_periode_paceklik?->value); @endphp - + @foreach($periodePaceklikOptions as $option)
@@ -213,12 +230,12 @@ @error('skor_periode_paceklik')
{{ $message }}
@enderror
- + @error('bulan_paceklik')
{{ $message }}
@enderror
- + @error('sumber_penghasilan_paceklik')
{{ $message }}
@enderror
@@ -227,7 +244,7 @@
Biaya Produksi dan Tabungan
- + @php $biayaKebunValue = old('total_estimasi_biaya_kebun_per_musim', $sosialEkonomi?->total_estimasi_biaya_kebun_per_musim) @endphp
Rp @@ -237,7 +254,7 @@
@php $skorKemampuanMenabungValue = old('skor_kemampuan_menabung', $sosialEkonomi?->skor_kemampuan_menabung?->value); @endphp - + @foreach($kemampuanMenabungOptions as $option)
@@ -247,7 +264,7 @@ @error('skor_kemampuan_menabung')
{{ $message }}
@enderror
- + @php $tabunganValue = old('estimasi_tabungan_per_bulan', $sosialEkonomi?->estimasi_tabungan_per_bulan) @endphp
Rp @@ -261,7 +278,7 @@
@php $skorKecukupanPenghasilanValue = old('skor_kecukupan_penghasilan', $sosialEkonomi?->skor_kecukupan_penghasilan?->value); @endphp - + @foreach($kecukupanPenghasilanOptions as $option)
@@ -271,7 +288,7 @@ @error('skor_kecukupan_penghasilan')
{{ $message }}
@enderror
- + @error('alasan_kecukupan_penghasilan')
{{ $message }}
@enderror
@@ -280,7 +297,7 @@
Kondisi Aset & Lahan - Kejelasan Hak Kelola
- + @@ -304,7 +321,7 @@ @php $adaSertifikatValue = old('ada_sertifikat_dokumen', is_null($sosialEkonomi?->ada_sertifikat_dokumen) ? null : (int) $sosialEkonomi->ada_sertifikat_dokumen); @endphp - +
@@ -319,7 +336,7 @@ @php $adaSengketaValue = old('ada_sengketa', is_null($sosialEkonomi?->ada_sengketa) ? null : (int) $sosialEkonomi->ada_sengketa); @endphp - +
@@ -333,12 +350,12 @@
- + @error('keterangan_sengketa')
{{ $message }}
@enderror
- + @error('pihak_membantu_konflik_nama')
{{ $message }}
@enderror
- + @error('tahun_bantuan_konflik')
{{ $message }}
@enderror
- + + + +
+
+
Kemauan Mencoba Praktik Baru
+
+
+ @php $kemauanMencobaPraktikBaruValue = old('kemauan_mencoba_praktik_baru', $sosialEkonomi?->kemauan_mencoba_praktik_baru?->value); @endphp + + @foreach($kemauanMencobaPraktikBaruOptions as $option) +
+ + +
+ @endforeach + @error('kemauan_mencoba_praktik_baru')
{{ $message }}
@enderror +
+
+ + + @error('alasan_mencoba_praktik_baru')
{{ $message }}
@enderror +
+
+ +
Hambatan Mengubah Cara Bertani
+
+
+ + + @error('hambatan_mengubah_cara_bertani')
{{ $message }}
@enderror +
+
+ +
Pemahaman Mutu & Harga
+
+
+ @php $pemahamanMutuHargaValue = old('pemahaman_mutu_harga', $sosialEkonomi?->pemahaman_mutu_harga?->value); @endphp + + @foreach($pemahamanMutuHargaOptions as $option) +
+ + +
+ @endforeach + @error('pemahaman_mutu_harga')
{{ $message }}
@enderror +
+
+ + + @error('contoh_pemahaman_mutu_harga')
{{ $message }}
@enderror +
+
+ + + @error('pengetahuan_harga_hasil_olah')
{{ $message }}
@enderror +
+
+ + + @error('pernah_jual_harga_lebih_tinggi')
{{ $message }}
@enderror +
+
+ + + @error('penyebab_harga_lebih_tinggi')
{{ $message }}
@enderror +
+
+ + + @error('usaha_mutu_tambahan_harga')
{{ $message }}
@enderror +
+
+ + + @error('alasan_usaha_mutu_tambahan_harga')
{{ $message }}
@enderror +
+
+ +
Panutan di Sekitar Petani
+
+
+ @php $panutanPetaniSuksesValue = old('panutan_petani_sukses', $sosialEkonomi?->panutan_petani_sukses?->value); @endphp + + @foreach($panutanPetaniSuksesOptions as $option) +
+ + +
+ @endforeach + @error('panutan_petani_sukses')
{{ $message }}
@enderror +
+
+ + + @error('nama_lokasi_panutan')
{{ $message }}
@enderror +
+
+ +
Kemauan Terlibat dalam Program
+
+
+ @php $kemauanIkutProgramValue = old('kemauan_ikut_program', $sosialEkonomi?->kemauan_ikut_program?->value); @endphp + + @foreach($kemauanIkutProgramOptions as $option) +
+ + +
+ @endforeach + @error('kemauan_ikut_program')
{{ $message }}
@enderror +
+
+ + + @error('harapan_program')
{{ $message }}
@enderror +
+
+ +
Rencana & Harapan Jangka Panjang
+
+
+ @php $orientasiRencanaJangkaPanjangValue = old('orientasi_rencana_jangka_panjang', $sosialEkonomi?->orientasi_rencana_jangka_panjang?->value); @endphp + + @foreach($orientasiRencanaJangkaPanjangOptions as $option) +
+ + +
+ @endforeach + @error('orientasi_rencana_jangka_panjang')
{{ $message }}
@enderror +
+
+ + + @error('rencana_jangka_panjang')
{{ $message }}
@enderror +
+
+ +
+ +
+
+
+ + +
+ @csrf + @method('PUT') + + + + +
+
+
Status Keanggotaan
+
+
+ @php $terdaftarKelompokTaniValue = old('terdaftar_kelompok_tani', $sosialEkonomi?->terdaftar_kelompok_tani?->value); @endphp + + @foreach($terdaftarKelompokTaniOptions as $option) +
+ + +
+ @endforeach + @error('terdaftar_kelompok_tani')
{{ $message }}
@enderror +
+
+ + + @error('nama_kelompok_tani')
{{ $message }}
@enderror +
+
+ + + @error('lama_bergabung_kelompok_tahun')
{{ $message }}
@enderror +
+
+ + + @error('kedekatan_sesama_anggota')
{{ $message }}
@enderror +
+
+ +
Keaktifan dalam Kelompok
+
+
+ @php $keaktifanPertemuanKelompokValue = old('keaktifan_pertemuan_kelompok', $sosialEkonomi?->keaktifan_pertemuan_kelompok?->value); @endphp + + @foreach($keaktifanPertemuanKelompokOptions as $option) +
+ + +
+ @endforeach + @error('keaktifan_pertemuan_kelompok')
{{ $message }}
@enderror +
+
+ + + @error('topik_biasa_dibahas')
{{ $message }}
@enderror +
+
+ +
Peran dalam Kelompok
+
+
+ @php $peranDalamKelompokValue = old('peran_dalam_kelompok', $sosialEkonomi?->peran_dalam_kelompok?->value); @endphp + + @foreach($peranDalamKelompokOptions as $option) +
+ + +
+ @endforeach + @error('peran_dalam_kelompok')
{{ $message }}
@enderror +
+
+ @php $manfaatKelompokTaniValue = old('manfaat_kelompok_tani', $sosialEkonomi?->manfaat_kelompok_tani?->value); @endphp + + @foreach($manfaatKelompokTaniOptions as $option) +
+ + +
+ @endforeach + @error('manfaat_kelompok_tani')
{{ $message }}
@enderror +
+
+ +
Kartu Tani
+
+
+ + + @error('status_kartu_tani')
{{ $message }}
@enderror +
+
+ + + @error('bisa_beli_pupuk_bersubsidi')
{{ $message }}
@enderror +
+
+ + + @error('manfaat_lain_kartu_tani')
{{ $message }}
@enderror +
+
+ +
+ +
+
+
+
+ +
+ @csrf + @method('PUT') + + + + +
+
+
Kepemilikan Akses ke Lembaga Keuangan Formal
+
+
+ @php $statusRekeningTabunganValue = old('status_rekening_tabungan', $sosialEkonomi?->status_rekening_tabungan?->value); @endphp + + @foreach($statusRekeningTabunganOptions as $option) +
+ + +
+ @endforeach + @error('status_rekening_tabungan')
{{ $message }}
@enderror +
+
+ + + @error('nama_bank')
{{ $message }}
@enderror +
+
+ +
Pengalaman Pengajuan Kredit
+
+
+ @php $pengalamanKreditKebunValue = old('pengalaman_kredit_kebun', $sosialEkonomi?->pengalaman_kredit_kebun?->value); @endphp + + @foreach($pengalamanKreditKebunOptions as $option) +
+ + +
+ @endforeach + @error('pengalaman_kredit_kebun')
{{ $message }}
@enderror +
+
+ @php + $alasanKreditValues = old('alasan_kredit_ditolak', $sosialEkonomi?->alasan_kredit_ditolak ?? []); + $alasanKreditValues = is_array($alasanKreditValues) ? $alasanKreditValues : []; + @endphp + + @foreach($alasanKreditDitolakOptions as $option) +
+ + +
+ @endforeach + @error('alasan_kredit_ditolak')
{{ $message }}
@enderror + + @error('alasan_kredit_ditolak_lainnya')
{{ $message }}
@enderror +
+
+ +
Kepemilikan Aset Produktif
+
+
+ @php $kondisiAsetProduktifValue = old('kondisi_aset_produktif', $sosialEkonomi?->kondisi_aset_produktif?->value); @endphp + + @foreach($kondisiAsetProduktifOptions as $option) +
+ + +
+ @endforeach + @error('kondisi_aset_produktif')
{{ $message }}
@enderror +
+
+ @php + $jenisAsetValues = old('jenis_aset_produktif', $sosialEkonomi?->jenis_aset_produktif ?? []); + $jenisAsetValues = is_array($jenisAsetValues) ? $jenisAsetValues : []; + @endphp + + @foreach($jenisAsetProduktifOptions as $option) +
+ + +
+ @endforeach + @error('jenis_aset_produktif')
{{ $message }}
@enderror + + @error('jenis_aset_produktif_lainnya')
{{ $message }}
@enderror +
+
+ + + @error('keterangan_kondisi_aset')
{{ $message }}
@enderror +
+
+ +
Akses terhadap Program Pelayanan Keuangan Formal
+
+
+ @php $keterlibatanProgramKeuanganFormalValue = old('keterlibatan_program_keuangan_formal', $sosialEkonomi?->keterlibatan_program_keuangan_formal?->value); @endphp + + @foreach($keterlibatanProgramKeuanganFormalOptions as $option) +
+ + +
+ @endforeach + @error('keterlibatan_program_keuangan_formal')
{{ $message }}
@enderror +
+
+ @php + $statusProgramValues = old('status_program_keuangan_formal', $sosialEkonomi?->status_program_keuangan_formal ?? []); + $statusProgramValues = is_array($statusProgramValues) ? $statusProgramValues : []; + @endphp +
+ + + + + @foreach($statusProgramKeuanganFormalOptions as $statusOption) + + @endforeach + + + + @foreach($programKeuanganFormalRows as $programKey => $programLabel) + + + @foreach($statusProgramKeuanganFormalOptions as $statusOption) + + @endforeach + + @endforeach + +
Program{{ $statusOption['label'] }}
+ @if($programKey === 'lainnya') + + @error('program_keuangan_formal_lainnya_nama')
{{ $message }}
@enderror + @else + {{ $programLabel }} + @endif +
+
+ +
+
+
+ @error('status_program_keuangan_formal')
{{ $message }}
@enderror +
+
+ +
Akses Terhadap Bantuan
+
+
+ @php $pernahBantuanNgoPerusahaanValue = old('pernah_bantuan_ngo_perusahaan', $sosialEkonomi?->pernah_bantuan_ngo_perusahaan?->value); @endphp + + @foreach($pernahBantuanNgoPerusahaanOptions as $option) +
+ + +
+ @endforeach + @error('pernah_bantuan_ngo_perusahaan')
{{ $message }}
@enderror +
+
+ @php + $detailBantuanValues = old('detail_bantuan_ngo_perusahaan', $sosialEkonomi?->detail_bantuan_ngo_perusahaan ?? []); + $detailBantuanValues = is_array($detailBantuanValues) ? $detailBantuanValues : []; + @endphp +
+ + + + + + + + + + + @for($i = 0; $i < 2; $i++) + + + + + + + @endfor + +
Nama LembagaBentuk BantuanFrekuensiTahun Terakhir
+ + @error("detail_bantuan_ngo_perusahaan.$i.nama_lembaga")
{{ $message }}
@enderror +
+ + @error("detail_bantuan_ngo_perusahaan.$i.bentuk_bantuan")
{{ $message }}
@enderror +
+
+ + kali/tahun + @error("detail_bantuan_ngo_perusahaan.$i.frekuensi")
{{ $message }}
@enderror +
+
+ + @error("detail_bantuan_ngo_perusahaan.$i.tahun_terakhir")
{{ $message }}
@enderror +
+
+
+
+ +
+ +
+
+
+
+ +
+ @csrf + @method('PUT') + + + + +
+
+
Keterikatan hutang
+
+
+ @php $keterikatanHutangPanenValue = old('keterikatan_hutang_panen', $sosialEkonomi?->keterikatan_hutang_panen?->value); @endphp + + @foreach($keterikatanHutangPanenOptions as $option) +
+ + +
+ @endforeach + @error('keterikatan_hutang_panen')
{{ $message }}
@enderror +
+
+ @php $pinjamanTokohAdatPanenValue = old('pinjaman_tokoh_adat_panen', $sosialEkonomi?->pinjaman_tokoh_adat_panen?->value); @endphp + + @foreach($pinjamanTokohAdatPanenOptions as $option) +
+ + +
+ @endforeach + @error('pinjaman_tokoh_adat_panen')
{{ $message }}
@enderror + + @error('keterangan_pinjaman_tokoh_adat')
{{ $message }}
@enderror +
+
+ + @php $totalHutangValue = old('total_hutang_rupiah', $sosialEkonomi?->total_hutang_rupiah) @endphp +
+ Rp + + @error('total_hutang_rupiah')
{{ $message }}
@enderror +
+
+
+ +
+ + kg + @error('total_hutang_setara_kg_panen')
{{ $message }}
@enderror +
+
+
+
+ total_hutang_tidak_bersedia) ? 'checked' : '' }}> + +
+
+
+ @php $praktikIjonValue = old('praktik_ijon', $sosialEkonomi?->praktik_ijon?->value); @endphp + + @foreach($praktikIjonOptions as $option) +
+ + +
+ @endforeach + @error('praktik_ijon')
{{ $message }}
@enderror +
+
+ + @foreach($tekananJualSegeraOptions as $option) +
+ tekanan_jual_segera?->value) === $option['value'] ? 'checked' : '' }}> + +
+ @endforeach + @error('tekanan_jual_segera')
{{ $message }}
@enderror + + @error('penyebab_tekanan_jual_segera')
{{ $message }}
@enderror +
+
+ +
Persepsi Kebebasan Menjual Hasil Panen
+
+
+ @php $kebebasanMemilihPembeliValue = old('kebebasan_memilih_pembeli', $sosialEkonomi?->kebebasan_memilih_pembeli?->value); @endphp + + @foreach($kebebasanMemilihPembeliOptions as $option) +
+ + +
+ @endforeach + @error('kebebasan_memilih_pembeli')
{{ $message }}
@enderror +
+
+ + + @error('alasan_tidak_bebas_memilih_pembeli')
{{ $message }}
@enderror +
+
+ + + @error('minat_pembeli_harga_stabil')
{{ $message }}
@enderror +
+
+ + + @error('alasan_minat_pembeli_harga_stabil')
{{ $message }}
@enderror +
+
+ +
+
@@ -387,8 +1049,21 @@ 'use strict'; $(document).ready(function () { const pihakMembantuTanpaBantuan = @json($pihakMembantuTanpaBantuanValue); + const pernahJualHargaLebihTinggiPernah = @json($pernahJualHargaLebihTinggiPernahValue); + const panutanPetaniSuksesTidakAda = String(@json($panutanPetaniSuksesTidakAdaValue)); + const terdaftarKelompokTaniYa = @json($terdaftarKelompokTaniYaValue); + const statusRekeningTidakPunya = String(@json($statusRekeningTidakPunyaValue)); + const pengalamanKreditPerluAlasan = @json($pengalamanKreditPerluAlasanValues).map(String); + const alasanKreditLainnya = @json($alasanKreditLainnyaValue); + const kondisiAsetTidakAda = String(@json($kondisiAsetTidakAdaValue)); + const jenisAsetLainnya = @json($jenisAsetLainnyaValue); + const keterlibatanProgramTidakPernah = String(@json($keterlibatanProgramKeuanganFormalTidakPernahValue)); + const pernahBantuanNgoPerusahaanPernah = @json($pernahBantuanNgoPerusahaanPernahValue); + const pinjamanTokohAdatAda = @json($pinjamanTokohAdatAdaValue); + const tekananJualSegeraAda = @json($tekananJualSegeraAdaValue); + const kebebasanMemilihPembeliCukupBebas = Number(@json($kebebasanMemilihPembeliCukupBebasValue)); - $('#status-kepemilikan-lahan, #pihak-membantu, #status-konflik, .sosial-ekonomi-komoditas').select2(); + $('#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(); function syncKomoditasLainnyaOptions() { const selectedUtama = $('.sosial-ekonomi-komoditas-utama') @@ -428,6 +1103,78 @@ return Boolean(triggerValue); } + function isPendapatanKomoditasGroup(group) { + return group === 'komoditas-utama' || group === 'komoditas-lainnya'; + } + + function clearPendapatanRowValidation($row) { + $row.find('.is-invalid').removeClass('is-invalid'); + $row.find('.select2-selection').removeClass('is-invalid'); + $row.find('.pendapatan-row-feedback').remove(); + } + + function showPendapatanRowValidation($element, message) { + const $cell = $element.closest('td'); + + if ($cell.find('.pendapatan-row-feedback').length) { + return; + } + + $cell.append(`
${message}
`); + } + + function validatePendapatanKomoditasRow($row) { + const $komoditas = $row.find('.sosial-ekonomi-komoditas').first(); + const $pendapatan = $row.find('.currency-input').first(); + const hasKomoditas = Boolean($komoditas.val()); + const hasPendapatan = Boolean(onlyDigits($pendapatan.val())); + const hasPeriode = $row.find('input[type="radio"]:checked').length > 0; + + clearPendapatanRowValidation($row); + $komoditas.toggleClass('is-invalid', !hasKomoditas); + $komoditas.next('.select2').find('.select2-selection').toggleClass('is-invalid', !hasKomoditas); + $pendapatan.toggleClass('is-invalid', !hasPendapatan); + $row.find('input[type="radio"]').toggleClass('is-invalid', !hasPeriode); + + if (!hasKomoditas) { + showPendapatanRowValidation($komoditas, 'Komoditas wajib diisi.'); + } + + if (!hasPendapatan) { + showPendapatanRowValidation($pendapatan, 'Pendapatan wajib diisi.'); + } + + if (!hasPeriode) { + showPendapatanRowValidation($row.find('input[type="radio"]').first(), 'Periode wajib dipilih.'); + } + + return hasKomoditas && hasPendapatan && hasPeriode; + } + + function canAddPendapatanRow(group) { + if (!isPendapatanKomoditasGroup(group)) { + return true; + } + + let isValid = true; + let $firstInvalidRow = null; + + $('.pendapatan-row[data-group="' + group + '"]:visible').each(function () { + const $row = $(this); + + if (!validatePendapatanKomoditasRow($row)) { + isValid = false; + $firstInvalidRow = $firstInvalidRow || $row; + } + }); + + if ($firstInvalidRow) { + $firstInvalidRow.find('.is-invalid').first().trigger('focus'); + } + + return isValid; + } + function setupPendapatanRows(group) { const $rows = $('.pendapatan-row[data-group="' + group + '"]'); @@ -470,6 +1217,10 @@ } function showNextPendapatanRow(group) { + if (!canAddPendapatanRow(group)) { + return; + } + const visibleRows = $('.pendapatan-row[data-group="' + group + '"]:visible').length; const maxRows = maxPendapatanRows(group); @@ -570,6 +1321,11 @@
+ + + `); } @@ -589,6 +1345,11 @@
+ + + `); } @@ -604,6 +1365,165 @@ } } + function syncPernahJualHargaLebihTinggiFields() { + const isPernah = $('#pernah-jual-harga-lebih-tinggi').val() === pernahJualHargaLebihTinggiPernah; + const $field = $('#penyebab-harga-lebih-tinggi'); + + $field.prop('disabled', !isPernah); + + if (!isPernah) { + $field.val(''); + } + } + + function syncPanutanFields() { + const isTidakAda = $('input[name="panutan_petani_sukses"]:checked').val() === panutanPetaniSuksesTidakAda; + const $field = $('#nama-lokasi-panutan'); + + $field.prop('disabled', isTidakAda); + + if (isTidakAda) { + $field.val(''); + } + } + + function syncTerdaftarKelompokFields() { + const isTerdaftar = $('input[name="terdaftar_kelompok_tani"]:checked').val() === terdaftarKelompokTaniYa; + const $fields = $('#nama-kelompok-tani, #lama-bergabung-kelompok, #kedekatan-sesama-anggota'); + + $fields.prop('disabled', !isTerdaftar); + + if (!isTerdaftar) { + $fields.val(''); + $('#kedekatan-sesama-anggota').trigger('change.select2'); + } + } + + function syncStatusRekeningFields() { + const isTidakPunya = $('input[name="status_rekening_tabungan"]:checked').val() === statusRekeningTidakPunya; + const $field = $('#nama-bank'); + + $field.prop('disabled', isTidakPunya); + + if (isTidakPunya) { + $field.val(''); + } + } + + function syncPengalamanKreditFields() { + const perluAlasan = pengalamanKreditPerluAlasan.includes($('input[name="pengalaman_kredit_kebun"]:checked').val()); + const $fields = $('input[name="alasan_kredit_ditolak[]"], #alasan-kredit-lainnya'); + + $fields.prop('disabled', !perluAlasan); + + if (!perluAlasan) { + $('input[name="alasan_kredit_ditolak[]"]').prop('checked', false); + $('#alasan-kredit-lainnya').val(''); + } + + syncAlasanKreditLainnyaField(); + } + + function syncAlasanKreditLainnyaField() { + const isLainnya = $('input[name="alasan_kredit_ditolak[]"][value="' + alasanKreditLainnya + '"]').is(':checked'); + $('#alasan-kredit-lainnya').prop('disabled', !isLainnya); + + if (!isLainnya) { + $('#alasan-kredit-lainnya').val(''); + } + } + + function syncAsetProduktifFields() { + const isTidakAda = $('input[name="kondisi_aset_produktif"]:checked').val() === kondisiAsetTidakAda; + const $fields = $('input[name="jenis_aset_produktif[]"], #jenis-aset-lainnya, #keterangan-kondisi-aset'); + + $fields.prop('disabled', isTidakAda); + + if (isTidakAda) { + $('input[name="jenis_aset_produktif[]"]').prop('checked', false); + $('#jenis-aset-lainnya, #keterangan-kondisi-aset').val(''); + } + + syncJenisAsetLainnyaField(); + } + + function syncJenisAsetLainnyaField() { + const isLainnya = $('input[name="jenis_aset_produktif[]"][value="' + jenisAsetLainnya + '"]').is(':checked'); + $('#jenis-aset-lainnya').prop('disabled', !isLainnya); + + if (!isLainnya) { + $('#jenis-aset-lainnya').val(''); + } + } + + function syncProgramKeuanganFormalFields() { + const isTidakPernah = String($('input[name="keterlibatan_program_keuangan_formal"]:checked').val() || '') === keterlibatanProgramTidakPernah; + const $fields = $('input[name^="status_program_keuangan_formal["], #program-keuangan-lainnya'); + + $fields.prop('disabled', isTidakPernah); + + if (isTidakPernah) { + $('input[name^="status_program_keuangan_formal["]').prop('checked', false); + $('#program-keuangan-lainnya').val(''); + } + } + + function syncBantuanNgoFields() { + const isPernah = $('input[name="pernah_bantuan_ngo_perusahaan"]:checked').val() === pernahBantuanNgoPerusahaanPernah; + const $fields = $('[name^="detail_bantuan_ngo_perusahaan["]'); + + $fields.prop('disabled', !isPernah); + + if (!isPernah) { + $fields.val(''); + } + } + + function syncPinjamanTokohAdatFields() { + const isAda = $('input[name="pinjaman_tokoh_adat_panen"]:checked').val() === pinjamanTokohAdatAda; + const $field = $('#keterangan-pinjaman-tokoh-adat'); + + $field.prop('disabled', !isAda); + + if (!isAda) { + $field.val(''); + } + } + + function syncTotalHutangFields() { + const isTidakBersedia = $('#total-hutang-tidak-bersedia').is(':checked'); + const $fields = $('#total-hutang-rupiah, #total-hutang-kg'); + + $fields.prop('disabled', isTidakBersedia); + + if (isTidakBersedia) { + $fields.val(''); + } + } + + function syncTekananJualFields() { + const isAda = $('input[name="tekanan_jual_segera"]:checked').val() === tekananJualSegeraAda; + const $field = $('#penyebab-tekanan-jual'); + + $field.prop('disabled', !isAda); + + if (!isAda) { + $field.val(''); + } + } + + function syncKebebasanPembeliFields() { + const value = Number($('input[name="kebebasan_memilih_pembeli"]:checked').val() || 0); + const needsReason = value > 0 && value < kebebasanMemilihPembeliCukupBebas; + const $field = $('#alasan-tidak-bebas'); + + $field.prop('disabled', !needsReason); + + if (!needsReason) { + $field.val(''); + } + } + function onlyDigits(value) { return String(value || '').replace(/\D/g, ''); } @@ -614,10 +1534,31 @@ return digits.replace(/\B(?=(\d{3})+(?!\d))/g, '.'); } + function clearPendapatanRow($row) { + $row.find('select').val('').trigger('change'); + $row.find('input[type="text"], input[type="number"]').val(''); + $row.find('input[type="radio"], input[type="checkbox"]').prop('checked', false); + clearPendapatanRowValidation($row); + } + $(document).on('change', '.sosial-ekonomi-komoditas-utama', syncKomoditasLainnyaOptions); + $(document).on('input change', '.pendapatan-row input, .pendapatan-row select', function () { + clearPendapatanRowValidation($(this).closest('.pendapatan-row')); + }); $('.add-pendapatan-row').on('click', function () { showNextPendapatanRow($(this).data('group')); }); + $(document).on('click', '.delete-pendapatan-row', function () { + const $row = $(this).closest('.pendapatan-row'); + const group = $row.data('group'); + + clearPendapatanRow($row); + if (Number($row.data('row-index')) !== 0) { + $row.addClass('d-none'); + } + syncKomoditasLainnyaOptions(); + syncAddPendapatanButton(group); + }); $(document).on('input', '.currency-input', function () { const cursorAtEnd = this.selectionStart === this.value.length; this.value = formatRupiah(this.value); @@ -632,9 +1573,35 @@ }); }); $('#pihak-membantu').on('change', syncPihakMembantuFields); + $('#pernah-jual-harga-lebih-tinggi').on('change', syncPernahJualHargaLebihTinggiFields); + $('input[name="panutan_petani_sukses"]').on('change', syncPanutanFields); + $('input[name="terdaftar_kelompok_tani"]').on('change', syncTerdaftarKelompokFields); + $('input[name="status_rekening_tabungan"]').on('change', syncStatusRekeningFields); + $('input[name="pengalaman_kredit_kebun"]').on('change', syncPengalamanKreditFields); + $('input[name="alasan_kredit_ditolak[]"]').on('change', syncAlasanKreditLainnyaField); + $('input[name="kondisi_aset_produktif"]').on('change', syncAsetProduktifFields); + $('input[name="jenis_aset_produktif[]"]').on('change', syncJenisAsetLainnyaField); + $('input[name="keterlibatan_program_keuangan_formal"]').on('change', syncProgramKeuanganFormalFields); + $('input[name="pernah_bantuan_ngo_perusahaan"]').on('change', syncBantuanNgoFields); + $('input[name="pinjaman_tokoh_adat_panen"]').on('change', syncPinjamanTokohAdatFields); + $('#total-hutang-tidak-bersedia').on('change', syncTotalHutangFields); + $('input[name="tekanan_jual_segera"]').on('change', syncTekananJualFields); + $('input[name="kebebasan_memilih_pembeli"]').on('change', syncKebebasanPembeliFields); syncKomoditasLainnyaOptions(); setupAllPendapatanRows(); syncPihakMembantuFields(); + syncPernahJualHargaLebihTinggiFields(); + syncPanutanFields(); + syncTerdaftarKelompokFields(); + syncStatusRekeningFields(); + syncPengalamanKreditFields(); + syncAsetProduktifFields(); + syncProgramKeuanganFormalFields(); + syncBantuanNgoFields(); + syncPinjamanTokohAdatFields(); + syncTotalHutangFields(); + syncTekananJualFields(); + syncKebebasanPembeliFields(); }); @endpush diff --git a/resources/views/produktivitas/petani/sosial-ekonomi/index.blade.php b/resources/views/produktivitas/petani/sosial-ekonomi/index.blade.php index df75a1f..93968fe 100644 --- a/resources/views/produktivitas/petani/sosial-ekonomi/index.blade.php +++ b/resources/views/produktivitas/petani/sosial-ekonomi/index.blade.php @@ -20,30 +20,28 @@
@include('produktivitas.petani.header', ['petani' => $petani]) - + @csrf - @if($sosialEkonomi) - @method('PUT') - @endif +
Komposisi Anggota Keluarga
- + @error('jumlah_tanggungan')
{{ $message }}
@enderror
- + @error('anak_masih_sekolah')
{{ $message }}
@enderror
- + @error('yang_ikut_bekerja')
{{ $message }}
@enderror
@@ -62,6 +60,7 @@ Komoditas Pendapatan Periode + Aksi @@ -98,18 +97,23 @@
+ + + @endfor
-
-
Pendapatan dari Komoditas Lain
+
Pendapatan dari Komoditas Lainnya
@@ -117,6 +121,7 @@ + @@ -154,14 +159,19 @@ + @endfor
Komoditas Pendapatan PeriodeAksi
+ +
-
@@ -172,6 +182,7 @@ Jenis Pekerjaan Estimasi per Bulan + Aksi @@ -188,13 +199,18 @@
+ + + @endfor
-
@@ -203,7 +219,7 @@
@php $skorPeriodePaceklikValue = old('skor_periode_paceklik', $sosialEkonomi?->skor_periode_paceklik?->value); @endphp - + @foreach($periodePaceklikOptions as $option)
@@ -213,12 +229,12 @@ @error('skor_periode_paceklik')
{{ $message }}
@enderror
- + @error('bulan_paceklik')
{{ $message }}
@enderror
- + @error('sumber_penghasilan_paceklik')
{{ $message }}
@enderror
@@ -227,7 +243,7 @@
Biaya Produksi dan Tabungan
- + @php $biayaKebunValue = old('total_estimasi_biaya_kebun_per_musim', $sosialEkonomi?->total_estimasi_biaya_kebun_per_musim) @endphp
Rp @@ -237,7 +253,7 @@
@php $skorKemampuanMenabungValue = old('skor_kemampuan_menabung', $sosialEkonomi?->skor_kemampuan_menabung?->value); @endphp - + @foreach($kemampuanMenabungOptions as $option)
@@ -247,7 +263,7 @@ @error('skor_kemampuan_menabung')
{{ $message }}
@enderror
- + @php $tabunganValue = old('estimasi_tabungan_per_bulan', $sosialEkonomi?->estimasi_tabungan_per_bulan) @endphp
Rp @@ -261,7 +277,7 @@
@php $skorKecukupanPenghasilanValue = old('skor_kecukupan_penghasilan', $sosialEkonomi?->skor_kecukupan_penghasilan?->value); @endphp - + @foreach($kecukupanPenghasilanOptions as $option)
@@ -271,7 +287,7 @@ @error('skor_kecukupan_penghasilan')
{{ $message }}
@enderror
- + @error('alasan_kecukupan_penghasilan')
{{ $message }}
@enderror
@@ -280,7 +296,7 @@
Kondisi Aset & Lahan - Kejelasan Hak Kelola
- + @@ -304,7 +320,7 @@ @php $adaSertifikatValue = old('ada_sertifikat_dokumen', is_null($sosialEkonomi?->ada_sertifikat_dokumen) ? null : (int) $sosialEkonomi->ada_sertifikat_dokumen); @endphp - +
@@ -319,7 +335,7 @@ @php $adaSengketaValue = old('ada_sengketa', is_null($sosialEkonomi?->ada_sengketa) ? null : (int) $sosialEkonomi->ada_sengketa); @endphp - +
@@ -333,12 +349,12 @@
- + @error('keterangan_sengketa')
{{ $message }}
@enderror
- + @error('pihak_membantu_konflik_nama')
{{ $message }}
@enderror
- + @error('tahun_bantuan_konflik')
{{ $message }}
@enderror
- + + + +
+
+
Kemauan Mencoba Praktik Baru
+
+
+ @php $kemauanMencobaPraktikBaruValue = old('kemauan_mencoba_praktik_baru', $sosialEkonomi?->kemauan_mencoba_praktik_baru?->value); @endphp + + @foreach($kemauanMencobaPraktikBaruOptions as $option) +
+ + +
+ @endforeach + @error('kemauan_mencoba_praktik_baru')
{{ $message }}
@enderror +
+
+ + + @error('alasan_mencoba_praktik_baru')
{{ $message }}
@enderror +
+
+ +
Hambatan Mengubah Cara Bertani
+
+
+ + + @error('hambatan_mengubah_cara_bertani')
{{ $message }}
@enderror +
+
+ +
Pemahaman Mutu & Harga
+
+
+ @php $pemahamanMutuHargaValue = old('pemahaman_mutu_harga', $sosialEkonomi?->pemahaman_mutu_harga?->value); @endphp + + @foreach($pemahamanMutuHargaOptions as $option) +
+ + +
+ @endforeach + @error('pemahaman_mutu_harga')
{{ $message }}
@enderror +
+
+ + + @error('contoh_pemahaman_mutu_harga')
{{ $message }}
@enderror +
+
+ + + @error('pengetahuan_harga_hasil_olah')
{{ $message }}
@enderror +
+
+ + + @error('pernah_jual_harga_lebih_tinggi')
{{ $message }}
@enderror +
+
+ + + @error('penyebab_harga_lebih_tinggi')
{{ $message }}
@enderror +
+
+ + + @error('usaha_mutu_tambahan_harga')
{{ $message }}
@enderror +
+
+ + + @error('alasan_usaha_mutu_tambahan_harga')
{{ $message }}
@enderror +
+
+ +
Panutan di Sekitar Petani
+
+
+ @php $panutanPetaniSuksesValue = old('panutan_petani_sukses', $sosialEkonomi?->panutan_petani_sukses?->value); @endphp + + @foreach($panutanPetaniSuksesOptions as $option) +
+ + +
+ @endforeach + @error('panutan_petani_sukses')
{{ $message }}
@enderror +
+
+ + + @error('nama_lokasi_panutan')
{{ $message }}
@enderror +
+
+ +
Kemauan Terlibat dalam Program
+
+
+ @php $kemauanIkutProgramValue = old('kemauan_ikut_program', $sosialEkonomi?->kemauan_ikut_program?->value); @endphp + + @foreach($kemauanIkutProgramOptions as $option) +
+ + +
+ @endforeach + @error('kemauan_ikut_program')
{{ $message }}
@enderror +
+
+ + + @error('harapan_program')
{{ $message }}
@enderror +
+
+ +
Rencana & Harapan Jangka Panjang
+
+
+ @php $orientasiRencanaJangkaPanjangValue = old('orientasi_rencana_jangka_panjang', $sosialEkonomi?->orientasi_rencana_jangka_panjang?->value); @endphp + + @foreach($orientasiRencanaJangkaPanjangOptions as $option) +
+ + +
+ @endforeach + @error('orientasi_rencana_jangka_panjang')
{{ $message }}
@enderror +
+
+ + + @error('rencana_jangka_panjang')
{{ $message }}
@enderror +
+
+ +
+ +
+
+
+ + +
+ @csrf + + + + +
+
+
Status Keanggotaan
+
+
+ @php $terdaftarKelompokTaniValue = old('terdaftar_kelompok_tani', $sosialEkonomi?->terdaftar_kelompok_tani?->value); @endphp + + @foreach($terdaftarKelompokTaniOptions as $option) +
+ + +
+ @endforeach + @error('terdaftar_kelompok_tani')
{{ $message }}
@enderror +
+
+ + + @error('nama_kelompok_tani')
{{ $message }}
@enderror +
+
+ + + @error('lama_bergabung_kelompok_tahun')
{{ $message }}
@enderror +
+
+ + + @error('kedekatan_sesama_anggota')
{{ $message }}
@enderror +
+
+ +
Keaktifan dalam Kelompok
+
+
+ @php $keaktifanPertemuanKelompokValue = old('keaktifan_pertemuan_kelompok', $sosialEkonomi?->keaktifan_pertemuan_kelompok?->value); @endphp + + @foreach($keaktifanPertemuanKelompokOptions as $option) +
+ + +
+ @endforeach + @error('keaktifan_pertemuan_kelompok')
{{ $message }}
@enderror +
+
+ + + @error('topik_biasa_dibahas')
{{ $message }}
@enderror +
+
+ +
Peran dalam Kelompok
+
+
+ @php $peranDalamKelompokValue = old('peran_dalam_kelompok', $sosialEkonomi?->peran_dalam_kelompok?->value); @endphp + + @foreach($peranDalamKelompokOptions as $option) +
+ + +
+ @endforeach + @error('peran_dalam_kelompok')
{{ $message }}
@enderror +
+
+ @php $manfaatKelompokTaniValue = old('manfaat_kelompok_tani', $sosialEkonomi?->manfaat_kelompok_tani?->value); @endphp + + @foreach($manfaatKelompokTaniOptions as $option) +
+ + +
+ @endforeach + @error('manfaat_kelompok_tani')
{{ $message }}
@enderror +
+
+ +
Kartu Tani
+
+
+ + + @error('status_kartu_tani')
{{ $message }}
@enderror +
+
+ + + @error('bisa_beli_pupuk_bersubsidi')
{{ $message }}
@enderror +
+
+ + + @error('manfaat_lain_kartu_tani')
{{ $message }}
@enderror +
+
+ +
+ +
+
+
+
+ +
+ @csrf + + + + +
+
+
Kepemilikan Akses ke Lembaga Keuangan Formal
+
+
+ @php $statusRekeningTabunganValue = old('status_rekening_tabungan', $sosialEkonomi?->status_rekening_tabungan?->value); @endphp + + @foreach($statusRekeningTabunganOptions as $option) +
+ + +
+ @endforeach + @error('status_rekening_tabungan')
{{ $message }}
@enderror +
+
+ + + @error('nama_bank')
{{ $message }}
@enderror +
+
+ +
Pengalaman Pengajuan Kredit
+
+
+ @php $pengalamanKreditKebunValue = old('pengalaman_kredit_kebun', $sosialEkonomi?->pengalaman_kredit_kebun?->value); @endphp + + @foreach($pengalamanKreditKebunOptions as $option) +
+ + +
+ @endforeach + @error('pengalaman_kredit_kebun')
{{ $message }}
@enderror +
+
+ @php + $alasanKreditValues = old('alasan_kredit_ditolak', $sosialEkonomi?->alasan_kredit_ditolak ?? []); + $alasanKreditValues = is_array($alasanKreditValues) ? $alasanKreditValues : []; + @endphp + + @foreach($alasanKreditDitolakOptions as $option) +
+ + +
+ @endforeach + @error('alasan_kredit_ditolak')
{{ $message }}
@enderror + + @error('alasan_kredit_ditolak_lainnya')
{{ $message }}
@enderror +
+
+ +
Kepemilikan Aset Produktif
+
+
+ @php $kondisiAsetProduktifValue = old('kondisi_aset_produktif', $sosialEkonomi?->kondisi_aset_produktif?->value); @endphp + + @foreach($kondisiAsetProduktifOptions as $option) +
+ + +
+ @endforeach + @error('kondisi_aset_produktif')
{{ $message }}
@enderror +
+
+ @php + $jenisAsetValues = old('jenis_aset_produktif', $sosialEkonomi?->jenis_aset_produktif ?? []); + $jenisAsetValues = is_array($jenisAsetValues) ? $jenisAsetValues : []; + @endphp + + @foreach($jenisAsetProduktifOptions as $option) +
+ + +
+ @endforeach + @error('jenis_aset_produktif')
{{ $message }}
@enderror + + @error('jenis_aset_produktif_lainnya')
{{ $message }}
@enderror +
+
+ + + @error('keterangan_kondisi_aset')
{{ $message }}
@enderror +
+
+ +
Akses terhadap Program Pelayanan Keuangan Formal
+
+
+ @php $keterlibatanProgramKeuanganFormalValue = old('keterlibatan_program_keuangan_formal', $sosialEkonomi?->keterlibatan_program_keuangan_formal?->value); @endphp + + @foreach($keterlibatanProgramKeuanganFormalOptions as $option) +
+ + +
+ @endforeach + @error('keterlibatan_program_keuangan_formal')
{{ $message }}
@enderror +
+
+ @php + $statusProgramValues = old('status_program_keuangan_formal', $sosialEkonomi?->status_program_keuangan_formal ?? []); + $statusProgramValues = is_array($statusProgramValues) ? $statusProgramValues : []; + @endphp +
+ + + + + @foreach($statusProgramKeuanganFormalOptions as $statusOption) + + @endforeach + + + + @foreach($programKeuanganFormalRows as $programKey => $programLabel) + + + @foreach($statusProgramKeuanganFormalOptions as $statusOption) + + @endforeach + + @endforeach + +
Program{{ $statusOption['label'] }}
+ @if($programKey === 'lainnya') + + @error('program_keuangan_formal_lainnya_nama')
{{ $message }}
@enderror + @else + {{ $programLabel }} + @endif +
+
+ +
+
+
+ @error('status_program_keuangan_formal')
{{ $message }}
@enderror +
+
+ +
Akses Terhadap Bantuan
+
+
+ @php $pernahBantuanNgoPerusahaanValue = old('pernah_bantuan_ngo_perusahaan', $sosialEkonomi?->pernah_bantuan_ngo_perusahaan?->value); @endphp + + @foreach($pernahBantuanNgoPerusahaanOptions as $option) +
+ + +
+ @endforeach + @error('pernah_bantuan_ngo_perusahaan')
{{ $message }}
@enderror +
+
+ @php + $detailBantuanValues = old('detail_bantuan_ngo_perusahaan', $sosialEkonomi?->detail_bantuan_ngo_perusahaan ?? []); + $detailBantuanValues = is_array($detailBantuanValues) ? $detailBantuanValues : []; + @endphp +
+ + + + + + + + + + + @for($i = 0; $i < 2; $i++) + + + + + + + @endfor + +
Nama LembagaBentuk BantuanFrekuensiTahun Terakhir
+ + @error("detail_bantuan_ngo_perusahaan.$i.nama_lembaga")
{{ $message }}
@enderror +
+ + @error("detail_bantuan_ngo_perusahaan.$i.bentuk_bantuan")
{{ $message }}
@enderror +
+
+ + kali/tahun + @error("detail_bantuan_ngo_perusahaan.$i.frekuensi")
{{ $message }}
@enderror +
+
+ + @error("detail_bantuan_ngo_perusahaan.$i.tahun_terakhir")
{{ $message }}
@enderror +
+
+
+
+ +
+ +
+
+
+
+ +
+ @csrf + + + + +
+
+
Keterikatan hutang
+
+
+ @php $keterikatanHutangPanenValue = old('keterikatan_hutang_panen', $sosialEkonomi?->keterikatan_hutang_panen?->value); @endphp + + @foreach($keterikatanHutangPanenOptions as $option) +
+ + +
+ @endforeach + @error('keterikatan_hutang_panen')
{{ $message }}
@enderror +
+
+ @php $pinjamanTokohAdatPanenValue = old('pinjaman_tokoh_adat_panen', $sosialEkonomi?->pinjaman_tokoh_adat_panen?->value); @endphp + + @foreach($pinjamanTokohAdatPanenOptions as $option) +
+ + +
+ @endforeach + @error('pinjaman_tokoh_adat_panen')
{{ $message }}
@enderror + + @error('keterangan_pinjaman_tokoh_adat')
{{ $message }}
@enderror +
+
+ + @php $totalHutangValue = old('total_hutang_rupiah', $sosialEkonomi?->total_hutang_rupiah) @endphp +
+ Rp + + @error('total_hutang_rupiah')
{{ $message }}
@enderror +
+
+
+ +
+ + kg + @error('total_hutang_setara_kg_panen')
{{ $message }}
@enderror +
+
+
+
+ total_hutang_tidak_bersedia) ? 'checked' : '' }}> + +
+
+
+ @php $praktikIjonValue = old('praktik_ijon', $sosialEkonomi?->praktik_ijon?->value); @endphp + + @foreach($praktikIjonOptions as $option) +
+ + +
+ @endforeach + @error('praktik_ijon')
{{ $message }}
@enderror +
+
+ + @foreach($tekananJualSegeraOptions as $option) +
+ tekanan_jual_segera?->value) === $option['value'] ? 'checked' : '' }}> + +
+ @endforeach + @error('tekanan_jual_segera')
{{ $message }}
@enderror + + @error('penyebab_tekanan_jual_segera')
{{ $message }}
@enderror +
+
+ +
Persepsi Kebebasan Menjual Hasil Panen
+
+
+ @php $kebebasanMemilihPembeliValue = old('kebebasan_memilih_pembeli', $sosialEkonomi?->kebebasan_memilih_pembeli?->value); @endphp + + @foreach($kebebasanMemilihPembeliOptions as $option) +
+ + +
+ @endforeach + @error('kebebasan_memilih_pembeli')
{{ $message }}
@enderror +
+
+ + + @error('alasan_tidak_bebas_memilih_pembeli')
{{ $message }}
@enderror +
+
+ + + @error('minat_pembeli_harga_stabil')
{{ $message }}
@enderror +
+
+ + + @error('alasan_minat_pembeli_harga_stabil')
{{ $message }}
@enderror +
+
+ +
+
@@ -387,8 +1045,21 @@ 'use strict'; $(document).ready(function () { const pihakMembantuTanpaBantuan = @json($pihakMembantuTanpaBantuanValue); + const pernahJualHargaLebihTinggiPernah = @json($pernahJualHargaLebihTinggiPernahValue); + const panutanPetaniSuksesTidakAda = String(@json($panutanPetaniSuksesTidakAdaValue)); + const terdaftarKelompokTaniYa = @json($terdaftarKelompokTaniYaValue); + const statusRekeningTidakPunya = String(@json($statusRekeningTidakPunyaValue)); + const pengalamanKreditPerluAlasan = @json($pengalamanKreditPerluAlasanValues).map(String); + const alasanKreditLainnya = @json($alasanKreditLainnyaValue); + const kondisiAsetTidakAda = String(@json($kondisiAsetTidakAdaValue)); + const jenisAsetLainnya = @json($jenisAsetLainnyaValue); + const keterlibatanProgramTidakPernah = String(@json($keterlibatanProgramKeuanganFormalTidakPernahValue)); + const pernahBantuanNgoPerusahaanPernah = @json($pernahBantuanNgoPerusahaanPernahValue); + const pinjamanTokohAdatAda = @json($pinjamanTokohAdatAdaValue); + const tekananJualSegeraAda = @json($tekananJualSegeraAdaValue); + const kebebasanMemilihPembeliCukupBebas = Number(@json($kebebasanMemilihPembeliCukupBebasValue)); - $('#status-kepemilikan-lahan, #pihak-membantu, #status-konflik, .sosial-ekonomi-komoditas').select2(); + $('#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(); function syncKomoditasLainnyaOptions() { const selectedUtama = $('.sosial-ekonomi-komoditas-utama') @@ -428,6 +1099,78 @@ return Boolean(triggerValue); } + function isPendapatanKomoditasGroup(group) { + return group === 'komoditas-utama' || group === 'komoditas-lainnya'; + } + + function clearPendapatanRowValidation($row) { + $row.find('.is-invalid').removeClass('is-invalid'); + $row.find('.select2-selection').removeClass('is-invalid'); + $row.find('.pendapatan-row-feedback').remove(); + } + + function showPendapatanRowValidation($element, message) { + const $cell = $element.closest('td'); + + if ($cell.find('.pendapatan-row-feedback').length) { + return; + } + + $cell.append(`
${message}
`); + } + + function validatePendapatanKomoditasRow($row) { + const $komoditas = $row.find('.sosial-ekonomi-komoditas').first(); + const $pendapatan = $row.find('.currency-input').first(); + const hasKomoditas = Boolean($komoditas.val()); + const hasPendapatan = Boolean(onlyDigits($pendapatan.val())); + const hasPeriode = $row.find('input[type="radio"]:checked').length > 0; + + clearPendapatanRowValidation($row); + $komoditas.toggleClass('is-invalid', !hasKomoditas); + $komoditas.next('.select2').find('.select2-selection').toggleClass('is-invalid', !hasKomoditas); + $pendapatan.toggleClass('is-invalid', !hasPendapatan); + $row.find('input[type="radio"]').toggleClass('is-invalid', !hasPeriode); + + if (!hasKomoditas) { + showPendapatanRowValidation($komoditas, 'Komoditas wajib diisi.'); + } + + if (!hasPendapatan) { + showPendapatanRowValidation($pendapatan, 'Pendapatan wajib diisi.'); + } + + if (!hasPeriode) { + showPendapatanRowValidation($row.find('input[type="radio"]').first(), 'Periode wajib dipilih.'); + } + + return hasKomoditas && hasPendapatan && hasPeriode; + } + + function canAddPendapatanRow(group) { + if (!isPendapatanKomoditasGroup(group)) { + return true; + } + + let isValid = true; + let $firstInvalidRow = null; + + $('.pendapatan-row[data-group="' + group + '"]:visible').each(function () { + const $row = $(this); + + if (!validatePendapatanKomoditasRow($row)) { + isValid = false; + $firstInvalidRow = $firstInvalidRow || $row; + } + }); + + if ($firstInvalidRow) { + $firstInvalidRow.find('.is-invalid').first().trigger('focus'); + } + + return isValid; + } + function setupPendapatanRows(group) { const $rows = $('.pendapatan-row[data-group="' + group + '"]'); @@ -470,6 +1213,10 @@ } function showNextPendapatanRow(group) { + if (!canAddPendapatanRow(group)) { + return; + } + const visibleRows = $('.pendapatan-row[data-group="' + group + '"]:visible').length; const maxRows = maxPendapatanRows(group); @@ -570,6 +1317,11 @@
+ + + `); } @@ -589,6 +1341,11 @@
+ + + `); } @@ -604,6 +1361,165 @@ } } + function syncPernahJualHargaLebihTinggiFields() { + const isPernah = $('#pernah-jual-harga-lebih-tinggi').val() === pernahJualHargaLebihTinggiPernah; + const $field = $('#penyebab-harga-lebih-tinggi'); + + $field.prop('disabled', !isPernah); + + if (!isPernah) { + $field.val(''); + } + } + + function syncPanutanFields() { + const isTidakAda = $('input[name="panutan_petani_sukses"]:checked').val() === panutanPetaniSuksesTidakAda; + const $field = $('#nama-lokasi-panutan'); + + $field.prop('disabled', isTidakAda); + + if (isTidakAda) { + $field.val(''); + } + } + + function syncTerdaftarKelompokFields() { + const isTerdaftar = $('input[name="terdaftar_kelompok_tani"]:checked').val() === terdaftarKelompokTaniYa; + const $fields = $('#nama-kelompok-tani, #lama-bergabung-kelompok, #kedekatan-sesama-anggota'); + + $fields.prop('disabled', !isTerdaftar); + + if (!isTerdaftar) { + $fields.val(''); + $('#kedekatan-sesama-anggota').trigger('change.select2'); + } + } + + function syncStatusRekeningFields() { + const isTidakPunya = $('input[name="status_rekening_tabungan"]:checked').val() === statusRekeningTidakPunya; + const $field = $('#nama-bank'); + + $field.prop('disabled', isTidakPunya); + + if (isTidakPunya) { + $field.val(''); + } + } + + function syncPengalamanKreditFields() { + const perluAlasan = pengalamanKreditPerluAlasan.includes($('input[name="pengalaman_kredit_kebun"]:checked').val()); + const $fields = $('input[name="alasan_kredit_ditolak[]"], #alasan-kredit-lainnya'); + + $fields.prop('disabled', !perluAlasan); + + if (!perluAlasan) { + $('input[name="alasan_kredit_ditolak[]"]').prop('checked', false); + $('#alasan-kredit-lainnya').val(''); + } + + syncAlasanKreditLainnyaField(); + } + + function syncAlasanKreditLainnyaField() { + const isLainnya = $('input[name="alasan_kredit_ditolak[]"][value="' + alasanKreditLainnya + '"]').is(':checked'); + $('#alasan-kredit-lainnya').prop('disabled', !isLainnya); + + if (!isLainnya) { + $('#alasan-kredit-lainnya').val(''); + } + } + + function syncAsetProduktifFields() { + const isTidakAda = $('input[name="kondisi_aset_produktif"]:checked').val() === kondisiAsetTidakAda; + const $fields = $('input[name="jenis_aset_produktif[]"], #jenis-aset-lainnya, #keterangan-kondisi-aset'); + + $fields.prop('disabled', isTidakAda); + + if (isTidakAda) { + $('input[name="jenis_aset_produktif[]"]').prop('checked', false); + $('#jenis-aset-lainnya, #keterangan-kondisi-aset').val(''); + } + + syncJenisAsetLainnyaField(); + } + + function syncJenisAsetLainnyaField() { + const isLainnya = $('input[name="jenis_aset_produktif[]"][value="' + jenisAsetLainnya + '"]').is(':checked'); + $('#jenis-aset-lainnya').prop('disabled', !isLainnya); + + if (!isLainnya) { + $('#jenis-aset-lainnya').val(''); + } + } + + function syncProgramKeuanganFormalFields() { + const isTidakPernah = String($('input[name="keterlibatan_program_keuangan_formal"]:checked').val() || '') === keterlibatanProgramTidakPernah; + const $fields = $('input[name^="status_program_keuangan_formal["], #program-keuangan-lainnya'); + + $fields.prop('disabled', isTidakPernah); + + if (isTidakPernah) { + $('input[name^="status_program_keuangan_formal["]').prop('checked', false); + $('#program-keuangan-lainnya').val(''); + } + } + + function syncBantuanNgoFields() { + const isPernah = $('input[name="pernah_bantuan_ngo_perusahaan"]:checked').val() === pernahBantuanNgoPerusahaanPernah; + const $fields = $('[name^="detail_bantuan_ngo_perusahaan["]'); + + $fields.prop('disabled', !isPernah); + + if (!isPernah) { + $fields.val(''); + } + } + + function syncPinjamanTokohAdatFields() { + const isAda = $('input[name="pinjaman_tokoh_adat_panen"]:checked').val() === pinjamanTokohAdatAda; + const $field = $('#keterangan-pinjaman-tokoh-adat'); + + $field.prop('disabled', !isAda); + + if (!isAda) { + $field.val(''); + } + } + + function syncTotalHutangFields() { + const isTidakBersedia = $('#total-hutang-tidak-bersedia').is(':checked'); + const $fields = $('#total-hutang-rupiah, #total-hutang-kg'); + + $fields.prop('disabled', isTidakBersedia); + + if (isTidakBersedia) { + $fields.val(''); + } + } + + function syncTekananJualFields() { + const isAda = $('input[name="tekanan_jual_segera"]:checked').val() === tekananJualSegeraAda; + const $field = $('#penyebab-tekanan-jual'); + + $field.prop('disabled', !isAda); + + if (!isAda) { + $field.val(''); + } + } + + function syncKebebasanPembeliFields() { + const value = Number($('input[name="kebebasan_memilih_pembeli"]:checked').val() || 0); + const needsReason = value > 0 && value < kebebasanMemilihPembeliCukupBebas; + const $field = $('#alasan-tidak-bebas'); + + $field.prop('disabled', !needsReason); + + if (!needsReason) { + $field.val(''); + } + } + function onlyDigits(value) { return String(value || '').replace(/\D/g, ''); } @@ -614,10 +1530,31 @@ return digits.replace(/\B(?=(\d{3})+(?!\d))/g, '.'); } + function clearPendapatanRow($row) { + $row.find('select').val('').trigger('change'); + $row.find('input[type="text"], input[type="number"]').val(''); + $row.find('input[type="radio"], input[type="checkbox"]').prop('checked', false); + clearPendapatanRowValidation($row); + } + $(document).on('change', '.sosial-ekonomi-komoditas-utama', syncKomoditasLainnyaOptions); + $(document).on('input change', '.pendapatan-row input, .pendapatan-row select', function () { + clearPendapatanRowValidation($(this).closest('.pendapatan-row')); + }); $('.add-pendapatan-row').on('click', function () { showNextPendapatanRow($(this).data('group')); }); + $(document).on('click', '.delete-pendapatan-row', function () { + const $row = $(this).closest('.pendapatan-row'); + const group = $row.data('group'); + + clearPendapatanRow($row); + if (Number($row.data('row-index')) !== 0) { + $row.addClass('d-none'); + } + syncKomoditasLainnyaOptions(); + syncAddPendapatanButton(group); + }); $(document).on('input', '.currency-input', function () { const cursorAtEnd = this.selectionStart === this.value.length; this.value = formatRupiah(this.value); @@ -632,9 +1569,35 @@ }); }); $('#pihak-membantu').on('change', syncPihakMembantuFields); + $('#pernah-jual-harga-lebih-tinggi').on('change', syncPernahJualHargaLebihTinggiFields); + $('input[name="panutan_petani_sukses"]').on('change', syncPanutanFields); + $('input[name="terdaftar_kelompok_tani"]').on('change', syncTerdaftarKelompokFields); + $('input[name="status_rekening_tabungan"]').on('change', syncStatusRekeningFields); + $('input[name="pengalaman_kredit_kebun"]').on('change', syncPengalamanKreditFields); + $('input[name="alasan_kredit_ditolak[]"]').on('change', syncAlasanKreditLainnyaField); + $('input[name="kondisi_aset_produktif"]').on('change', syncAsetProduktifFields); + $('input[name="jenis_aset_produktif[]"]').on('change', syncJenisAsetLainnyaField); + $('input[name="keterlibatan_program_keuangan_formal"]').on('change', syncProgramKeuanganFormalFields); + $('input[name="pernah_bantuan_ngo_perusahaan"]').on('change', syncBantuanNgoFields); + $('input[name="pinjaman_tokoh_adat_panen"]').on('change', syncPinjamanTokohAdatFields); + $('#total-hutang-tidak-bersedia').on('change', syncTotalHutangFields); + $('input[name="tekanan_jual_segera"]').on('change', syncTekananJualFields); + $('input[name="kebebasan_memilih_pembeli"]').on('change', syncKebebasanPembeliFields); syncKomoditasLainnyaOptions(); setupAllPendapatanRows(); syncPihakMembantuFields(); + syncPernahJualHargaLebihTinggiFields(); + syncPanutanFields(); + syncTerdaftarKelompokFields(); + syncStatusRekeningFields(); + syncPengalamanKreditFields(); + syncAsetProduktifFields(); + syncProgramKeuanganFormalFields(); + syncBantuanNgoFields(); + syncPinjamanTokohAdatFields(); + syncTotalHutangFields(); + syncTekananJualFields(); + syncKebebasanPembeliFields(); }); @endpush diff --git a/routes/web.php b/routes/web.php index b92f5ad..6bd2f46 100644 --- a/routes/web.php +++ b/routes/web.php @@ -196,6 +196,7 @@ Route::middleware('auth') Route::resource('petani.lahan-tanaman', App\Http\Controllers\Web\Produktivitas\PetaniLahanController::class)->whereNumber('petani'); Route::resource('petani.lahan-tanaman.tanaman', App\Http\Controllers\Web\Produktivitas\PetaniLahanTanamanController::class)->only(['show', 'update', 'destroy'])->whereNumber('petani'); Route::resource('petani.praktik-budidaya', App\Http\Controllers\Web\Produktivitas\PraktikBudidayaController::class)->whereNumber('petani'); + Route::resource('petani.survey-produktivitas', App\Http\Controllers\Web\Produktivitas\SurveyProduktivitasController::class)->only(['store', 'destroy']); Route::resource('petani.pendidikan-pelatihan', App\Http\Controllers\Web\Produktivitas\PendidikanPelatihanController::class); Route::resource('petani.sosial-ekonomi', App\Http\Controllers\Web\Produktivitas\SosialEkonomiController::class)->whereNumber('petani'); Route::resource('petani.akses-pasar', App\Http\Controllers\Web\Produktivitas\AksesPasarController::class)->whereNumber('petani');