when(request('penyakit_id'), fn($q) => $q->where('id_penyakit', request('penyakit_id')) ) ->when(request('search'), fn($q) => $q->where('kode_rule', 'like', '%' . request('search') . '%') ) ->orderBy('kode_rule') ->paginate(15); $semuaPenyakit = Penyakit::orderBy('kode')->get(); return view('admin.rule.index', compact('rules', 'semuaPenyakit')); } // Tampilkan form tambah rule public function create() { $penyakit = Penyakit::orderBy('kode')->get(); $gejala = Gejala::orderBy('kode')->get(); return view('admin.rule.form', compact('penyakit', 'gejala')); } // Simpan rule baru public function store(Request $request) { $request->validate([ 'id_penyakit' => 'required|exists:tbl_penyakit,id', 'id_gejala' => 'required|exists:tbl_gejala,id', 'nilai_mb' => 'required|numeric|min:0|max:1', 'nilai_md' => 'required|numeric|min:0|max:1', ], [ 'id_penyakit.required' => 'Pilih penyakit terlebih dahulu.', 'id_gejala.required' => 'Pilih gejala terlebih dahulu.', 'nilai_mb.required' => 'Nilai MB wajib diisi.', 'nilai_md.required' => 'Nilai MD wajib diisi.', ]); // Cek kombinasi penyakit-gejala sudah ada $sudahAda = Rule::where('id_penyakit', $request->id_penyakit) ->where('id_gejala', $request->id_gejala) ->exists(); if ($sudahAda) { return back()->withErrors(['id_gejala' => 'Rule untuk kombinasi penyakit dan gejala ini sudah ada.']); } // Hitung CF dan nilai pakar otomatis $mb = (float) $request->nilai_mb; $md = (float) $request->nilai_md; $cf = round($mb - $md, 4); $pakar = $this->nilaiPakarDariCF($cf); // Auto-generate kode rule jika kosong $kodeRule = $request->kode_rule; if (empty($kodeRule)) { $lastRule = Rule::orderByDesc('id')->first(); $nextNum = $lastRule ? (intval(substr($lastRule->kode_rule, 1)) + 1) : 1; $kodeRule = 'R' . str_pad($nextNum, 3, '0', STR_PAD_LEFT); } Rule::create([ 'kode_rule' => strtoupper($kodeRule), 'id_penyakit' => $request->id_penyakit, 'id_gejala' => $request->id_gejala, 'nilai_mb' => $mb, 'nilai_md' => $md, 'nilai_cf' => $cf, 'nilai_pakar' => $pakar, ]); return redirect()->route('admin.rule.index') ->with('success', 'Rule "' . $kodeRule . '" berhasil ditambahkan.'); } // Tampilkan form edit rule public function edit(Rule $rule) { $penyakit = Penyakit::orderBy('kode')->get(); $gejala = Gejala::orderBy('kode')->get(); return view('admin.rule.form', compact('rule', 'penyakit', 'gejala')); } // Update rule public function update(Request $request, Rule $rule) { $request->validate([ 'id_penyakit' => 'required|exists:tbl_penyakit,id', 'id_gejala' => 'required|exists:tbl_gejala,id', 'nilai_mb' => 'required|numeric|min:0|max:1', 'nilai_md' => 'required|numeric|min:0|max:1', ]); // Hitung CF dan nilai pakar otomatis $mb = (float) $request->nilai_mb; $md = (float) $request->nilai_md; $cf = round($mb - $md, 4); $pakar = $this->nilaiPakarDariCF($cf); $rule->update([ 'id_penyakit' => $request->id_penyakit, 'id_gejala' => $request->id_gejala, 'nilai_mb' => $mb, 'nilai_md' => $md, 'nilai_cf' => $cf, 'nilai_pakar' => $pakar, ]); return redirect()->route('admin.rule.index') ->with('success', 'Rule "' . $rule->kode_rule . '" berhasil diperbarui.'); } // Hapus rule public function destroy(Rule $rule) { $kode = $rule->kode_rule; $rule->delete(); return redirect()->route('admin.rule.index') ->with('success', 'Rule "' . $kode . '" berhasil dihapus.'); } }