input('section'); return is_string($section) ? BagianOperasionalKoperasi::tryFrom($section) : null; } protected function getRedirectUrl(): string { if ($section = $this->section()) { return route('koperasi.pengurus.kelembagaan-aktor.index', $this->route('pengurusKoperasi')).'#'.$section->fragment(); } return parent::getRedirectUrl(); } protected function prepareForValidation(): void { parent::prepareForValidation(); $policy = app(OperasionalKoperasiService::class); $data = $policy->normalize($this->all(), $policy->context($this->route('pengurusKoperasi'))); if ($section = $this->section()) { $data = array_intersect_key($data, array_flip([...$policy->sectionFields($section), 'section', '_token'])); } $this->replace($data); } public function rules(): array { $rules = [ 'section' => ['nullable', Rule::enum(BagianOperasionalKoperasi::class)], 'ad_art' => ['nullable', Rule::enum(StatusAdArtKoperasi::class)], 'pelatihan_produksi' => ['nullable', Rule::enum(JawabanYaTidakKoperasi::class)], 'pelatihan_pascapanen' => ['nullable', Rule::enum(JawabanYaTidakKoperasi::class)], 'pelatihan_pengolahan' => ['nullable', Rule::enum(JawabanYaTidakKoperasi::class)], 'pelatihan_keuangan' => ['nullable', Rule::enum(JawabanYaTidakKoperasi::class)], 'pelatihan_pemasaran' => ['nullable', Rule::enum(JawabanYaTidakKoperasi::class)], 'status_pembukuan' => ['nullable', Rule::enum(StatusPembukuanKoperasi::class)], 'format_pembukuan' => ['nullable', Rule::enum(FormatPembukuanKoperasi::class)], 'pertemuan_rutin' => ['nullable', Rule::enum(FrekuensiPertemuanKoperasi::class)], 'kasus_kredit_macet' => ['nullable', Rule::enum(TingkatKreditMacetKoperasi::class)], 'sanksi_kredit_macet' => ['nullable', Rule::enum(KetersediaanKoperasi::class)], 'efektivitas_sanksi' => ['nullable', Rule::enum(EfektivitasSanksiKoperasi::class)], 'pengolahan_lanjutan' => ['nullable', Rule::enum(JawabanYaTidakKoperasi::class)], 'kontrak_offtaker' => ['nullable', Rule::enum(KetersediaanKoperasi::class)], 'layanan_koperasi' => ['nullable', 'array'], 'layanan_koperasi.*' => [Rule::enum(LayananKoperasi::class)], 'faktor_manajemen' => ['nullable', 'array'], 'faktor_manajemen.*' => [Rule::enum(FaktorManajemenKoperasi::class)], 'keterlibatan_rantai_nilai' => ['nullable', 'array'], 'keterlibatan_rantai_nilai.*' => [Rule::enum(PeranRantaiNilaiKoperasi::class)], 'agregasi_komoditas' => ['nullable', 'array'], 'agregasi_komoditas.*' => [Rule::enum(KomoditasAgregasiKoperasi::class)], 'fasilitas_koperasi' => ['nullable', 'array'], 'fasilitas_koperasi.*' => [Rule::enum(FasilitasKoperasi::class)], 'layanan_lainnya' => ['nullable', 'string', 'max:255'], 'pelatihan_lainnya' => ['nullable', 'string', 'max:255'], 'pertemuan_lainnya' => ['nullable', 'string', 'max:255'], 'faktor_manajemen_lainnya' => ['nullable', 'string', 'max:255'], 'agregasi_komoditas_lainnya' => ['nullable', 'string', 'max:255'], 'fasilitas_lainnya' => ['nullable', 'string', 'max:255'], 'detail_pengolahan_lanjutan' => ['nullable', 'string', 'max:255'], 'kontrak_komoditas' => ['nullable', 'string', 'max:255'], 'cara_penentuan_harga' => ['nullable', 'string'], 'tahun_ad_art' => ['nullable', 'integer', 'min:1900', 'max:'.now()->year], 'praktik_sortasi' => ['nullable', Rule::enum(PraktikSortasiKoperasi::class)], 'standar_sortasi' => ['nullable', 'string', 'max:255'], 'praktik_pengeringan' => ['nullable', Rule::enum(PraktikPengeringanKoperasi::class)], 'cara_pengeringan' => ['nullable', 'string', 'max:255'], 'praktik_fermentasi' => ['nullable', Rule::enum(PraktikFermentasiKoperasi::class)], 'model_fermentasi' => ['nullable', 'array'], 'model_fermentasi.*' => [Rule::enum(ModelFermentasiKoperasi::class)], 'proses_fermentasi' => ['nullable', 'string'], 'harga_premium_rupiah' => ['nullable', 'integer', 'min:0'], 'harga_premium_persen' => ['nullable', 'integer', 'min:0', 'max:100'], ]; $policy = app(OperasionalKoperasiService::class); foreach ($policy->requiredFields() as $field) { $rules[$field][] = Rule::requiredIf(fn () => $policy->active($field, $this->all(), $policy->context($this->route('pengurusKoperasi')))); } if ($section = $this->section()) { $fields = $policy->sectionFields($section); $rules = array_filter($rules, fn ($key) => $key === 'section' || in_array(explode('.', $key)[0], $fields, true), ARRAY_FILTER_USE_KEY); } return $rules; } public function after(): array { return [function (Validator $validator) { $policy = app(OperasionalKoperasiService::class); foreach ([ 'keterlibatan_rantai_nilai' => PeranRantaiNilaiKoperasi::TIDAK_TERLIBAT->value, 'agregasi_komoditas' => KomoditasAgregasiKoperasi::TIDAK_TERLIBAT->value, ] as $field => $exclusive) { $selected = $policy->values($this->input($field)); if (in_array($exclusive, $selected, true) && count(array_unique($selected)) > 1) { $validator->errors()->add($field, 'Pilihan tidak terlibat tidak boleh digabungkan dengan pilihan lainnya.'); } } if ($this->input('status_pembukuan') === StatusPembukuanKoperasi::SUDAH->value && $this->input('format_pembukuan') === FormatPembukuanKoperasi::TIDAK_ADA->value) { $validator->errors()->add('format_pembukuan', 'Pilih format pembukuan yang digunakan.'); } if (filled($this->input('harga_premium_rupiah')) && filled($this->input('harga_premium_persen'))) { $validator->errors()->add('harga_premium_persen', 'Isi premium harga dalam rupiah atau persen, bukan keduanya.'); } }]; } public function attributes(): array { return [ 'section' => 'Bagian form', 'layanan_lainnya' => 'Layanan Lainnya', 'pelatihan_lainnya' => 'Pelatihan Lainnya', 'pertemuan_lainnya' => 'Frekuensi Pertemuan Lainnya', 'faktor_manajemen_lainnya' => 'Faktor Pengelolaan Lainnya', 'agregasi_komoditas_lainnya' => 'Komoditas Agregasi Lainnya', 'fasilitas_lainnya' => 'Fasilitas Lainnya', 'detail_pengolahan_lanjutan' => 'Jenis Pengolahan Lanjutan', 'kontrak_komoditas' => 'Komoditas dalam Kontrak', 'cara_penentuan_harga' => 'Penetapan Harga Beli', 'tahun_ad_art' => 'Tahun Pembaruan AD/ART', 'ad_art' => 'Status AD/ART', 'pelatihan_produksi' => 'Pelatihan Produksi Pertanian', 'pelatihan_pascapanen' => 'Pelatihan Pascapanen', 'pelatihan_pengolahan' => 'Pelatihan Pengolahan Produk', 'pelatihan_keuangan' => 'Pelatihan Keuangan', 'pelatihan_pemasaran' => 'Pelatihan Pengemasan dan Pemasaran', 'status_pembukuan' => 'Pembukuan Keuangan', 'format_pembukuan' => 'Format Pembukuan', 'pertemuan_rutin' => 'Frekuensi Pertemuan Anggota', 'kasus_kredit_macet' => 'Tingkat Kredit Macet', 'sanksi_kredit_macet' => 'Sanksi Kredit Macet', 'efektivitas_sanksi' => 'Efektivitas Sanksi', 'pengolahan_lanjutan' => 'Pengolahan Lanjutan', 'kontrak_offtaker' => 'Kontrak dengan Mitra Pembeli', 'layanan_koperasi' => 'Layanan Koperasi', 'faktor_manajemen' => 'Faktor Pengelolaan', 'keterlibatan_rantai_nilai' => 'Peran dalam Rantai Nilai', 'agregasi_komoditas' => 'Komoditas Agregasi', 'fasilitas_koperasi' => 'Fasilitas Pascapanen', 'layanan_koperasi.*' => 'Layanan Koperasi', 'faktor_manajemen.*' => 'Faktor Pengelolaan', 'keterlibatan_rantai_nilai.*' => 'Peran dalam Rantai Nilai', 'agregasi_komoditas.*' => 'Komoditas Agregasi', 'fasilitas_koperasi.*' => 'Fasilitas Pascapanen', 'praktik_sortasi' => 'Praktik Sortasi', 'standar_sortasi' => 'Standar/Kriteria Sortasi', 'praktik_pengeringan' => 'Praktik Pengeringan', 'cara_pengeringan' => 'Cara dan Tempat Pengeringan', 'praktik_fermentasi' => 'Praktik Fermentasi/Pengepresan', 'model_fermentasi' => 'Model Fermentasi', 'model_fermentasi.*' => 'Model Fermentasi', 'proses_fermentasi' => 'Proses Fermentasi', 'harga_premium_rupiah' => 'Premium Harga (Rupiah)', 'harga_premium_persen' => 'Premium Harga (Persen)', ]; } }