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,190 @@
<?php
namespace App\Http\Requests\Koperasi;
use App\Enums\Koperasi\BagianOperasionalKoperasi;
use App\Enums\Koperasi\EfektivitasSanksiKoperasi;
use App\Enums\Koperasi\FaktorManajemenKoperasi;
use App\Enums\Koperasi\FasilitasKoperasi;
use App\Enums\Koperasi\FormatPembukuanKoperasi;
use App\Enums\Koperasi\FrekuensiPertemuanKoperasi;
use App\Enums\Koperasi\JawabanYaTidakKoperasi;
use App\Enums\Koperasi\KetersediaanKoperasi;
use App\Enums\Koperasi\KomoditasAgregasiKoperasi;
use App\Enums\Koperasi\LayananKoperasi;
use App\Enums\Koperasi\ModelFermentasiKoperasi;
use App\Enums\Koperasi\PeranRantaiNilaiKoperasi;
use App\Enums\Koperasi\PraktikFermentasiKoperasi;
use App\Enums\Koperasi\PraktikPengeringanKoperasi;
use App\Enums\Koperasi\PraktikSortasiKoperasi;
use App\Enums\Koperasi\StatusAdArtKoperasi;
use App\Enums\Koperasi\StatusPembukuanKoperasi;
use App\Enums\Koperasi\TingkatKreditMacetKoperasi;
use App\Services\Koperasi\OperasionalKoperasiService;
use Illuminate\Validation\Rule;
use Illuminate\Validation\Validator;
class StoreKelembagaanKoperasiRequest extends KoperasiTabRequest
{
public function section(): ?BagianOperasionalKoperasi
{
$section = $this->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)',
];
}
}