219 lines
8.0 KiB
PHP
219 lines
8.0 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Web\Bumdes;
|
|
|
|
use App\Enums\Bumdes\JabatanBumdes;
|
|
use App\Enums\Pendidikan;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Bumdes\PengurusBumdes;
|
|
use App\Models\Wilayah\Provinsi;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Gate;
|
|
use Illuminate\Support\Str;
|
|
use Illuminate\Validation\Rule;
|
|
|
|
class PengurusBumdesController extends Controller
|
|
{
|
|
public function index(Request $request)
|
|
{
|
|
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
|
abort(403);
|
|
}
|
|
|
|
$query = PengurusBumdes::with([
|
|
'desaKelurahan:id,nama,kecamatan_id',
|
|
'desaKelurahan.kecamatan:id,nama,kabupaten_kota_id',
|
|
'desaKelurahan.kecamatan.kabupatenKota:id,nama,provinsi_id',
|
|
'desaKelurahan.kecamatan.kabupatenKota.provinsi:id,nama',
|
|
'creator:id,name',
|
|
])
|
|
->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;
|
|
}
|
|
}
|