190 lines
6.9 KiB
PHP
190 lines
6.9 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Kriteria;
|
|
use App\Models\SubKriteria;
|
|
use App\Models\Warga;
|
|
use App\Models\WargaDetail;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class KriteriaController extends Controller
|
|
{
|
|
public function index(Request $request)
|
|
{
|
|
// Tangkap request 'per_page', default-nya 10
|
|
$perPage = $request->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());
|
|
}
|
|
}
|
|
}
|