Skip to content

Commit 475646a

Browse files
authored
CRUD provinsi dan kabupaten (#514)
2 parents 648e7db + 84e1263 commit 475646a

File tree

14 files changed

+863
-127
lines changed

14 files changed

+863
-127
lines changed

app/Http/Controllers/Admin/Wilayah/KabupatenController.php

Lines changed: 94 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,43 @@
44

55
use App\Exports\WilayahKabupatenExport;
66
use App\Http\Controllers\Controller;
7+
use App\Http\Requests\RegionKabupatenRequest;
78
use App\Models\Region;
89
use Illuminate\Http\Request;
910
use Maatwebsite\Excel\Facades\Excel;
1011
use Yajra\DataTables\DataTables;
1112

1213
class KabupatenController extends Controller
1314
{
14-
public function index()
15+
public function index(Request $request)
1516
{
17+
if ($request->excel) {
18+
$paramDatatable = json_decode($request->get('params'), 1);
19+
$request->merge($paramDatatable);
20+
}
21+
22+
if ($request->ajax() || $request->excel) {
23+
$query = DataTables::of(Region::kabupaten());
24+
if ($request->excel) {
25+
$query->filtering();
26+
27+
return Excel::download(new WilayahKabupatenExport($query->results()), 'Wilayah-Kabupaten.xlsx');
28+
}
29+
30+
return $query->addIndexColumn()
31+
->addColumn('action', function ($data) {
32+
$edit = '<a href="' . url('kabupaten/' . $data->id . '/edit') . '" class="btn btn-sm btn-warning btn-sm"><i class="fas fa-pencil-alt"></i></a>';
33+
$delete = '<button data-href="' . url('kabupaten/' . $data->id) . '" class="btn btn-sm btn-danger" data-toggle="modal" data-target="#confirm-delete"><i class="fas fa-trash"></i></button>';
34+
35+
return '<div class="btn btn-group">' . $edit . $delete . '</div>';
36+
})
37+
->editColumn('nama_kabupaten', function ($data) {
38+
return $data->nama_kabupaten_baru ?? $data->nama_kabupaten;
39+
})
40+
->rawColumns(['action', 'nama_kabupaten'])
41+
->make(true);
42+
}
43+
1644
return view('admin.wilayah.kabupaten.index');
1745
}
1846

@@ -32,9 +60,73 @@ public function datatables(Request $request)
3260
}
3361

3462
return $query->addIndexColumn()
35-
->make(true);
63+
->make(true);
3664
}
3765

3866
abort(404);
3967
}
68+
69+
public function create()
70+
{
71+
return view('admin.wilayah.kabupaten.create');
72+
}
73+
74+
public function store(RegionKabupatenRequest $request)
75+
{
76+
$input = $request->all();
77+
78+
if (Region::create($input)) {
79+
$inputchild = [
80+
'region_code' => $input['region_code'] . '.00',
81+
'parent_code' => $input['region_code'],
82+
'deleted_at' => date('Y-m-d H:i:s'),
83+
];
84+
Region::create($inputchild);
85+
86+
return redirect('kabupaten')->with('success', 'Data berhasil disimpan');
87+
}
88+
89+
return back()->with('error', 'Data gagal disimpan');
90+
}
91+
92+
public function edit($id)
93+
{
94+
return view('admin.wilayah.kabupaten.edit', [
95+
'kabupaten' => Region::kabupaten()->findOrFail($id),
96+
]);
97+
}
98+
99+
public function update(RegionKabupatenRequest $request, $id)
100+
{
101+
$input = $request->all();
102+
$kabupaten = Region::kabupaten()->find($id);
103+
104+
if ($kabupaten->nama_kabupaten != $input['region_name']) {
105+
$input['new_region_name'] = $input['region_name'];
106+
107+
unset($input['region_name']);
108+
}
109+
110+
if ($kabupaten->update($input)) {
111+
return redirect('kabupaten')->with('success', 'Data berhasil diubah');
112+
}
113+
114+
return back()->with('error', 'Data gagal diubah');
115+
}
116+
117+
public function destroy($id)
118+
{
119+
// pastikan tidak ada region dengan parent_code kabupaten ini
120+
$region = Region::with(['child'])->find($id);
121+
122+
if ($region->child->count()) {
123+
return redirect('kabupaten')->with('error', 'Data gagal dihapus karena data ini menjadi induk dari kecamatan ' . $region->child->pluck('region_name')->join(', '));
124+
}
125+
126+
if (Region::destroy($id)) {
127+
return redirect('kabupaten')->with('success', 'Data berhasil dihapus');
128+
}
129+
130+
return redirect('kabupaten')->with('error', 'Data gagal dihapus');
131+
}
40132
}

app/Http/Controllers/Admin/Wilayah/ProvinsiController.php

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,43 @@
44

55
use App\Exports\WilayahProvinsiExport;
66
use App\Http\Controllers\Controller;
7+
use App\Http\Requests\RegionProvinsiRequest;
78
use App\Models\Region;
89
use Illuminate\Http\Request;
910
use Maatwebsite\Excel\Facades\Excel;
1011
use Yajra\DataTables\DataTables;
1112

1213
class ProvinsiController extends Controller
1314
{
14-
public function index()
15+
public function index(Request $request)
1516
{
17+
if ($request->excel) {
18+
$paramDatatable = json_decode($request->get('params'), 1);
19+
$request->merge($paramDatatable);
20+
}
21+
22+
if ($request->ajax() || $request->excel) {
23+
$query = DataTables::of(Region::provinsi());
24+
if ($request->excel) {
25+
$query->filtering();
26+
27+
return Excel::download(new WilayahProvinsiExport($query->results()), 'Wilayah-Provinsi.xlsx');
28+
}
29+
30+
return $query->addIndexColumn()
31+
->addColumn('action', function ($data) {
32+
$edit = '<a href="' . url('provinsi/' . $data->id . '/edit') . '" class="btn btn-sm btn-warning btn-sm"><i class="fas fa-pencil-alt"></i></a>';
33+
$delete = '<button data-href="' . url('provinsi/' . $data->id) . '" class="btn btn-sm btn-danger" data-toggle="modal" data-target="#confirm-delete"><i class="fas fa-trash"></i></button>';
34+
35+
return '<div class="btn btn-group">' . $edit . $delete . '</div>';
36+
})
37+
->editColumn('nama_provinsi', function ($data) {
38+
return $data->nama_provinsi_baru ?? $data->nama_provinsi;
39+
})
40+
->rawColumns(['action', 'nama_provinsi'])
41+
->make(true);
42+
}
43+
1644
return view('admin.wilayah.provinsi.index');
1745
}
1846

@@ -37,4 +65,62 @@ public function datatables(Request $request)
3765

3866
abort(404);
3967
}
68+
69+
public function create()
70+
{
71+
return view('admin.wilayah.provinsi.create');
72+
}
73+
74+
public function store(RegionProvinsiRequest $request)
75+
{
76+
$input = $request->all();
77+
$input['parent_code'] = 0;
78+
79+
if (Region::create($input)) {
80+
return redirect('provinsi')->with('success', 'Data berhasil disimpan');
81+
}
82+
83+
return back()->with('error', 'Data gagal disimpan');
84+
}
85+
86+
public function edit($id)
87+
{
88+
return view('admin.wilayah.provinsi.edit', [
89+
'provinsi' => Region::provinsi()->findOrFail($id),
90+
]);
91+
}
92+
93+
public function update(RegionProvinsiRequest $request, $id)
94+
{
95+
$input = $request->all();
96+
$provinsi = Region::provinsi()->find($id);
97+
98+
if ($provinsi->nama_provinsi != $input['region_name']) {
99+
$input['new_region_name'] = $input['region_name'];
100+
101+
unset($input['region_name']);
102+
}
103+
104+
if ($provinsi->update($input)) {
105+
return redirect('provinsi')->with('success', 'Data berhasil diubah');
106+
}
107+
108+
return back()->with('error', 'Data gagal diubah');
109+
}
110+
111+
public function destroy($id)
112+
{
113+
// pastikan tidak ada region dengan parent_code provinsi ini
114+
$region = Region::with(['child'])->find($id);
115+
116+
if ($region->child->count()) {
117+
return redirect('provinsi')->with('error', 'Data gagal dihapus karena data ini menjadi induk dari kabupaten ' . $region->child->pluck('region_name')->join(', '));
118+
}
119+
120+
if (Region::destroy($id)) {
121+
return redirect('provinsi')->with('success', 'Data berhasil dihapus');
122+
}
123+
124+
return redirect('provinsi')->with('error', 'Data gagal dihapus');
125+
}
40126
}

app/Http/Controllers/Api/WilayahController.php

Lines changed: 72 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use App\Models\Region;
88
use App\Models\Wilayah;
99
use Illuminate\Http\Request;
10+
use Illuminate\Support\Facades\DB;
1011

1112
class WilayahController extends Controller
1213
{
@@ -117,20 +118,77 @@ public function listWilayah(Request $request)
117118
$kabupaten = substr($request->kode, 0, 5);
118119
$kecamatan = $request->kode;
119120

120-
$desa = $this->wilayah
121-
->when(strlen($request->kode) == 8, function ($query) use ($request, $provinsi, $kabupaten, $kecamatan) {
122-
$query->listDesa($request, $provinsi, $kabupaten, $kecamatan);
123-
})
124-
->when(strlen($request->kode) == 5, function ($query) use ($request, $provinsi, $kabupaten) {
125-
$query->listKecamatan($request, $provinsi, $kabupaten);
126-
})
127-
->when(strlen($request->kode) == 2, function ($query) use ($request, $provinsi) {
128-
$query->listKabupaten($request, $provinsi);
129-
})
130-
->unless($request->kode, function ($query) use ($request) {
131-
$query->listProvinsi($request);
132-
})
133-
->paginate();
121+
// For provinces, kabupaten, and kecamatan, use Region model (tbl_regions)
122+
// For desa, use Wilayah model (kode_wilayah)
123+
124+
$kodeDesa = strlen($request->kode);
125+
126+
if ($kodeDesa == 8) {
127+
// List desa - use Wilayah model
128+
$desa = $this->wilayah->listDesa($request, $provinsi, $kabupaten, $kecamatan)->paginate();
129+
} elseif ($kodeDesa == 5) {
130+
// List kecamatan - use Region model
131+
$query = Region::select(
132+
'tbl_regions.id',
133+
'tbl_regions.region_code as kode_kec',
134+
DB::raw('COALESCE(tbl_regions.new_region_name, tbl_regions.region_name) as nama_kec'),
135+
'kab.region_code as kode_kab',
136+
'kab.region_name as nama_kab',
137+
'prov.region_code as kode_prov',
138+
'prov.region_name as nama_prov'
139+
)
140+
->join('tbl_regions as kab', 'tbl_regions.parent_code', '=', 'kab.region_code')
141+
->join('tbl_regions as prov', 'kab.parent_code', '=', 'prov.region_code')
142+
->where('kab.region_code', $kabupaten)
143+
->whereRaw('LENGTH(tbl_regions.parent_code) = 5')
144+
->when($request->filled('cari'), function ($query) use ($request) {
145+
$query->where(function ($q) use ($request) {
146+
$q->where('tbl_regions.region_name', 'like', "%{$request->cari}%")
147+
->orWhere('tbl_regions.new_region_name', 'like', "%{$request->cari}%");
148+
});
149+
})
150+
->orderBy('nama_kec', 'asc');
151+
152+
$desa = $query->paginate();
153+
} elseif ($kodeDesa == 2) {
154+
// List kabupaten - use Region model
155+
$query = Region::select(
156+
'tbl_regions.id',
157+
'tbl_regions.region_code as kode_kab',
158+
DB::raw('COALESCE(tbl_regions.new_region_name, tbl_regions.region_name) as nama_kab'),
159+
'prov.region_code as kode_prov',
160+
'prov.region_name as nama_prov'
161+
)
162+
->leftJoin('tbl_regions as prov', 'tbl_regions.parent_code', '=', 'prov.region_code')
163+
->where('prov.region_code', $provinsi)
164+
->whereRaw('LENGTH(tbl_regions.parent_code) = 2')
165+
->when($request->filled('cari'), function ($query) use ($request) {
166+
$query->where(function ($q) use ($request) {
167+
$q->where('tbl_regions.region_name', 'like', "%{$request->cari}%")
168+
->orWhere('tbl_regions.new_region_name', 'like', "%{$request->cari}%");
169+
});
170+
})
171+
->orderBy('nama_kab', 'asc');
172+
173+
$desa = $query->paginate();
174+
} else {
175+
// List provinsi - use Region model
176+
$query = Region::select(
177+
'id',
178+
'region_code as kode_prov',
179+
DB::raw('COALESCE(new_region_name, region_name) as nama_prov')
180+
)
181+
->where('parent_code', 0)
182+
->when($request->filled('cari'), function ($query) use ($request) {
183+
$query->where(function ($q) use ($request) {
184+
$q->where('region_name', 'like', "%{$request->cari}%")
185+
->orWhere('new_region_name', 'like', "%{$request->cari}%");
186+
});
187+
})
188+
->orderBy('nama_prov', 'asc');
189+
190+
$desa = $query->paginate();
191+
}
134192

135193
return response()->json([
136194
'results' => $desa->items(),
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
namespace App\Http\Requests;
4+
5+
use Illuminate\Foundation\Http\FormRequest;
6+
7+
class RegionKabupatenRequest extends FormRequest
8+
{
9+
/**
10+
* Determine if the user is authorized to make this request.
11+
*
12+
* @return bool
13+
*/
14+
public function authorize()
15+
{
16+
return true;
17+
}
18+
19+
/**
20+
* Get the validation rules that apply to the request.
21+
*
22+
* @return array
23+
*/
24+
public function rules()
25+
{
26+
return [
27+
'parent_code' => 'required|string|max:10',
28+
'region_code' => 'required|string|max:10|unique:tbl_regions,region_code,' . $this->route('kabupaten'),
29+
'region_name' => 'required|string|max:100',
30+
];
31+
}
32+
33+
/**
34+
* Get the error messages for the defined validation rules.
35+
*
36+
* @return array
37+
*/
38+
public function messages()
39+
{
40+
return [
41+
'parent_code.required' => 'Provinsi harus dipilih.',
42+
'region_code.required' => 'Kode kabupaten harus diisi.',
43+
'region_code.unique' => 'Kode kabupaten sudah ada.',
44+
'region_name.required' => 'Nama kabupaten harus diisi.',
45+
'region_name.max' => 'Nama kabupaten maksimal 100 karakter.',
46+
];
47+
}
48+
}

0 commit comments

Comments
 (0)