MIF_E31230680/app/Http/Controllers/KriteriaController.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());
}
}
}