Update Koperasi

This commit is contained in:
2026-11-06 22:38:45 +07:00
parent 6232b28e11
commit cb36682d9e
79 changed files with 4639 additions and 1378 deletions
@@ -0,0 +1,154 @@
<?php
namespace App\Http\Requests\Koperasi;
use App\Enums\Koperasi\BagianRantaiNilaiKoperasi;
use App\Enums\Koperasi\BentukProdukKoperasi;
use App\Enums\Koperasi\HubunganPemasokKoperasi;
use App\Enums\Koperasi\MekanismePembayaranKoperasi;
use App\Enums\Koperasi\PenetapanHargaKoperasi;
use App\Enums\Koperasi\PerjanjianPetaniKoperasi;
use App\Enums\Koperasi\SumberPasokanKoperasi;
use App\Enums\Koperasi\TujuanPenjualanKoperasi;
use App\Services\Koperasi\RantaiNilaiKoperasiService;
use Illuminate\Validation\Rule;
use Illuminate\Validation\Validator;
class StoreRantaiNilaiKoperasiRequest extends KoperasiTabRequest
{
public function section(): ?BagianRantaiNilaiKoperasi
{
$section = $this->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',
];
}
}