139 lines
5.2 KiB
PHP
139 lines
5.2 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Warga;
|
|
use App\Models\Wilayah;
|
|
use Illuminate\Http\Request;
|
|
use App\Exports\WargaExport;
|
|
use Maatwebsite\Excel\Facades\Excel;
|
|
|
|
class WargaController extends Controller
|
|
{
|
|
public function export()
|
|
{
|
|
$hasData = Warga::exists();
|
|
if (!$hasData) {
|
|
return back()->with('error', 'Gagal: Belum ada data warga di database untuk diexport.');
|
|
}
|
|
return Excel::download(new WargaExport, 'Data-Warga.xlsx');
|
|
}
|
|
|
|
public function index()
|
|
{
|
|
$warga = Warga::with('wilayah')->latest()->paginate(10);
|
|
return view('admin.warga.index', compact('warga'));
|
|
}
|
|
|
|
public function create()
|
|
{
|
|
$wilayah = Wilayah::orderBy('dusun')->orderBy('rw')->get();
|
|
return view('admin.warga.create', compact('wilayah'));
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
$request->validate([
|
|
'nik' => 'required|digits:16|unique:warga,nik',
|
|
'nama' => 'required|string|max:100',
|
|
'alamat' => 'required|string',
|
|
'wilayah_id' => 'required|exists:wilayah,id',
|
|
'rt' => 'nullable|string|max:5',
|
|
'no_telp' => 'nullable|string|max:15',
|
|
], [
|
|
'nik.required' => 'NIK wajib diisi.',
|
|
'nik.digits' => 'NIK harus berupa angka dengan panjang tepat 16 digit.',
|
|
'nik.unique' => 'NIK sudah terdaftar di sistem.',
|
|
'nama.required' => 'Nama lengkap wajib diisi.',
|
|
'nama.string' => 'Nama lengkap harus berupa teks.',
|
|
'nama.max' => 'Nama lengkap maksimal 100 karakter.',
|
|
'alamat.required' => 'Alamat wajib diisi.',
|
|
'wilayah_id.required' => 'Wilayah wajib dipilih.',
|
|
'wilayah_id.exists' => 'Wilayah yang dipilih tidak valid.',
|
|
]);
|
|
|
|
// Ambil koordinat & info dari wilayah yang dipilih
|
|
$wilayah = Wilayah::findOrFail($request->wilayah_id);
|
|
|
|
Warga::create([
|
|
'nik' => $request->nik,
|
|
'nama' => $request->nama,
|
|
'alamat' => $request->alamat,
|
|
'wilayah_id' => $wilayah->id,
|
|
'dusun' => $wilayah->dusun,
|
|
'rw' => $wilayah->rw,
|
|
'rt' => $request->rt,
|
|
'no_telp' => $request->no_telp,
|
|
'latitude' => $wilayah->latitude,
|
|
'longitude' => $wilayah->longitude,
|
|
// ✅ FIX: Warga baru SELALU aktif (tidak ada checkbox di form create)
|
|
'is_aktif' => true,
|
|
]);
|
|
|
|
return redirect()->route('admin.warga.index')
|
|
->with('success', 'Data warga berhasil ditambahkan.');
|
|
}
|
|
|
|
public function show(Warga $warga)
|
|
{
|
|
return view('admin.warga.show', compact('warga'));
|
|
}
|
|
|
|
public function edit(Warga $warga)
|
|
{
|
|
$wilayah = Wilayah::orderBy('dusun')->orderBy('rw')->get();
|
|
return view('admin.warga.edit', compact('warga', 'wilayah'));
|
|
}
|
|
|
|
public function update(Request $request, Warga $warga)
|
|
{
|
|
$request->validate([
|
|
'nik' => 'required|digits:16|unique:warga,nik,' . $warga->id,
|
|
'nama' => 'required|string|max:100',
|
|
'alamat' => 'required|string',
|
|
'wilayah_id' => 'required|exists:wilayah,id',
|
|
'rt' => 'nullable|string|max:5',
|
|
'no_telp' => 'nullable|string|max:15',
|
|
], [
|
|
'nik.required' => 'NIK wajib diisi.',
|
|
'nik.digits' => 'NIK harus berupa angka dengan panjang tepat 16 digit.',
|
|
'nik.unique' => 'NIK sudah terdaftar di sistem.',
|
|
'nama.required' => 'Nama lengkap wajib diisi.',
|
|
'nama.string' => 'Nama lengkap harus berupa teks.',
|
|
'nama.max' => 'Nama lengkap maksimal 100 karakter.',
|
|
'alamat.required' => 'Alamat wajib diisi.',
|
|
'wilayah_id.required' => 'Wilayah wajib dipilih.',
|
|
'wilayah_id.exists' => 'Wilayah yang dipilih tidak valid.',
|
|
]);
|
|
|
|
$wilayah = Wilayah::findOrFail($request->wilayah_id);
|
|
|
|
$warga->update([
|
|
'nik' => $request->nik,
|
|
'nama' => $request->nama,
|
|
'alamat' => $request->alamat,
|
|
'wilayah_id' => $wilayah->id,
|
|
'dusun' => $wilayah->dusun,
|
|
'rw' => $wilayah->rw,
|
|
'rt' => $request->rt,
|
|
'no_telp' => $request->no_telp,
|
|
'latitude' => $wilayah->latitude,
|
|
'longitude' => $wilayah->longitude,
|
|
// ✅ FIX BUG: Checkbox tidak tercentang = null, bukan false
|
|
// Gunakan has() untuk cek apakah checkbox ada di request
|
|
'is_aktif' => $request->has('is_aktif') ? true : false,
|
|
]);
|
|
|
|
return redirect()->route('admin.warga.index')
|
|
->with('success', 'Data warga berhasil diperbarui.');
|
|
}
|
|
|
|
public function destroy(Warga $warga)
|
|
{
|
|
$warga->delete();
|
|
return redirect()->route('admin.warga.index')
|
|
->with('success', 'Data warga berhasil dihapus.');
|
|
}
|
|
}
|