validate([ 'name' => 'required|string|max:255', 'slug' => 'required|string|max:255|unique:roles,slug', ]); $role = Role::create([ 'name' => $request->name, 'slug' => str()->slug($request->slug), // Memastikan format slug benar ]); // Audit Trail: Mencatat pembuatan role baru dengan menyertakan field 'model' if (class_exists('\App\Models\ActivityLog')) { \App\Models\ActivityLog::create([ 'user_id' => auth()->id(), 'action' => 'CREATE_ROLE', 'model' => 'Role', // Ditambahkan untuk memenuhi constraint database 'description' => 'Menambahkan role baru: ' . $role->name, ]); } // Setelah role dibuat, arahkan ke halaman edit untuk mengatur izin modul return redirect()->route('admin.roles.edit', $role->id) ->with('success', 'Role berhasil dibuat. Silakan atur hak akses modul.'); } public function edit($id) { $role = Role::with('permissions')->findOrFail($id); /** * Daftar modul disesuaikan dengan Sidebar (image_8b75a1.png) * Menambahkan modul Logistik & Intelligence yang sebelumnya belum terdaftar */ $modules = [ // --- OPERASIONAL --- 'cats' => 'Data Kucing', 'matting' => 'Matting Cat (Breeding)', // --- KESEHATAN --- 'medical_insights' => 'Medical Insight', 'treatments' => 'Rekam Medis', // --- LOGISTIK (LENGKAP) --- 'medicines' => 'Obat & Vitamin', 'foods' => 'Stok Makanan', 'supplies' => 'Perlengkapan', 'categories' => 'Master Kategori', // --- INTELLIGENCE --- 'reports' => 'Pusat Laporan', 'matting_reports' => 'Laporan Breeding', // --- KONFIGURASI --- 'users' => 'Manajemen User', 'roles' => 'Hak Akses (Role)', 'logs' => 'Audit Trail (Log)', 'settings' => 'Pengaturan Sistem' ]; // Menambahkan prefix 'pages.' return view('pages.admin.roles.edit', compact('role', 'modules')); } /** * Menyimpan/Sync Matriks Permission */ public function update(Request $request, $id) { $role = Role::findOrFail($id); DB::transaction(function () use ($request, $role) { // Hapus permission lama (Sync) $role->permissions()->delete(); // Simpan permission baru jika ada input perms if ($request->has('perms')) { foreach ($request->perms as $moduleSlug => $actions) { $role->permissions()->create([ 'role_id' => $role->id, 'module_slug' => $moduleSlug, 'can_read' => isset($actions['read']) ? 1 : 0, 'can_create' => isset($actions['create']) ? 1 : 0, 'can_update' => isset($actions['update']) ? 1 : 0, 'can_delete' => isset($actions['delete']) ? 1 : 0, ]); } } }); // Pencatatan Log Audit (Audit Trail) dengan field 'model' agar tidak error if (class_exists('\App\Models\ActivityLog')) { \App\Models\ActivityLog::create([ 'user_id' => auth()->id(), 'action' => 'UPDATE_PERMISSION', 'model' => 'Role', // Ditambahkan untuk sinkronisasi database 'description' => 'Mengubah hak akses untuk role: ' . $role->name, ]); } return redirect()->back()->with('success', 'Hak akses ' . $role->name . ' berhasil diperbarui.'); } public function destroy(Role $role) { // Cek izin di matriks Role Management \Illuminate\Support\Facades\Gate::authorize('check-access', ['roles', 'delete']); // Keamanan: Role Admin tidak boleh dihapus if ($role->slug === 'admin') { return back()->with('error', 'Akses Ditolak! Role Administrator utama tidak dapat dihapus.'); } $roleName = $role->name; // Audit Trail if (class_exists('\App\Models\ActivityLog')) { \App\Models\ActivityLog::create([ 'user_id' => auth()->id(), 'action' => 'DELETED_ROLE', 'model' => 'Role', 'description' => "Menghapus role: $roleName", ]); } $role->delete(); return redirect()->route('admin.roles.index')->with('success', "Role $roleName berhasil dihapus."); } }