input('section'); return is_string($section) ? BagianRantaiNilaiKoperasi::tryFrom($section) : null; } protected function getRedirectUrl(): string { if ($section = $this->section()) { return route('koperasi.pengurus.rantai-nilai-akses-pasar.index', $this->route('pengurusKoperasi')).'#'.$section->fragment(); } return parent::getRedirectUrl(); } protected function prepareForValidation(): void { parent::prepareForValidation(); $policy = app(RantaiNilaiKoperasiService::class); $data = $policy->normalize($this->all(), []); 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(BagianRantaiNilaiKoperasi::class)], 'mekanisme_pembayaran' => ['nullable', Rule::enum(MekanismePembayaranKoperasi::class)], 'status_perjanjian_tertulis' => ['nullable', Rule::enum(PerjanjianPetaniKoperasi::class)], 'sumber_pasokan' => ['nullable', 'array'], 'sumber_pasokan.*' => [Rule::enum(SumberPasokanKoperasi::class)], 'bentuk_pembelian' => ['nullable', 'array'], 'bentuk_pembelian.*' => [Rule::enum(BentukProdukKoperasi::class)], 'tujuan_penjualan' => ['nullable', 'array'], 'tujuan_penjualan.*' => [Rule::enum(TujuanPenjualanKoperasi::class)], 'bentuk_penjualan' => ['nullable', 'array'], 'bentuk_penjualan.*' => [Rule::enum(BentukProdukKoperasi::class)], 'sifat_hubungan_bisnis' => ['nullable', 'array'], 'sifat_hubungan_bisnis.*' => [Rule::enum(HubunganPemasokKoperasi::class)], 'cara_menetapkan_harga_pasar' => ['nullable', 'array'], 'cara_menetapkan_harga_pasar.*' => [Rule::enum(PenetapanHargaKoperasi::class)], 'sumber_pasokan_lainnya' => ['nullable', 'string', 'max:255'], 'tujuan_penjualan_lainnya' => ['nullable', 'string', 'max:255'], 'sifat_hubungan_lainnya' => ['nullable', 'string', 'max:255'], 'cara_menetapkan_harga_lainnya' => ['nullable', 'string', 'max:255'], 'volume_beli_sekarang' => ['nullable', 'integer', 'min:0'], 'volume_jual_sekarang' => ['nullable', 'integer', 'min:0'], 'harga_segar_sekarang' => ['nullable', 'integer', 'min:0'], 'harga_basah_sekarang' => ['nullable', 'integer', 'min:0'], 'harga_kering_sekarang' => ['nullable', 'integer', 'min:0'], 'harga_fermentasi_sekarang' => ['nullable', 'integer', 'min:0'], 'volume_beli_1_tahun' => ['nullable', 'integer', 'min:0'], 'volume_jual_1_tahun' => ['nullable', 'integer', 'min:0'], 'harga_segar_1_tahun' => ['nullable', 'integer', 'min:0'], 'harga_basah_1_tahun' => ['nullable', 'integer', 'min:0'], 'harga_kering_1_tahun' => ['nullable', 'integer', 'min:0'], 'harga_fermentasi_1_tahun' => ['nullable', 'integer', 'min:0'], 'volume_beli_2_tahun' => ['nullable', 'integer', 'min:0'], 'volume_jual_2_tahun' => ['nullable', 'integer', 'min:0'], 'harga_segar_2_tahun' => ['nullable', 'integer', 'min:0'], 'harga_basah_2_tahun' => ['nullable', 'integer', 'min:0'], 'harga_kering_2_tahun' => ['nullable', 'integer', 'min:0'], 'harga_fermentasi_2_tahun' => ['nullable', 'integer', 'min:0'], ]; $policy = app(RantaiNilaiKoperasiService::class); foreach ($policy->requiredFields() as $field) { $rules[$field][] = Rule::requiredIf(fn () => $policy->active($field, $this->all(), [])); } 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) { if ($this->section() === BagianRantaiNilaiKoperasi::HARGA) { return; } $selected = app(RantaiNilaiKoperasiService::class)->values($this->input('tujuan_penjualan')); if (in_array(TujuanPenjualanKoperasi::BELUM_MENJUAL->value, $selected, true) && count(array_unique($selected)) > 1) { $validator->errors()->add('tujuan_penjualan', 'Pilihan belum pernah menjual tidak boleh digabungkan dengan tujuan penjualan lainnya.'); } }]; } public function attributes(): array { return [ 'section' => 'Bagian form', 'sumber_pasokan' => 'Sumber Pasokan', 'sumber_pasokan_lainnya' => 'Sumber Pasokan Lainnya', 'bentuk_pembelian' => 'Bentuk Produk yang Dibeli', 'tujuan_penjualan' => 'Tujuan Penjualan', 'tujuan_penjualan_lainnya' => 'Tujuan Penjualan Lainnya', 'bentuk_penjualan' => 'Bentuk Produk yang Dijual', 'sifat_hubungan_bisnis' => 'Hubungan dengan Petani Pemasok', 'sifat_hubungan_lainnya' => 'Hubungan Pemasok Lainnya', 'mekanisme_pembayaran' => 'Mekanisme Pembayaran kepada Petani', 'status_perjanjian_tertulis' => 'Perjanjian Sebelum Pembelian', 'cara_menetapkan_harga_pasar' => 'Penetapan Harga Beli', 'cara_menetapkan_harga_lainnya' => 'Penetapan Harga Lainnya', 'sumber_pasokan.*' => 'Sumber Pasokan', 'bentuk_pembelian.*' => 'Bentuk Produk yang Dibeli', 'tujuan_penjualan.*' => 'Tujuan Penjualan', 'bentuk_penjualan.*' => 'Bentuk Produk yang Dijual', 'sifat_hubungan_bisnis.*' => 'Hubungan dengan Petani Pemasok', 'cara_menetapkan_harga_pasar.*' => 'Penetapan Harga Beli', 'volume_beli_sekarang' => 'Volume Pembelian Panen Terakhir', 'volume_jual_sekarang' => 'Volume Penjualan Panen Terakhir', 'harga_segar_sekarang' => 'Harga Buah Segar Panen Terakhir', 'harga_basah_sekarang' => 'Harga Biji Basah Panen Terakhir', 'harga_kering_sekarang' => 'Harga Biji Kering/Kupas Panen Terakhir', 'harga_fermentasi_sekarang' => 'Harga Produk Terfermentasi Panen Terakhir', 'volume_beli_1_tahun' => 'Volume Pembelian Tahun Lalu', 'volume_jual_1_tahun' => 'Volume Penjualan Tahun Lalu', 'harga_segar_1_tahun' => 'Harga Buah Segar Tahun Lalu', 'harga_basah_1_tahun' => 'Harga Biji Basah Tahun Lalu', 'harga_kering_1_tahun' => 'Harga Biji Kering/Kupas Tahun Lalu', 'harga_fermentasi_1_tahun' => 'Harga Produk Terfermentasi Tahun Lalu', 'volume_beli_2_tahun' => 'Volume Pembelian Dua Tahun Lalu', 'volume_jual_2_tahun' => 'Volume Penjualan Dua Tahun Lalu', 'harga_segar_2_tahun' => 'Harga Buah Segar Dua Tahun Lalu', 'harga_basah_2_tahun' => 'Harga Biji Basah Dua Tahun Lalu', 'harga_kering_2_tahun' => 'Harga Biji Kering/Kupas Dua Tahun Lalu', 'harga_fermentasi_2_tahun' => 'Harga Produk Terfermentasi Dua Tahun Lalu', ]; } }