orderBy('created_at', 'desc'); if ($request->search) { $query->where(function ($query) use ($request) { $query->where('nama', 'like', '%' . $request->search . '%') ->orWhere('jabatan', 'like', '%' . $request->search . '%') ->orWhere('jabatan_lainnya', 'like', '%' . $request->search . '%'); }); } if (auth()->user()->role->value === 'fasilitator') { $query->where('created_by', auth()->id()); } $summaryQuery = clone $query; $totalPengurus = (clone $summaryQuery)->count(); $totalLakiLaki = (clone $summaryQuery)->where('jenis_kelamin', true)->count(); $totalPerempuan = (clone $summaryQuery)->where('jenis_kelamin', false)->count(); $totalDesaKelurahan = (clone $summaryQuery)->distinct('desa_kelurahan_id')->count('desa_kelurahan_id'); $totalJabatan = (clone $summaryQuery)->distinct('jabatan')->count('jabatan'); $pengurus = $query->paginate($request->per_page ?? 10); $userRole = auth()->user()->role->value; $showEnumerator = in_array($userRole, ['super_admin', 'admin']); return view('bumdes.profil.index', compact( 'pengurus', 'totalPengurus', 'totalLakiLaki', 'totalPerempuan', 'totalDesaKelurahan', 'totalJabatan', 'showEnumerator' )); } public function create() { if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) { abort(403); } $provinsi = Provinsi::select('id', 'kode', 'nama')->orderBy('kode', 'asc')->get(); $jabatan = JabatanBumdes::options(); $pendidikan = Pendidikan::options(); return view('bumdes.profil.add', compact('provinsi', 'jabatan', 'pendidikan')); } public function store(Request $request) { if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) { abort(403); } $validatedData = $this->validatedData($request); $pengurus = PengurusBumdes::create([ ...$this->formatData($validatedData), 'uid' => 'BMD-' . strtoupper(Str::random(10)), 'created_by' => auth()->id(), 'updated_by' => auth()->id(), ]); return redirect()->route('bumdes.edit', $pengurus->id)->with('success', 'Data pengurus BUMDes berhasil ditambahkan.'); } public function show(string $id) { return redirect()->route('bumdes.edit', $id); } public function edit(string $id) { if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) { abort(403); } $pengurus = $this->pengurusQuery()->with([ 'desaKelurahan.kecamatan.kabupatenKota.provinsi', ])->findOrFail($id); $provinsi = Provinsi::select('id', 'kode', 'nama')->orderBy('kode', 'asc')->get(); $jabatan = JabatanBumdes::options(); $pendidikan = Pendidikan::options(); return view('bumdes.profil.edit', compact('pengurus', 'provinsi', 'jabatan', 'pendidikan')); } public function update(Request $request, string $id) { if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) { abort(403); } $pengurus = $this->pengurusQuery()->findOrFail($id); $validatedData = $this->validatedData($request); $pengurus->update([ ...$this->formatData($validatedData), 'updated_by' => auth()->id(), ]); return redirect()->route('bumdes.edit', $pengurus->id)->with('success', 'Data pengurus BUMDes berhasil diupdate.'); } public function destroy(string $id) { if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) { abort(403); } $pengurus = $this->pengurusQuery()->findOrFail($id); $pengurus->update(['deleted_by' => auth()->id()]); $pengurus->delete(); return response()->json(['message' => 'Data pengurus BUMDes berhasil dihapus.']); } public function kelembagaanAktor(string $id) { if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) { abort(403); } $pengurus = $this->pengurusQuery()->with([ 'desaKelurahan.kecamatan.kabupatenKota.provinsi', ])->findOrFail($id); return view('bumdes.kelembagaan-aktor.index', compact('pengurus')); } private function pengurusQuery() { $query = PengurusBumdes::query(); if (auth()->user()->role->value === 'fasilitator') { $query->where('created_by', auth()->id()); } return $query; } private function validatedData(Request $request): array { return $request->validate([ 'nama' => ['required', 'string', 'max:255'], 'jenis_kelamin' => ['required', 'boolean'], 'tempat_lahir' => ['required', 'string', 'max:255'], 'tanggal_lahir' => ['required', 'date_format:d-m-Y'], 'pendidikan_terakhir' => ['required', Rule::enum(Pendidikan::class)], 'alamat' => ['required', 'string', 'max:500'], 'desa_kelurahan_id' => ['required', 'exists:master_desa_kelurahan,id'], 'nomor_telepon' => ['nullable', 'digits_between:11,13'], 'jabatan' => ['required', Rule::enum(JabatanBumdes::class)], 'jabatan_lainnya' => ['nullable', 'required_if:jabatan,' . JabatanBumdes::LAINNYA->value, 'string', 'max:255'], 'lama_menjabat_tahun' => ['required', 'integer', 'min:0', 'max:80'], ], [ 'nama.required' => 'Nama harus diisi.', 'jenis_kelamin.required' => 'Jenis kelamin harus dipilih.', 'tempat_lahir.required' => 'Tempat lahir harus diisi.', 'tanggal_lahir.required' => 'Tanggal lahir harus diisi.', 'tanggal_lahir.date_format' => 'Tanggal lahir harus menggunakan format tanggal yang valid.', 'pendidikan_terakhir.required' => 'Pendidikan terakhir harus dipilih.', 'alamat.required' => 'Alamat harus diisi.', 'desa_kelurahan_id.required' => 'Desa kelurahan harus dipilih.', 'desa_kelurahan_id.exists' => 'Desa kelurahan tidak ditemukan.', 'nomor_telepon.digits_between' => 'Nomor telepon harus berupa angka 11 sampai 13 digit.', 'jabatan.required' => 'Jabatan/peran harus dipilih.', 'jabatan_lainnya.required_if' => 'Jabatan lainnya harus diisi.', 'lama_menjabat_tahun.required' => 'Lama menjabat harus diisi.', 'lama_menjabat_tahun.integer' => 'Lama menjabat harus berupa angka tahun.', ]); } private function formatData(array $data): array { $data['tanggal_lahir'] = Carbon::createFromFormat('d-m-Y', $data['tanggal_lahir'])->format('Y-m-d'); $data['tanggal_mulai_menjabat'] = Carbon::now() ->subYears((int) $data['lama_menjabat_tahun']) ->format('Y-m-d'); if (($data['jabatan'] ?? null) !== JabatanBumdes::LAINNYA->value) { $data['jabatan_lainnya'] = null; } return $data; } }