diff --git a/app/Http/Controllers/Api/Ekosistem/ValueBasisDataController.php b/app/Http/Controllers/Api/Ekosistem/ValueBasisDataController.php index 2c5bf01..0e3f769 100644 --- a/app/Http/Controllers/Api/Ekosistem/ValueBasisDataController.php +++ b/app/Http/Controllers/Api/Ekosistem/ValueBasisDataController.php @@ -16,9 +16,7 @@ use App\Models\Core\Program; class ValueBasisDataController extends Controller { - /** - * Display a listing of the resource. - */ + public function index(Request $request, string $tabelId): JsonResponse { if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { @@ -149,9 +147,70 @@ class ValueBasisDataController extends Controller return response()->json($values); } - /** - * Store a newly created resource in storage. - */ + private function prepareValidationRules($kolom) + { + $rules = []; + foreach ($kolom as $k) { + if ($k->validasi && is_array($k->validasi)) { + $rules[$k->kolom] = $k->validasi; + + if (!in_array('required', $k->validasi) && !in_array('nullable', $k->validasi)) { + $rules[$k->kolom][] = 'nullable'; + } + + if (!in_array('string', $k->validasi) && ($k->tipe == 'varchar' || $k->tipe == 'text')) { + $rules[$k->kolom][] = 'string'; + } + if (!in_array('max', $k->validasi) && ($k->tipe == 'varchar')) { + $rules[$k->kolom][] = 'max:255'; + } + if (!in_array('integer', $k->validasi) && $k->tipe == 'integer') { + $rules[$k->kolom][] = 'integer'; + } + if (!in_array('boolean', $k->validasi) && $k->tipe == 'boolean') { + $rules[$k->kolom][] = 'boolean'; + } + if (!in_array('date', $k->validasi) && ($k->tipe == 'date' || $k->tipe == 'datetime')) { + $rules[$k->kolom][] = 'date'; + } + if ($k->tipe == 'foreign_key') { + $rules[$k->kolom][] = 'exists:' . $k->relasi_tabel . ',' . $k->relasi_kolom_id; + } + if ($k->tipe == 'enum') { + $enumValues = collect($k->enum_opsi)->pluck('value')->toArray(); + $rules[$k->kolom][] = Rule::in($enumValues); + } + + } else { + $rules[$k->kolom] = ['nullable']; + + if ($k->tipe == 'varchar' || $k->tipe == 'text') { + $rules[$k->kolom][] = 'string'; + } + if ($k->tipe == 'varchar') { + $rules[$k->kolom][] = 'max:255'; + } + if ($k->tipe == 'integer') { + $rules[$k->kolom][] = 'integer'; + } + if ($k->tipe == 'boolean') { + $rules[$k->kolom][] = 'boolean'; + } + if ($k->tipe == 'date' || $k->tipe == 'datetime') { + $rules[$k->kolom][] = 'date'; + } + if ($k->tipe == 'foreign_key') { + $rules[$k->kolom][] = 'exists:' . $k->relasi_tabel . ',' . $k->relasi_kolom_id; + } + if ($k->tipe == 'enum') { + $enumValues = collect($k->enum_opsi)->pluck('value')->toArray(); + $rules[$k->kolom][] = Rule::in($enumValues); + } + } + } + return $rules; + } + public function store(Request $request, string $tabelId): JsonResponse { if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { @@ -183,15 +242,7 @@ class ValueBasisDataController extends Controller } } - $validationRules = []; - foreach ($kolom as $k) { - if ($k->validasi && is_array($k->validasi)) { - $validationRules[$k->kolom] = $k->validasi; - } else { - $validationRules[$k->kolom] = ['nullable']; - } - } - $validated = $request->validate($validationRules); + $validated = $request->validate($this->prepareValidationRules($kolom)); DB::transaction(function () use ($program, $tabelId, $validated, $kolom) { $maxId = ValueBasisData::where('tabel_id', $tabelId) @@ -220,17 +271,11 @@ class ValueBasisDataController extends Controller return response()->json(['message' => 'Data berhasil disimpan.']); } - /** - * Display the specified resource. - */ public function show(string $id) { // } - /** - * Update the specified resource in storage. - */ public function update(Request $request, string $tabelId, string $id): JsonResponse { if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { @@ -271,15 +316,7 @@ class ValueBasisDataController extends Controller abort(404, 'Data tidak ditemukan.'); } - $validationRules = []; - foreach ($kolom as $k) { - if ($k->validasi && is_array($k->validasi)) { - $validationRules[$k->kolom] = $k->validasi; - } else { - $validationRules[$k->kolom] = ['nullable']; - } - } - $validated = $request->validate($validationRules); + $validated = $request->validate($this->prepareValidationRules($kolom)); DB::transaction(function () use ($program, $tabelId, $validated, $kolom, $id, $values) { foreach ($validated as $kol => $val) { @@ -315,9 +352,6 @@ class ValueBasisDataController extends Controller return response()->json(['message' => 'Data berhasil diperbarui.']); } - /** - * Remove the specified resource from storage. - */ public function destroy(Request $request, string $tabelId, string $id): JsonResponse { if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { diff --git a/app/Http/Controllers/Web/Ekosistem/ValueBasisDataController.php b/app/Http/Controllers/Web/Ekosistem/ValueBasisDataController.php index cc4b085..fef69e5 100644 --- a/app/Http/Controllers/Web/Ekosistem/ValueBasisDataController.php +++ b/app/Http/Controllers/Web/Ekosistem/ValueBasisDataController.php @@ -24,12 +24,13 @@ use App\Models\Core\Program; class ValueBasisDataController extends Controller { - private $tableModelClassMap = [ + private $tableExceptionModelClassMap = [ 'master_provinsi' => \App\Models\Wilayah\Provinsi::class, 'master_kabupaten_kota' => \App\Models\Wilayah\KabupatenKota::class, 'master_kecamatan' => \App\Models\Wilayah\Kecamatan::class, 'master_desa_kelurahan' => \App\Models\Wilayah\DesaKelurahan::class, ]; + private $tableModelClassMap = []; public function index(Request $request, string $tabelId): View { @@ -209,14 +210,31 @@ class ValueBasisDataController extends Controller if ($k->tipe == 'foreign_key') { $relasi['kolom_id'] = $k->id; try { - $modelClass = Arr::get($this->tableModelClassMap, $k->relasi_tabel); - if ($modelClass) { - $options_kolom = $modelClass::select($k->relasi_kolom_label . ' as label', $k->relasi_kolom_id . ' as value')->limit(10000); + $exceptionModelClass = Arr::get($this->tableExceptionModelClassMap, $k->relasi_tabel); + if ($exceptionModelClass) { + $relasi['options'] = []; + if ($errors = session('errors')) { + $oldValue = old($k->kolom); + if ($oldValue) { + $option = $exceptionModelClass::where($k->relasi_kolom_id, $oldValue)->first(); + if ($option) { + $relasi['options'][] = (object) [ + 'value' => $option->{$k->relasi_kolom_id}, + 'label' => $option->{$k->relasi_kolom_label}, + ]; + } + } + } } else { - $options_kolom = DB::table($k->relasi_tabel)->selectRaw($k->relasi_kolom_label . ' as label, ' . $k->relasi_kolom_id . ' as value')->whereNull('deleted_at')->limit(10000); + $modelClass = Arr::get($this->tableModelClassMap, $k->relasi_tabel); + if ($modelClass) { + $options_kolom = $modelClass::select($k->relasi_kolom_label . ' as label', $k->relasi_kolom_id . ' as value')->limit(10000); + } else { + $options_kolom = DB::table($k->relasi_tabel)->selectRaw($k->relasi_kolom_label . ' as label, ' . $k->relasi_kolom_id . ' as value')->whereNull('deleted_at')->limit(10000); + } + $relasi['options'] = $options_kolom->get(); + $relasi['sql'] = $options_kolom->toSql(); } - $relasi['options'] = $options_kolom->get(); - $relasi['sql'] = $options_kolom->toSql(); } catch (\Throwable $th) { $relasi['options'] = []; } @@ -242,8 +260,8 @@ class ValueBasisDataController extends Controller if (!in_array('string', $k->validasi) && ($k->tipe == 'varchar' || $k->tipe == 'text')) { $rules[$k->kolom][] = 'string'; } - if (!in_array('size', $k->validasi) && ($k->tipe == 'varchar')) { - $rules[$k->kolom][] = 'size:255'; + if (!in_array('max', $k->validasi) && ($k->tipe == 'varchar')) { + $rules[$k->kolom][] = 'max:255'; } if (!in_array('integer', $k->validasi) && $k->tipe == 'integer') { $rules[$k->kolom][] = 'integer'; @@ -269,7 +287,7 @@ class ValueBasisDataController extends Controller $rules[$k->kolom][] = 'string'; } if ($k->tipe == 'varchar') { - $rules[$k->kolom][] = 'size:255'; + $rules[$k->kolom][] = 'max:255'; } if ($k->tipe == 'integer') { $rules[$k->kolom][] = 'integer'; @@ -464,14 +482,34 @@ class ValueBasisDataController extends Controller if ($k->tipe == 'foreign_key') { $relasi['kolom_id'] = $k->id; try { - $modelClass = Arr::get($this->tableModelClassMap, 'master_desa_kelurahan'); - if ($modelClass) { - $options_kolom = $modelClass::select($k->relasi_kolom_label . ' as label', $k->relasi_kolom_id . ' as value')->limit(10000); + $exceptionModelClass = Arr::get($this->tableExceptionModelClassMap, $k->relasi_tabel); + if ($exceptionModelClass) { + $relasi['options'] = []; + if ($errors = session('errors')) { + $oldValue = old($k->kolom); + if ($oldValue) { + $option = $exceptionModelClass::where($k->relasi_kolom_id, $oldValue)->first(); + if ($option) { + $relasi['options'][] = (object) [ + 'value' => $option->{$k->relasi_kolom_id}, + 'label' => $option->{$k->relasi_kolom_label}, + ]; + } + } + } else { + $options_kolom = $exceptionModelClass::select($k->relasi_kolom_label . ' as label', $k->relasi_kolom_id . ' as value')->limit(10000); + $relasi['options'] = $options_kolom->get(); + } } else { - $options_kolom = DB::table($k->relasi_tabel)->selectRaw($k->relasi_kolom_label . ' as label, ' . $k->relasi_kolom_id . ' as value')->whereNull('deleted_at')->limit(10000); + $modelClass = Arr::get($this->tableModelClassMap, $k->relasi_tabel); + if ($modelClass) { + $options_kolom = $modelClass::select($k->relasi_kolom_label . ' as label', $k->relasi_kolom_id . ' as value')->limit(10000); + } else { + $options_kolom = DB::table($k->relasi_tabel)->selectRaw($k->relasi_kolom_label . ' as label, ' . $k->relasi_kolom_id . ' as value')->whereNull('deleted_at')->limit(10000); + } + $relasi['options'] = $options_kolom->get(); + $relasi['sql'] = $options_kolom->toSql(); } - $relasi['options'] = $options_kolom->get(); - $relasi['sql'] = $options_kolom->toSql(); } catch (\Throwable $th) { $relasi['options'] = []; } diff --git a/app/Http/Controllers/Web/Master/DesaKelurahanController.php b/app/Http/Controllers/Web/Master/DesaKelurahanController.php index 7fd1dd3..46b127e 100644 --- a/app/Http/Controllers/Web/Master/DesaKelurahanController.php +++ b/app/Http/Controllers/Web/Master/DesaKelurahanController.php @@ -7,6 +7,8 @@ use Illuminate\Http\Request; use App\Models\Wilayah\DesaKelurahan; use App\Models\Wilayah\Provinsi; use Illuminate\Support\Facades\Validator; +use Illuminate\Validation\Rule; +use Illuminate\Support\Str; class DesaKelurahanController extends Controller { @@ -14,15 +16,15 @@ class DesaKelurahanController extends Controller { $title = 'Master Desa/Kelurahan'; $perPage = $request->query('per_page', 10); - $search = $request->query('search', ''); + $search = Str::lower($request->query('search', '')); $provinsi = Provinsi::orderBy('kode', 'asc')->get(); $desakelurahan = DesaKelurahan::with('kecamatan') - ->where('nama', 'like', "%$search%") - ->orWhere('kode', 'like', "%$search%") + ->whereRaw('lower(nama) like ?', ["%$search%"]) + ->orWhereRaw('lower(kode) like ?', ["%$search%"]) ->orWhereHas('kecamatan', function($query) use ($search) { - $query->where('nama', 'like', "%$search%"); + $query->whereRaw('lower(nama) like ?', ["%$search%"]); }) ->orderBy('kode', 'asc') ->paginate($perPage); @@ -30,6 +32,25 @@ class DesaKelurahanController extends Controller return view('master.desakelurahan.index', compact('title', 'desakelurahan', 'provinsi')); } + public function list(Request $request) + { + $perPage = $request->query('per_page', 50); + $search = Str::lower($request->query('search', '')); + + $desa = DesaKelurahan::where(function($query) use ($search) { + $query->whereRaw('lower(nama) like ?', ["%$search%"]) + ->orWhereRaw('lower(kode) like ?', ["%$search%"]) + ->orWhereHas('kecamatan', function($q) use ($search) { + $q->whereRaw('lower(nama) like ?', ["%$search%"]); + }); + }) + ->where('kecamatan_id', $request->query('kecamatan_id')) + ->orderBy('kode', 'asc') + ->paginate($perPage); + + return response()->json($desa); + } + public function getByKecamatan($kecamatan_id) { $desa = DesaKelurahan::where('kecamatan_id', $kecamatan_id) diff --git a/app/Http/Controllers/Web/Master/KabupatenKotaController.php b/app/Http/Controllers/Web/Master/KabupatenKotaController.php index 8cd20df..0e5747a 100644 --- a/app/Http/Controllers/Web/Master/KabupatenKotaController.php +++ b/app/Http/Controllers/Web/Master/KabupatenKotaController.php @@ -8,6 +8,7 @@ use App\Models\Wilayah\Provinsi; use App\Models\Wilayah\KabupatenKota; use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule; +use Illuminate\Support\Str; class KabupatenKotaController extends Controller { @@ -15,15 +16,15 @@ class KabupatenKotaController extends Controller { $title = 'Master Kabupaten/Kota'; $perPage = $request->query('per_page', 10); - $search = $request->query('search', ''); + $search = Str::lower($request->query('search', '')); $provinsi = Provinsi::all(); $kabupatenkota = KabupatenKota::with('provinsi') - ->where('nama', 'like', "%$search%") - ->orWhere('kode', 'like', "%$search%") + ->whereRaw('lower(nama) like ?', ["%$search%"]) + ->orWhereRaw('lower(kode) like ?', ["%$search%"]) ->orWhereHas('provinsi', function($query) use ($search) { - $query->where('nama', 'like', "%$search%"); + $query->whereRaw('lower(nama) like ?', ["%$search%"]); }) ->orderBy('kode', 'asc') ->paginate($perPage); @@ -31,6 +32,25 @@ class KabupatenKotaController extends Controller return view('master.kabupatenkota.index', compact('title', 'kabupatenkota', 'provinsi')); } + public function list(Request $request) + { + $perPage = $request->query('per_page', 50); + $search = Str::lower($request->query('search', '')); + + $kabupaten = KabupatenKota::where(function($query) use ($search) { + $query->whereRaw('lower(nama) like ?', ["%$search%"]) + ->orWhereRaw('lower(kode) like ?', ["%$search%"]) + ->orWhereHas('provinsi', function($q) use ($search) { + $q->whereRaw('lower(nama) like ?', ["%$search%"]); + }); + }) + ->where('provinsi_id', $request->query('provinsi_id')) + ->orderBy('kode', 'asc') + ->paginate($perPage); + + return response()->json($kabupaten); + } + public function getByProvinsi($provinsi_id) { $kabupaten = KabupatenKota::where('provinsi_id', $provinsi_id) diff --git a/app/Http/Controllers/Web/Master/KecamatanController.php b/app/Http/Controllers/Web/Master/KecamatanController.php index 391146b..5a8822e 100644 --- a/app/Http/Controllers/Web/Master/KecamatanController.php +++ b/app/Http/Controllers/Web/Master/KecamatanController.php @@ -7,6 +7,8 @@ use Illuminate\Http\Request; use App\Models\Wilayah\Kecamatan; use App\Models\Wilayah\Provinsi; use Illuminate\Support\Facades\Validator; +use Illuminate\Validation\Rule; +use Illuminate\Support\Str; class KecamatanController extends Controller { @@ -14,15 +16,15 @@ class KecamatanController extends Controller { $title = 'Master Kecamatan'; $perPage = $request->query('per_page', 10); - $search = $request->query('search', ''); + $search = Str::lower($request->query('search', '')); $provinsi = Provinsi::all(); $kecamatan = Kecamatan::with('kabupatenKota') - ->where('nama', 'like', "%$search%") - ->orWhere('kode', 'like', "%$search%") + ->whereRaw('lower(nama) like ?', ["%$search%"]) + ->orWhereRaw('lower(kode) like ?', ["%$search%"]) ->orWhereHas('kabupatenKota', function($query) use ($search) { - $query->where('nama', 'like', "%$search%"); + $query->whereRaw('lower(nama) like ?', ["%$search%"]); }) ->orderBy('kode', 'asc') ->paginate($perPage); @@ -30,6 +32,25 @@ class KecamatanController extends Controller return view('master.kecamatan.index', compact('title', 'kecamatan', 'provinsi')); } + public function list(Request $request) + { + $perPage = $request->query('per_page', 50); + $search = Str::lower($request->query('search', '')); + + $kecamatan = Kecamatan::where(function($query) use ($search) { + $query->whereRaw('lower(nama) like ?', ["%$search%"]) + ->orWhereRaw('lower(kode) like ?', ["%$search%"]) + ->orWhereHas('kabupatenKota', function($q) use ($search) { + $q->whereRaw('lower(nama) like ?', ["%$search%"]); + }); + }) + ->where('kabupaten_kota_id', $request->query('kabupaten_kota_id')) + ->orderBy('kode', 'asc') + ->paginate($perPage); + + return response()->json($kecamatan); + } + public function getByKabupaten($kabupaten_id) { $kecamatan = Kecamatan::where('kabupaten_kota_id', $kabupaten_id) diff --git a/app/Http/Controllers/Web/Master/ProvinsiController.php b/app/Http/Controllers/Web/Master/ProvinsiController.php index 88097d7..385dbd4 100644 --- a/app/Http/Controllers/Web/Master/ProvinsiController.php +++ b/app/Http/Controllers/Web/Master/ProvinsiController.php @@ -7,6 +7,7 @@ use Illuminate\Http\Request; use App\Models\Wilayah\Provinsi; use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule; +use Illuminate\Support\Str; class ProvinsiController extends Controller { @@ -15,23 +16,33 @@ class ProvinsiController extends Controller $title = 'Master Provinsi'; $perPage = $request->query('per_page', 10); - $search = $request->query('search', ''); + $search = Str::lower($request->query('search', '')); $provinsi = Provinsi::withCount('kabupatenKota') ->where(function($query) use ($search) { - $query->where('nama', 'like', "%$search%") - ->orWhere('kode', 'like', "%$search%") - ->orWhere('iso', 'like', "%$search%"); + $query->whereRaw('lower(nama) like ?', ["%$search%"]) + ->orWhereRaw('lower(kode) like ?', ["%$search%"]) + ->orWhereRaw('lower(iso) like ?', ["%$search%"]); }) ->paginate($perPage); return view('master.provinsi.index', compact('title', 'provinsi')); } - public function getProvinsi() + public function list(Request $request) { - $provinsi = Provinsi::select(['id', 'kode', 'nama', 'iso'])->get(); - return response()->json(['data' => $provinsi]); + $perPage = $request->query('per_page', 50); + $search = Str::lower($request->query('search', '')); + + $provinsi = Provinsi::where(function($query) use ($search) { + $query->whereRaw('lower(nama) like ?', ["%$search%"]) + ->orWhereRaw('lower(kode) like ?', ["%$search%"]) + ->orWhereRaw('lower(iso) like ?', ["%$search%"]); + }) + ->orderBy('kode', 'asc') + ->paginate($perPage); + + return response()->json($provinsi); } public function store(Request $request) diff --git a/app/Models/Ekosistem/FormBasisData.php b/app/Models/Ekosistem/FormBasisData.php index 75ecef6..6f36e7f 100644 --- a/app/Models/Ekosistem/FormBasisData.php +++ b/app/Models/Ekosistem/FormBasisData.php @@ -242,6 +242,7 @@ class FormBasisData extends Model } else { $html .= '