Files
database-pertani-web/app/Http/Requests/Bumdes/BumdesRequest.php
T
2026-11-05 19:20:05 +07:00

175 lines
9.9 KiB
PHP

<?php
namespace App\Http\Requests\Bumdes;
use App\Enums\Bumdes\AsetProduktifBumdes;
use App\Enums\Bumdes\InfrastrukturPascapanenBumdes;
use App\Enums\Bumdes\JabatanPengurusIntiBumdes;
use App\Enums\Bumdes\KondisiInfrastrukturBumdes;
use App\Enums\Bumdes\StatusAdArtBumdes;
use App\Enums\Bumdes\StatusBadanHukumBumdes;
use App\Enums\Bumdes\StatusKeaktifanBumdes;
use App\Enums\Bumdes\StatusKepemilikanAsetBumdes;
use App\Enums\Bumdes\StatusUnitKomoditasBumdes;
use App\Enums\Bumdes\UnitUsahaBumdes;
use App\Enums\Role;
use App\Models\Bumdes\KelembagaanAktorBumdes;
use App\Models\Bumdes\PengurusBumdes;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Str;
use Illuminate\Validation\Rule;
class BumdesRequest extends FormRequest
{
public function authorize(): bool
{
if (! Gate::any(['super_admin', 'admin', 'enumerator'])) {
return false;
}
$pengurus = $this->route('pengurusBumdes');
if ($pengurus instanceof PengurusBumdes && $this->user()->role === Role::ENUMERATOR) {
abort_unless((int) $pengurus->created_by === (int) $this->user()->id, 404);
}
if ($pengurus instanceof PengurusBumdes && $this->routeIs('bumdes.operasional.*', 'bumdes.kelembagaan-aktor.*', 'bumdes.rantai-nilai.*')) {
abort_unless($pengurus->profilLengkap(), 403);
}
return true;
}
public function rules(): array
{
return [];
}
protected function sectionRules(string $section): array
{
$maxYear = now()->year + 1;
$rules = [
'status_badan_hukum' => ['nullable', Rule::enum(StatusBadanHukumBumdes::class)],
'nomor_dasar_hukum' => [Rule::excludeIf($this->input('status_badan_hukum') !== 'sudah_berbadan_hukum'), 'required_if:status_badan_hukum,sudah_berbadan_hukum', 'string', 'max:255'],
'tahun_dasar_hukum' => [Rule::excludeIf($this->input('status_badan_hukum') !== 'sudah_berbadan_hukum'), 'required_if:status_badan_hukum,sudah_berbadan_hukum', 'integer', 'digits:4', 'min:1900', 'max:'.$maxYear],
'status_keaktifan' => ['nullable', Rule::enum(StatusKeaktifanBumdes::class)],
'alasan_tidak_aktif' => ['nullable', 'string'],
'unit_usaha' => ['nullable', 'array'],
'unit_usaha.*' => ['string', Rule::enum(UnitUsahaBumdes::class)],
'unit_usaha_jasa_lainnya' => ['nullable', 'string', 'max:255'],
'status_unit_komoditas' => ['nullable', Rule::enum(StatusUnitKomoditasBumdes::class)],
'nama_unit_komoditas' => [Rule::excludeIf($this->input('status_unit_komoditas') !== 'ya'), 'required_if:status_unit_komoditas,ya', 'string', 'max:255'],
'status_ad_art' => ['nullable', Rule::enum(StatusAdArtBumdes::class)],
'tahun_ad_art' => [Rule::excludeIf($this->input('status_ad_art') !== 'ada_lengkap'), 'required_if:status_ad_art,ada_lengkap', 'integer', 'digits:4', 'min:1900', 'max:'.$maxYear],
'pengurus_inti' => ['nullable', 'array'],
'pengurus_inti.*' => ['array'],
'pengurus_inti.*.jabatan' => ['nullable', Rule::enum(JabatanPengurusIntiBumdes::class)],
'pengurus_inti.*.nama' => ['nullable', 'string', 'max:255'],
'pengurus_inti.*.aktif' => ['nullable', 'boolean'],
'memiliki_staf' => ['nullable', 'boolean'],
'jumlah_staf' => ['nullable', 'integer', 'min:0'],
'unit_usaha_staf' => ['nullable', 'string'],
'modal_awal' => ['nullable', 'integer', 'min:0'],
'tahun_modal_awal' => ['nullable', 'integer', 'digits:4', 'min:1900', 'max:'.$maxYear],
'pernah_penambahan_modal' => ['nullable', 'boolean'],
'penambahan_modal' => [Rule::excludeIf(! $this->boolean('pernah_penambahan_modal')), 'nullable', 'array'],
'penambahan_modal.*' => [Rule::excludeIf(! $this->boolean('pernah_penambahan_modal')), 'array'],
'penambahan_modal.*.tahun' => [Rule::excludeIf(! $this->boolean('pernah_penambahan_modal')), 'nullable', 'integer', 'digits:4', 'min:1900', 'max:'.$maxYear],
'penambahan_modal.*.jumlah' => [Rule::excludeIf(! $this->boolean('pernah_penambahan_modal')), 'nullable', 'integer', 'min:0'],
'aset_produktif' => ['nullable', 'array'],
'aset_produktif.*' => ['array'],
'aset_produktif.*.aset' => ['nullable', Rule::enum(AsetProduktifBumdes::class)],
'aset_produktif.*.dipilih' => ['nullable', 'boolean'],
'aset_produktif.*.jumlah' => ['nullable', 'integer', 'min:0'],
'aset_produktif.*.kondisi' => ['nullable', 'string', 'max:255'],
'aset_produktif_lainnya' => ['nullable', 'string', 'max:255'],
'status_kepemilikan_aset' => ['nullable', Rule::enum(StatusKepemilikanAsetBumdes::class)],
'infrastruktur_pascapanen' => ['nullable', 'array'],
'infrastruktur_pascapanen.*' => ['array'],
'infrastruktur_pascapanen.*.infrastruktur' => ['nullable', Rule::enum(InfrastrukturPascapanenBumdes::class)],
'infrastruktur_pascapanen.*.dipilih' => ['nullable', 'boolean'],
'infrastruktur_pascapanen.*.jumlah' => ['nullable', 'integer', 'min:0'],
'infrastruktur_pascapanen.*.kondisi' => ['nullable', Rule::enum(KondisiInfrastrukturBumdes::class)],
'infrastruktur_pascapanen_lainnya' => ['nullable', 'string', 'max:255'],
];
$fields = KelembagaanAktorBumdes::sectionFields($section);
$rules = array_filter($rules, fn ($field) => in_array(Str::before($field, '.'), $fields, true), ARRAY_FILTER_USE_KEY);
return $rules;
}
public function messages(): array
{
return [
'nomor_dasar_hukum.required_if' => 'Nomor Peraturan Desa/SK wajib diisi.',
'tahun_dasar_hukum.required_if' => 'Tahun Ditetapkan wajib diisi.',
'nama_unit_komoditas.required_if' => 'Nama Unit Usaha Komoditas wajib diisi.',
'tahun_ad_art.required_if' => 'Tahun Terakhir Diperbarui wajib diisi.',
'string' => ':attribute harus berupa teks.',
'required' => ':attribute wajib diisi.',
'exists' => ':attribute tidak ditemukan.',
'integer' => ':attribute harus berupa angka.',
'digits' => ':attribute harus terdiri dari :digits digit.',
'min' => ':attribute tidak boleh kurang dari :min.',
'max' => ':attribute tidak valid.',
'enum' => 'Pilihan :attribute tidak valid.',
'in' => ':attribute tidak valid.',
'array' => ':attribute harus berupa daftar data.',
'boolean' => ':attribute harus dipilih.',
];
}
public function attributes(): array
{
return [
'search' => 'Pencarian',
'kabupaten_kota_id' => 'Kabupaten/Kota', 'kabupaten_id' => 'Kabupaten/Kota',
'provinsi_id' => 'Provinsi', 'kecamatan_id' => 'Kecamatan', 'desa_kelurahan_id' => 'Desa/Kelurahan',
'jenis_kelamin' => 'Jenis kelamin', 'per_page' => 'Jumlah data per halaman',
'nama' => 'Nama', 'tempat_lahir' => 'Tempat lahir', 'tanggal_lahir' => 'Tanggal lahir',
'pendidikan_terakhir' => 'Pendidikan terakhir', 'alamat' => 'Alamat', 'nomor_telepon' => 'Nomor telepon',
'jabatan' => 'Jabatan/peran', 'jabatan_lainnya' => 'Jabatan lainnya', 'lama_menjabat_tahun' => 'Lama menjabat',
'pengurus_inti' => 'Daftar Pengurus', 'pengurus_inti.*.jabatan' => 'Jabatan pengurus',
'pengurus_inti.*.nama' => 'Nama pengurus', 'pengurus_inti.*.aktif' => 'Keaktifan pengurus',
'status_badan_hukum' => 'Status badan hukum',
'nomor_dasar_hukum' => 'Nomor Peraturan Desa/SK',
'tahun_dasar_hukum' => 'Tahun Ditetapkan',
'nama_unit_komoditas' => 'Nama Unit Usaha Komoditas',
'tahun_ad_art' => 'Tahun Terakhir Diperbarui',
'status_keaktifan' => 'Status keaktifan',
'unit_usaha' => 'Unit usaha',
'status_unit_komoditas' => 'Unit usaha komoditas',
'status_ad_art' => 'Dokumen AD/ART',
'memiliki_staf' => 'Status staf/karyawan',
'jumlah_staf' => 'Jumlah staf',
'modal_awal' => 'Modal awal',
'tahun_modal_awal' => 'Tahun modal awal',
'pernah_penambahan_modal' => 'Status penambahan modal',
'penambahan_modal' => 'Rincian penambahan modal',
'penambahan_modal.*.tahun' => 'Tahun penambahan modal pada baris :position',
'penambahan_modal.*.jumlah' => 'Jumlah penambahan modal pada baris :position',
'status_kepemilikan_aset' => 'Status kepemilikan aset',
'alasan_tidak_aktif' => 'Alasan tidak aktif',
'unit_usaha.*' => 'Pilihan unit usaha',
'unit_usaha_jasa_lainnya' => 'Jasa lainnya',
'unit_usaha_staf' => 'Unit usaha staf',
'pengurus_inti.*' => 'Data pengurus pada baris :position',
'penambahan_modal.*' => 'Penambahan modal pada baris :position',
'aset_produktif' => 'Aset produktif',
'aset_produktif.*' => 'Data aset produktif pada baris :position',
'aset_produktif.*.aset' => 'Jenis aset produktif',
'aset_produktif.*.dipilih' => 'Pilihan aset produktif',
'aset_produktif.*.jumlah' => 'Jumlah aset produktif',
'aset_produktif.*.kondisi' => 'Kondisi aset produktif',
'aset_produktif_lainnya' => 'Aset produktif lainnya',
'infrastruktur_pascapanen' => 'Infrastruktur pascapanen',
'infrastruktur_pascapanen.*' => 'Data infrastruktur pada baris :position',
'infrastruktur_pascapanen.*.infrastruktur' => 'Jenis infrastruktur',
'infrastruktur_pascapanen.*.dipilih' => 'Pilihan infrastruktur',
'infrastruktur_pascapanen.*.jumlah' => 'Jumlah infrastruktur',
'infrastruktur_pascapanen.*.kondisi' => 'Kondisi infrastruktur',
'infrastruktur_pascapanen_lainnya' => 'Infrastruktur lainnya',
];
}
}