Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ jobs:
- name: Import SQL file into MySQL
run: |
mysql -h 127.0.0.1 -P 3306 -u root -psecret testing_db < ./database/database_test.sql
mysql -h 127.0.0.1 -P 3306 -u root -psecret testing_db < ./database/update_view.sql

- name: Execute tests (Unit and Feature tests) via PHPUnit/Pest
env:
Expand Down
96 changes: 94 additions & 2 deletions app/Http/Controllers/Admin/Wilayah/KabupatenController.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,43 @@

use App\Exports\WilayahKabupatenExport;
use App\Http\Controllers\Controller;
use App\Http\Requests\RegionKabupatenRequest;
use App\Models\Region;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use Yajra\DataTables\DataTables;

class KabupatenController extends Controller
{
public function index()
public function index(Request $request)
{
if ($request->excel) {
$paramDatatable = json_decode($request->get('params'), 1);
$request->merge($paramDatatable);
}

if ($request->ajax() || $request->excel) {
$query = DataTables::of(Region::kabupaten());
if ($request->excel) {
$query->filtering();

return Excel::download(new WilayahKabupatenExport($query->results()), 'Wilayah-Kabupaten.xlsx');
}

return $query->addIndexColumn()
->addColumn('action', function ($data) {
$edit = '<a href="' . url('kabupaten/' . $data->id . '/edit') . '" class="btn btn-sm btn-warning btn-sm"><i class="fas fa-pencil-alt"></i></a>';
$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>';

return '<div class="btn btn-group">' . $edit . $delete . '</div>';
})
->editColumn('nama_kabupaten', function ($data) {
return $data->nama_kabupaten_baru ?? $data->nama_kabupaten;
})
->rawColumns(['action', 'nama_kabupaten'])
->make(true);
}

return view('admin.wilayah.kabupaten.index');
}

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

return $query->addIndexColumn()
->make(true);
->make(true);
}

abort(404);
}

public function create()
{
return view('admin.wilayah.kabupaten.create');
}

public function store(RegionKabupatenRequest $request)
{
$input = $request->all();

if (Region::create($input)) {
$inputchild = [
'region_code' => $input['region_code'] . '.00',
'parent_code' => $input['region_code'],
'deleted_at' => date('Y-m-d H:i:s'),
];
Region::create($inputchild);

return redirect('kabupaten')->with('success', 'Data berhasil disimpan');
}

return back()->with('error', 'Data gagal disimpan');
}

public function edit($id)
{
return view('admin.wilayah.kabupaten.edit', [
'kabupaten' => Region::kabupaten()->findOrFail($id),
]);
}

public function update(RegionKabupatenRequest $request, $id)
{
$input = $request->all();
$kabupaten = Region::kabupaten()->find($id);

if ($kabupaten->nama_kabupaten != $input['region_name']) {
$input['new_region_name'] = $input['region_name'];

unset($input['region_name']);
}

if ($kabupaten->update($input)) {
return redirect('kabupaten')->with('success', 'Data berhasil diubah');
}

return back()->with('error', 'Data gagal diubah');
}

public function destroy($id)
{
// pastikan tidak ada region dengan parent_code kabupaten ini
$region = Region::with(['child'])->find($id);

if ($region->child->count()) {
return redirect('kabupaten')->with('error', 'Data gagal dihapus karena data ini menjadi induk dari kecamatan ' . $region->child->pluck('region_name')->join(', '));
}

if (Region::destroy($id)) {
return redirect('kabupaten')->with('success', 'Data berhasil dihapus');
}

return redirect('kabupaten')->with('error', 'Data gagal dihapus');
}
}
95 changes: 94 additions & 1 deletion app/Http/Controllers/Admin/Wilayah/ProvinsiController.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,43 @@

use App\Exports\WilayahProvinsiExport;
use App\Http\Controllers\Controller;
use App\Http\Requests\RegionProvinsiRequest;
use App\Models\Region;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use Yajra\DataTables\DataTables;

class ProvinsiController extends Controller
{
public function index()
public function index(Request $request)
{
if ($request->excel) {
$paramDatatable = json_decode($request->get('params'), 1);
$request->merge($paramDatatable);
}

if ($request->ajax() || $request->excel) {
$query = DataTables::of(Region::provinsi());
if ($request->excel) {
$query->filtering();

return Excel::download(new WilayahProvinsiExport($query->results()), 'Wilayah-Provinsi.xlsx');
}

return $query->addIndexColumn()
->addColumn('action', function ($data) {
$edit = '<a href="' . url('provinsi/' . $data->id . '/edit') . '" class="btn btn-sm btn-warning btn-sm"><i class="fas fa-pencil-alt"></i></a>';
$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>';

return '<div class="btn btn-group">' . $edit . $delete . '</div>';
})
->editColumn('nama_provinsi', function ($data) {
return $data->nama_provinsi_baru ?? $data->nama_provinsi;
})
->rawColumns(['action', 'nama_provinsi'])
->make(true);
}

return view('admin.wilayah.provinsi.index');
}

Expand All @@ -37,4 +65,69 @@ public function datatables(Request $request)

abort(404);
}

public function create()
{
return view('admin.wilayah.provinsi.create');
}

public function store(RegionProvinsiRequest $request)
{
$input = $request->all();
$input['parent_code'] = 0;

if (Region::create($input)) {
$inputchild = [
'region_code' => $input['region_code'] . '.00',
'parent_code' => $input['region_code'],
'deleted_at' => date('Y-m-d H:i:s'),
];
Region::create($inputchild);

return redirect('provinsi')->with('success', 'Data berhasil disimpan');
}

return back()->with('error', 'Data gagal disimpan');
}

public function edit($id)
{
return view('admin.wilayah.provinsi.edit', [
'provinsi' => Region::provinsi()->findOrFail($id),
]);
}

public function update(RegionProvinsiRequest $request, $id)
{
$input = $request->all();
$provinsi = Region::provinsi()->find($id);

if ($provinsi->nama_provinsi != $input['region_name']) {
$input['new_region_name'] = $input['region_name'];

unset($input['region_name']);
}

if ($provinsi->update($input)) {
return redirect('provinsi')->with('success', 'Data berhasil diubah');
}

return back()->with('error', 'Data gagal diubah');
}

public function destroy($id)
{
// pastikan tidak ada region dengan parent_code provinsi ini
$region = Region::with(['child'])->find($id);

if ($region->child->count()) {
return redirect('provinsi')->with('error', 'Data gagal dihapus karena data ini menjadi induk dari kabupaten ' . $region->child->pluck('region_name')->join(', '));
}

if (Region::destroy($id)) {
return redirect('provinsi')->with('success', 'Data berhasil dihapus');
}

return redirect('provinsi')->with('error', 'Data gagal dihapus');
}
}
84 changes: 70 additions & 14 deletions app/Http/Controllers/Api/WilayahController.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use App\Models\Region;
use App\Models\Wilayah;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class WilayahController extends Controller
{
Expand Down Expand Up @@ -117,20 +118,75 @@ public function listWilayah(Request $request)
$kabupaten = substr($request->kode, 0, 5);
$kecamatan = $request->kode;

$desa = $this->wilayah
->when(strlen($request->kode) == 8, function ($query) use ($request, $provinsi, $kabupaten, $kecamatan) {
$query->listDesa($request, $provinsi, $kabupaten, $kecamatan);
})
->when(strlen($request->kode) == 5, function ($query) use ($request, $provinsi, $kabupaten) {
$query->listKecamatan($request, $provinsi, $kabupaten);
})
->when(strlen($request->kode) == 2, function ($query) use ($request, $provinsi) {
$query->listKabupaten($request, $provinsi);
})
->unless($request->kode, function ($query) use ($request) {
$query->listProvinsi($request);
})
->paginate();
// For provinces, kabupaten, and kecamatan, use Region model (tbl_regions)
// For desa, use Wilayah model (kode_wilayah)

if (strlen($request->kode) == 8) {
// List desa - use Wilayah model
$desa = $this->wilayah->listDesa($request, $provinsi, $kabupaten, $kecamatan)->paginate();
} elseif (strlen($request->kode) == 5) {
// List kecamatan - use Region model
$query = Region::select(
'tbl_regions.id',
'tbl_regions.region_code as kode_kec',
DB::raw('COALESCE(tbl_regions.new_region_name, tbl_regions.region_name) as nama_kec'),
'kab.region_code as kode_kab',
'kab.region_name as nama_kab',
'prov.region_code as kode_prov',
'prov.region_name as nama_prov'
)
->join('tbl_regions as kab', 'tbl_regions.parent_code', '=', 'kab.region_code')
->join('tbl_regions as prov', 'kab.parent_code', '=', 'prov.region_code')
->where('kab.region_code', $kabupaten)
->whereRaw('LENGTH(tbl_regions.parent_code) = 5')
->when($request->filled('cari'), function ($query) use ($request) {
$query->where(function ($q) use ($request) {
$q->where('tbl_regions.region_name', 'like', "%{$request->cari}%")
->orWhere('tbl_regions.new_region_name', 'like', "%{$request->cari}%");
});
})
->orderBy('nama_kec', 'asc');

$desa = $query->paginate();
} elseif (strlen($request->kode) == 2) {
// List kabupaten - use Region model
$query = Region::select(
'tbl_regions.id',
'tbl_regions.region_code as kode_kab',
DB::raw('COALESCE(tbl_regions.new_region_name, tbl_regions.region_name) as nama_kab'),
'prov.region_code as kode_prov',
'prov.region_name as nama_prov'
)
->leftJoin('tbl_regions as prov', 'tbl_regions.parent_code', '=', 'prov.region_code')
->where('prov.region_code', $provinsi)
->whereRaw('LENGTH(tbl_regions.parent_code) = 2')
->when($request->filled('cari'), function ($query) use ($request) {
$query->where(function ($q) use ($request) {
$q->where('tbl_regions.region_name', 'like', "%{$request->cari}%")
->orWhere('tbl_regions.new_region_name', 'like', "%{$request->cari}%");
});
})
->orderBy('nama_kab', 'asc');

$desa = $query->paginate();
} else {
// List provinsi - use Region model
$query = Region::select(
'id',
'region_code as kode_prov',
DB::raw('COALESCE(new_region_name, region_name) as nama_prov')
)
->where('parent_code', 0)
->when($request->filled('cari'), function ($query) use ($request) {
$query->where(function ($q) use ($request) {
$q->where('region_name', 'like', "%{$request->cari}%")
->orWhere('new_region_name', 'like', "%{$request->cari}%");
});
})
->orderBy('nama_prov', 'asc');

$desa = $query->paginate();
}

return response()->json([
'results' => $desa->items(),
Expand Down
48 changes: 48 additions & 0 deletions app/Http/Requests/RegionKabupatenRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class RegionKabupatenRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}

/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'parent_code' => 'required|string|max:10',
'region_code' => 'required|string|max:10|unique:tbl_regions,region_code,' . $this->route('kabupaten'),
'region_name' => 'required|string|max:100',
];
}

/**
* Get the error messages for the defined validation rules.
*
* @return array
*/
public function messages()
{
return [
'parent_code.required' => 'Provinsi harus dipilih.',
'region_code.required' => 'Kode kabupaten harus diisi.',
'region_code.unique' => 'Kode kabupaten sudah ada.',
'region_name.required' => 'Nama kabupaten harus diisi.',
'region_name.max' => 'Nama kabupaten maksimal 100 karakter.',
];
}
}
Loading