input('per_page', 10); // Gunakan orderBy untuk mengurutkan, lalu paginate dan appends $kriterias = Kriteria::query() ->orderBy('kode', 'asc') ->paginate($perPage) ->appends($request->query()); return view('kriteria.index', compact('kriterias', 'perPage')); } /** * Method untuk menampilkan form tambah dengan Kode Otomatis */ public function create() { $lastKriteria = Kriteria::orderBy('id', 'desc')->first(); if ($lastKriteria) { $lastNumber = (int) substr($lastKriteria->kode, 1); $nextNumber = $lastNumber + 1; } else { $nextNumber = 1; } $nextKode = 'C' . $nextNumber; return view('kriteria.create', compact('nextKode')); } /** * Method untuk menyimpan data baru sekaligus sinkronisasi data warga */ public function store(Request $request) { $request->validate([ 'kode' => 'required|string|max:5|unique:kriterias,kode', 'nama' => 'required|string|max:255', 'nama_sub_default' => 'required|string|max:255', // Validasi sub-kriteria default ], [ 'kode.unique' => 'Kode Kriteria sudah digunakan!', 'kode.required' => 'Kode harus diisi', 'nama.required' => 'Nama Kriteria harus diisi', 'nama_sub_default.required' => 'Nama Sub-Kriteria awal wajib diisi untuk sinkronisasi warga.', ]); try { // Menggunakan Transaksi agar jika salah satu proses gagal, database tidak berantakan DB::transaction(function () use ($request) { // 1. Simpan Kriteria Baru $kriteria = Kriteria::create([ 'kode' => strtoupper($request->kode), 'nama' => $request->nama, 'bobot_global' => 0, ]); // 2. Buat satu Sub-Kriteria Default (Nilai terendah/awal) // Kode formatnya S.C1.1 $subDefault = SubKriteria::create([ 'kriteria_id' => $kriteria->id, 'kode' => 'S.' . $kriteria->kode . '.1', 'nama_sub' => $request->nama_sub_default, 'nilai_acuan' => 1, // Default nilai acuan terendah 'bobot_lokal' => 0, ]); // 3. Tarik semua warga yang sudah ada $allWarga = Warga::all(); // 4. Masukkan data kriteria baru ini ke setiap warga di tabel warga_details // Ini memastikan warga lama tetap punya data lengkap saat perhitungan F-AHP foreach ($allWarga as $warga) { WargaDetail::create([ 'warga_id' => $warga->id, 'kriteria_id' => $kriteria->id, 'sub_kriteria_id' => $subDefault->id, 'nilai_asli' => 0, ]); } }); return redirect()->route('kriteria.index') ->with('success', 'Kriteria berhasil ditambah dan disinkronkan ke seluruh data warga!'); } catch (\Exception $e) { // Jika ada error, kembali ke form dengan pesan error return redirect()->back() ->with('error', 'Gagal menyimpan data: ' . $e->getMessage()) ->withInput(); } } public function edit($id) { $kriteria = Kriteria::findOrFail($id); return view('kriteria.edit', compact('kriteria')); } public function update(Request $request, $id) { $request->validate([ 'nama' => 'required|string|max:255', ]); $kriteria = Kriteria::findOrFail($id); $kriteria->update(['nama' => $request->nama]); return redirect()->route('kriteria.index')->with('success', 'Kriteria berhasil diperbarui!'); } // public function destroy($id) // { // // Catatan: Pastikan di Model Kriteria sudah diatur OnDelete Cascade // // atau hapus manual relasi terkait jika tidak menggunakan cascade. // $kriteria = Kriteria::findOrFail($id); // $kriteria->delete(); // return redirect()->route('kriteria.index')->with('success', 'Kriteria berhasil dihapus!'); // } public function destroy($id) { // =================================================================== // 1. PAGAR PELINDUNG ARSIP // Cek apakah sistem sudah pernah menghasilkan riwayat Hasil Seleksi // =================================================================== $adaHasilSeleksi = DB::table('hasil_seleksis')->count(); if ($adaHasilSeleksi > 0) { return redirect()->back()->with('error', 'Gagal! Kriteria tidak bisa dihapus karena sudah menjadi arsip riwayat Hasil Seleksi. Silakan Edit (Update) saja namanya jika ada perubahan aturan.'); } // ingat jika belum ada riwayat ya lanjut proses seperti biasa // Menggunakan DB Transaction untuk memastikan integritas data DB::beginTransaction(); try { $kriteria = Kriteria::findOrFail($id); // 1. Hapus data perbandingan pakar yang melibatkan kriteria ini // Jika tidak dihapus, data ini akan menjadi 'sampah' dan merusak perhitungan matriks DB::table('perbandingans') ->where('kriteria_kiri_id', $id) ->orWhere('kriteria_kanan_id', $id) ->delete(); // 2. Hapus data detail warga yang terkait dengan kriteria ini // (Langkah antisipasi jika di database belum terset OnDelete Cascade) DB::table('warga_details')->where('kriteria_id', $id)->delete(); // 3. Hapus kriteria utama $kriteria->delete(); // 4. Hitung ulang bobot global untuk kriteria yang tersisa // Kita memanggil fungsi updateWeights() dari PerbandinganController secara dinamis $perbandinganController = new \App\Http\Controllers\PerbandinganController(); $perbandinganController->updateWeights(); DB::commit(); return redirect()->route('kriteria.index') ->with('success', 'Kriteria berhasil dihapus dan bobot global telah diperbarui secara otomatis!'); } catch (\Exception $e) { DB::rollBack(); return redirect()->route('kriteria.index') ->with('error', 'Gagal menghapus kriteria: ' . $e->getMessage()); } } }