middleware('auth'); $this->middleware('admin'); } public function index() { $kriteria = Kriteria::orderBy('id','ASC')->paginate(10); $totalBobot = round(Kriteria::sum('bobot'), 2); return view('admin.kriteria.index', compact('kriteria' , 'totalBobot')); } public function store(Request $request) { try { // Validasi input $validator = Validator::make($request->all(), [ 'nama_kriteria' => 'required|string|unique:kriteria,nama_kriteria|max:255', 'attribut' => 'required|in:cost,benefit', 'bobot' => 'required|numeric|min:0|max:1' ], [ 'nama_kriteria.required' => 'Nama kriteria wajib diisi', 'nama_kriteria.unique' => 'Nama kriteria sudah digunakan', 'nama_kriteria.max' => 'Nama kriteria maksimal 255 karakter', 'attribut.required' => 'Attribut wajib dipilih', 'attribut.in' => 'Attribut harus benefit atau cost', 'bobot.required' => 'Bobot wajib diisi', 'bobot.numeric' => 'Bobot harus berupa angka', 'bobot.min' => 'Bobot minimal 0', 'bobot.max' => 'Bobot maksimal 1' ]); // Jika validasi gagal if ($validator->fails()) { return redirect()->back()->withErrors($validator)->withInput() ->with('error', 'Terdapat kesalahan dalam pengisian form. Data tidak disimpan.'); } // Hitung total bobot yang sudah ada $currentTotal = Kriteria::sum('bobot'); $newTotal = round($currentTotal + $request->bobot, 4); // Format untuk tampilan angka $formattedNewTotal = number_format($newTotal, 2); // Periksa konfirmasi dari user $isConfirmed = $request->confirmed == '1'; // Jika total bobot tidak sama dengan 1 dan belum ada konfirmasi if (($newTotal > 1 || $newTotal < 1) && !$isConfirmed) { return redirect()->back() ->withInput() ->with('warning', 'Total bobot akan menjadi ' . $formattedNewTotal . ' (tidak sama dengan 1). Konfirmasi terlebih dahulu.'); } // Simpan data kriteria ke database Kriteria::create([ 'nama_kriteria' => $request->nama_kriteria, 'attribut' => $request->attribut, 'bobot' => $request->bobot ]); return redirect()->route('kriteria.index')->with('success', 'Kriteria berhasil ditambahkan.'); } catch (\Throwable $e) { // Tangani error tak terduga return redirect()->back()->withInput()->with('error', 'Terjadi kesalahan saat menyimpan data: ' . $e->getMessage()); } } public function edit($id) { $kriteria = Kriteria::findOrFail($id); return view('admin.kriteria.edit', compact('kriteria')); } public function update(Request $request, $id) { $kriteria = Kriteria::findOrFail($id); $currentBobot = $kriteria->bobot; // Validasi input $validator = Validator::make($request->all(), [ 'nama_kriteria' => [ 'required', 'string', 'max:255', Rule::unique('kriteria')->ignore($kriteria->id) ], 'attribut' => 'required|in:cost,benefit', 'bobot' => 'required|numeric|min:0|max:1' ]); if ($validator->fails()) { return back()->withErrors($validator)->withInput(); } // Hitung total bobot setelah update $totalBobot = round(Kriteria::sum('bobot') - $currentBobot + $request->bobot, 4); $formattedTotal = number_format($totalBobot, 2); // Jika melebihi 1, warning tapi tetap update $kriteria->update([ 'nama_kriteria' => $request->nama_kriteria, 'attribut' => $request->attribut, 'bobot' => $request->bobot ]); if ($totalBobot == 1) { return redirect()->route('kriteria.index') ->with('success', 'Kriteria berhasil diperbarui. Total bobot sekarang adalah 1.'); } elseif ($totalBobot > 1) { return redirect()->route('kriteria.index') ->with('warning', 'Kriteria berhasil diperbarui. Total bobot sekarang adalah ' . $formattedTotal . ' (melebihi 1).'); } else { return redirect()->route('kriteria.index') ->with('warning', 'Kriteria berhasil diperbarui. Total bobot sekarang adalah ' . $formattedTotal . ' (kurang dari 1).'); } } public function destroy($id) { try { $kriteria = Kriteria::findOrFail($id); $kriteria->delete(); return response()->json([ 'success' => true, 'message' => 'Kriteria berhasil dihapus' ]); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'Gagal menghapus kriteria: ' . $e->getMessage() ], 500); } } public function downloadPDF() { setlocale(LC_ALL, 'IND'); $tanggal = Carbon::now()->formatLocalized('%A, %d %B %Y'); $kriteria = Kriteria::all(); $pdf = PDF::loadView('admin.kriteria.kriteria-pdf', compact('kriteria', 'tanggal')); $pdf->setPaper('A3', 'portrait'); return $pdf->stream('kriteria.pdf'); } }