MIF_E31231754/app/Http/Controllers/Admin/WargaController.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.');
}
}