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,11 @@
<?php
namespace App\Http\Requests\Koperasi;
class IndexKoperasiTabRequest extends KoperasiTabRequest
{
public function rules(): array
{
return ['step' => ['nullable', 'integer', 'in:1,2,3']];
}
}
@@ -0,0 +1,35 @@
<?php
namespace App\Http\Requests\Koperasi;
use App\Enums\Koperasi\LayananKoperasi;
use App\Enums\Koperasi\StatusAdArtKoperasi;
use App\Enums\Koperasi\UrutanKoperasi;
use Illuminate\Validation\Rule;
class IndexPengurusKoperasiRequest extends KoperasiRequest
{
use ValidatesWilayahKoperasi;
public function rules(): array
{
return [
'search' => ['nullable', 'string', 'max:255'],
...$this->wilayahRules(),
'jenis_koperasi' => ['nullable', 'string', 'max:255'],
'layanan' => ['nullable', Rule::enum(LayananKoperasi::class)],
'ad_art' => ['nullable', Rule::enum(StatusAdArtKoperasi::class)],
'sort_by' => ['nullable', Rule::enum(UrutanKoperasi::class)],
'per_page' => ['nullable', 'integer', 'in:10,25'],
];
}
public function attributes(): array
{
return [
...$this->wilayahAttributes(),
'search' => 'Pencarian', 'jenis_koperasi' => 'Jenis Koperasi', 'layanan' => 'Layanan Utama',
'ad_art' => 'Dokumen Kelembagaan', 'sort_by' => 'Urutan Data', 'per_page' => 'Jumlah data per halaman',
];
}
}
@@ -0,0 +1,44 @@
<?php
namespace App\Http\Requests\Koperasi;
use App\Services\Koperasi\PengurusKoperasiService;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rules\Enum as EnumRule;
abstract class KoperasiRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
protected function prepareForValidation(): void
{
$values = [];
foreach (PengurusKoperasiService::RUPIAH_FIELDS as $field) {
if ($this->exists($field)) {
$values[$field] = PengurusKoperasiService::normalizeRupiah($this->input($field));
}
}
$this->merge($values);
}
public function messages(): array
{
return [
'required' => ':attribute wajib diisi.',
'exists' => 'Pilihan :attribute tidak ditemukan.',
'prohibited' => ':attribute belum tersedia.',
'string' => ':attribute harus berupa teks.',
'max.string' => ':attribute maksimal :max karakter.',
'integer' => ':attribute harus berupa bilangan bulat.',
'numeric' => ':attribute harus berupa angka.',
'array' => 'Pilihan :attribute tidak valid.',
'in' => 'Pilihan :attribute tidak valid.',
'min.numeric' => ':attribute minimal :min.',
'max.numeric' => ':attribute maksimal :max.',
EnumRule::class => 'Pilihan :attribute tidak valid.',
];
}
}
@@ -0,0 +1,37 @@
<?php
namespace App\Http\Requests\Koperasi;
use App\Models\Koperasi\PengurusKoperasi;
abstract class KoperasiTabRequest extends KoperasiRequest
{
public function authorize(): bool
{
$pengurus = $this->route('pengurusKoperasi');
return $pengurus instanceof PengurusKoperasi && $pengurus->profilLengkap();
}
public function attributes(): array
{
$attributes = [];
foreach (array_keys($this->rules()) as $field) {
$attributes[$field] = ucfirst(str_replace(['_', '.*'], [' ', ''], $field));
}
return $attributes;
}
protected function prepareForValidation(): void
{
parent::prepareForValidation();
// Checkbox yang dikosongkan harus menghapus pilihan yang sebelumnya tersimpan.
foreach ($this->rules() as $field => $rules) {
if (in_array('array', $rules, true) && ! $this->exists($field)) {
$this->merge([$field => []]);
}
}
}
}
@@ -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)',
];
}
}
@@ -0,0 +1,84 @@
<?php
namespace App\Http\Requests\Koperasi;
use App\Enums\Koperasi\FokusKomoditasKoperasi;
use App\Enums\Koperasi\JenisKoperasi;
use App\Enums\Koperasi\PosisiKoperasi;
use App\Enums\Koperasi\SkalaOperasiKoperasi;
use App\Services\Koperasi\WilayahKoperasiService;
use Illuminate\Validation\Rule;
class StorePengurusKoperasiRequest extends KoperasiRequest
{
use ValidatesWilayahKoperasi;
protected function prepareForValidation(): void
{
parent::prepareForValidation();
if (app(WilayahKoperasiService::class)->available() && $this->exists('provinsi_id') && ! $this->exists('desa_kelurahan_id')) {
$this->merge(['desa_kelurahan_id' => null]);
}
}
public function authorize(): bool
{
return true;
}
public function rules(): array
{
return [
...$this->wilayahRules(true),
'nama_lengkap' => ['required', 'string', 'max:255'],
'posisi_dalam_koperasi' => ['required', Rule::enum(PosisiKoperasi::class)],
'tahun_bergabung' => ['nullable', 'integer'],
'no_hp' => ['nullable', 'string', 'max:20'],
'alamat_tinggal' => ['nullable', 'string'],
'nama_koperasi' => ['required', 'string', 'max:255'],
'jenis_koperasi' => ['required', Rule::enum(JenisKoperasi::class)],
'jenis_koperasi_lainnya' => ['nullable', 'string', 'max:255'],
'alamat_koperasi' => ['nullable', 'string'],
'sejarah_lembaga' => ['nullable', 'string'],
'fokus_komoditas' => ['nullable', Rule::enum(FokusKomoditasKoperasi::class)],
'detail_fokus_komoditas' => ['nullable', 'string', 'max:255'],
'skala_operasi' => ['required', Rule::enum(SkalaOperasiKoperasi::class)],
'tahun_berdiri' => ['nullable', 'integer'],
'jumlah_anggota_awal' => ['nullable', 'integer'],
'jumlah_anggota_dewasa' => ['nullable', 'integer'],
'jumlah_anggota_anak' => ['nullable', 'integer'],
'jumlah_pengurus' => ['nullable', 'integer'],
'shu_2025' => ['nullable', 'numeric'],
'shu_2024' => ['nullable', 'numeric'],
'shu_2023' => ['nullable', 'numeric'],
];
}
public function attributes(): array
{
return [
...$this->wilayahAttributes(),
'nama_lengkap' => 'Nama responden',
'posisi_dalam_koperasi' => 'Posisi dalam koperasi',
'tahun_bergabung' => 'Tahun bergabung koperasi',
'no_hp' => 'Nomor HP',
'alamat_tinggal' => 'Alamat tinggal',
'nama_koperasi' => 'Nama koperasi',
'jenis_koperasi' => 'Jenis koperasi',
'jenis_koperasi_lainnya' => 'Jenis koperasi lainnya',
'alamat_koperasi' => 'Alamat koperasi',
'sejarah_lembaga' => 'Sejarah dan tujuan pendirian',
'fokus_komoditas' => 'Fokus komoditas pertanian',
'detail_fokus_komoditas' => 'Komoditas yang dikembangkan',
'skala_operasi' => 'Skala operasi koperasi',
'tahun_berdiri' => 'Tahun berdiri',
'jumlah_anggota_awal' => 'Jumlah anggota awal berdiri',
'jumlah_anggota_dewasa' => 'Jumlah anggota dewasa',
'jumlah_anggota_anak' => 'Jumlah anggota anak',
'jumlah_pengurus' => 'Jumlah pengurus',
'shu_2025' => 'SHU 2025',
'shu_2024' => 'SHU 2024',
'shu_2023' => 'SHU 2023',
];
}
}
@@ -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',
];
}
}
@@ -0,0 +1,60 @@
<?php
namespace App\Http\Requests\Koperasi;
use App\Enums\Koperasi\AlasanPinjamanKoperasi;
use App\Enums\Koperasi\BentukPembayaranKoperasi;
use App\Enums\Koperasi\JawabanYaTidakKoperasi;
use App\Enums\Koperasi\KetersediaanKoperasi;
use App\Services\Koperasi\SosialEkonomiKoperasiService;
use Illuminate\Validation\Rule;
class StoreSosialEkonomiKoperasiRequest extends KoperasiTabRequest
{
protected function prepareForValidation(): void
{
parent::prepareForValidation();
$policy = app(SosialEkonomiKoperasiService::class);
$this->merge($policy->normalize($this->all(), $policy->context($this->route('pengurusKoperasi'))));
}
public function rules(): array
{
$rules = [
'momen_simpanan_terbesar' => ['nullable', 'string', 'max:255'],
'alasan_pinjaman_lainnya' => ['nullable', 'string', 'max:255'],
'pembayaran_selain_uang' => ['nullable', Rule::enum(KetersediaanKoperasi::class)],
'bentuk_pembayaran_lainnya' => ['nullable', 'string', 'max:255'],
'perhitungan_harga_pasar' => ['nullable', Rule::enum(JawabanYaTidakKoperasi::class)],
'alasan_bukan_harga_pasar' => ['nullable', 'string'],
'alasan_pinjaman' => ['nullable', 'array'],
'alasan_pinjaman.*' => [Rule::enum(AlasanPinjamanKoperasi::class)],
'bentuk_pembayaran_barang' => ['nullable', 'array'],
'bentuk_pembayaran_barang.*' => [Rule::enum(BentukPembayaranKoperasi::class)],
'simpanan_terbesar' => ['nullable', 'integer', 'min:0'],
];
$policy = app(SosialEkonomiKoperasiService::class);
foreach ($policy->requiredFields() as $field) {
$rules[$field][] = Rule::requiredIf(fn () => $policy->active($field, $this->all(), $policy->context($this->route('pengurusKoperasi'))));
}
return $rules;
}
public function attributes(): array
{
return [
'simpanan_terbesar' => 'Simpanan Wajib Terbesar per Anggota',
'momen_simpanan_terbesar' => 'Bulan dan Momen Setoran Lebih Tinggi',
'alasan_pinjaman' => 'Keperluan Utama Pinjaman',
'alasan_pinjaman.*' => 'Keperluan Utama Pinjaman',
'alasan_pinjaman_lainnya' => 'Keperluan Pinjaman Lainnya',
'pembayaran_selain_uang' => 'Pembayaran Pinjaman Selain Uang',
'bentuk_pembayaran_barang' => 'Bentuk Pembayaran Selain Uang',
'bentuk_pembayaran_barang.*' => 'Bentuk Pembayaran Selain Uang',
'bentuk_pembayaran_lainnya' => 'Bentuk Pembayaran Lainnya',
'perhitungan_harga_pasar' => 'Penilaian Hasil Bumi Sesuai Harga Pasar',
'alasan_bukan_harga_pasar' => 'Alasan Tidak Menggunakan Harga Pasar',
];
}
}
@@ -0,0 +1,5 @@
<?php
namespace App\Http\Requests\Koperasi;
class UpdatePengurusKoperasiRequest extends StorePengurusKoperasiRequest {}
@@ -0,0 +1,58 @@
<?php
namespace App\Http\Requests\Koperasi;
use App\Services\Koperasi\WilayahKoperasiService;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
use Illuminate\Validation\Validator;
trait ValidatesWilayahKoperasi
{
protected function wilayahRules(bool $profile = false): array
{
$tables = ['kabupaten_kota_id' => 'master_kabupaten_kota', 'kecamatan_id' => 'master_kecamatan', 'desa_kelurahan_id' => 'master_desa_kelurahan'];
if ($profile) {
$tables = ['provinsi_id' => 'master_provinsi', ...$tables];
}
$available = app(WilayahKoperasiService::class)->available();
$rules = [];
foreach ($tables as $field => $table) {
$rules[$field] = ['bail', Rule::prohibitedIf(! $available), 'nullable', 'integer', Rule::exists($table, 'id')->whereNull('deleted_at')];
if ($profile) {
$others = array_diff(array_keys($tables), [$field]);
$rules[$field][] = Rule::requiredIf(fn () => collect($others)->contains(fn ($other) => $this->filled($other)));
}
}
return $rules;
}
protected function wilayahAttributes(): array
{
return ['provinsi_id' => 'Provinsi', 'kabupaten_kota_id' => 'Kabupaten/Kota', 'kecamatan_id' => 'Kecamatan', 'desa_kelurahan_id' => 'Desa/Kelurahan'];
}
public function after(): array
{
return [function (Validator $validator) {
$labels = $this->wilayahAttributes();
if ($validator->errors()->hasAny(array_keys($labels))) {
return;
}
foreach ([
['kabupaten_kota_id', 'provinsi_id', 'master_kabupaten_kota'],
['kecamatan_id', 'kabupaten_kota_id', 'master_kecamatan'],
['desa_kelurahan_id', 'kecamatan_id', 'master_desa_kelurahan'],
] as [$child, $parent, $table]) {
if ($parent === 'provinsi_id' && ! $this instanceof StorePengurusKoperasiRequest) {
continue;
}
if ($this->filled($child) && $this->filled($parent)
&& ! DB::table($table)->where('id', $this->input($child))->where($parent, $this->input($parent))->exists()) {
$validator->errors()->add($child, 'Pilihan '.$labels[$child].' tidak sesuai dengan '.$labels[$parent].'.');
}
}
}];
}
}