diff --git a/manajemen_mp/app/Exports/AnggotaExport.php b/manajemen_mp/app/Exports/AnggotaExport.php index 40b7e22..550ad56 100644 --- a/manajemen_mp/app/Exports/AnggotaExport.php +++ b/manajemen_mp/app/Exports/AnggotaExport.php @@ -13,7 +13,7 @@ class AnggotaExport implements FromCollection, WithHeadings, WithMapping, Should public function collection() { // Ambil data Anggota dengan relasi kolat dan user (untuk email) - return Anggota::whereHas('role', function($query) { + return Anggota::whereHas('roles', function($query) { $query->where('nama_role', 'Anggota'); })->with(['kolat', 'user'])->get(); } diff --git a/manajemen_mp/app/Http/Controllers/AnggotaController.php b/manajemen_mp/app/Http/Controllers/AnggotaController.php index f760285..a8a2170 100644 --- a/manajemen_mp/app/Http/Controllers/AnggotaController.php +++ b/manajemen_mp/app/Http/Controllers/AnggotaController.php @@ -18,11 +18,12 @@ class AnggotaController extends Controller { // 1. Menampilkan Daftar Anggota public function anggota() + { // Filter data: Ambil anggota yang relasi 'role'-nya bernama 'Anggota' - $data_anggota = Anggota::whereHas('role', function($query) { + $data_anggota = Anggota::whereHas('roles', function($query) { $query->where('nama_role', 'Anggota'); - })->with(['kolat', 'role']) + })->with(['kolat', 'roles']) ->latest() ->get(); @@ -61,12 +62,11 @@ public function store(Request $request) $user = User::create([ 'email' => $request->email, 'password' => Hash::make('tapakmp123'), // Password default - 'role_id' => $request->role_id, ]); // B. Cari nama jabatan berdasarkan role $role = Role::find($request->role_id); - $nama_jabatan = strtolower($role->nama_role); + $nama_jabatan = $role ? strtolower($role->nama_role) : 'anggota'; // C. Logika No Induk (JB-001) $terakhir = Anggota::orderBy('id', 'desc')->first(); @@ -74,11 +74,10 @@ public function store(Request $request) $no_induk_baru = "JB-" . $nomor_urut; // D. Simpan Profil di tabel Anggotas - Anggota::create([ + $anggota = Anggota::create([ 'user_id' => $user->id, 'no_induk' => $no_induk_baru, 'nama_lengkap' => $request->nama_lengkap, - 'role_id' => $request->role_id, 'jenis_kelamin' => $request->jenis_kelamin, 'tempat_lahir' => $request->tempat_lahir, 'tgl_lahir' => $request->tgl_lahir, @@ -92,6 +91,8 @@ public function store(Request $request) 'status' => 'Aktif', // Input admin otomatis aktif ]); + $anggota->roles()->attach($request->role_id); + DB::commit(); return redirect()->route('anggota.anggota') ->with('success', 'Data berhasil ditambah! Password login: tapakmp123'); @@ -106,7 +107,7 @@ public function store(Request $request) // 4. Menampilkan Form Edit public function edit($id) { - $anggota = Anggota::with('user')->findOrFail($id); + $anggota = Anggota::with(['user', 'roles'])->findOrFail($id); $data_kolat = Kolat::all(); // Ambil daftar kolat lagi untuk pilihan saat edit $data_role = Role::all(); @@ -134,18 +135,19 @@ public function update(Request $request, $id) // A. Update tabel User (email & role) $user->update([ 'email' => $request->email, - 'role_id' => $request->role_id ]); // B. Update jabatan berdasarkan role baru $role = Role::find($request->role_id); - $nama_jabatan = strtolower($role->nama_role); + $nama_jabatan = $role ? strtolower($role->nama_role) : 'anggota'; // C. Update tabel Anggota - $data_anggota = $request->all(); + // $data_anggota = $request->all(); + $data_anggota = $request->except(['email', 'role_id', '_token', '_method']); $data_anggota['jabatan'] = $nama_jabatan; $anggota->update($data_anggota); + $anggota->roles()->sync([$request->role_id]); DB::commit(); return redirect()->route('anggota.anggota') @@ -166,7 +168,7 @@ public function exportExcel() public function exportPdf() { - $data_anggota = Anggota::whereHas('role', function($query) { + $data_anggota = Anggota::whereHas('roles', function($query) { $query->where('nama_role', 'Anggota'); })->with(['kolat', 'user'])->get(); diff --git a/manajemen_mp/app/Http/Controllers/AuthController.php b/manajemen_mp/app/Http/Controllers/AuthController.php index 936755d..632c9e2 100644 --- a/manajemen_mp/app/Http/Controllers/AuthController.php +++ b/manajemen_mp/app/Http/Controllers/AuthController.php @@ -44,13 +44,32 @@ public function login(Request $request) $request->session()->regenerate(); // 2. Ambil Nama Role (samakan logikanya dengan Middleware) + // $roleName = null; + // if ($user->role) { + // $roleName = $user->role->nama_role; + // } elseif ($user->anggota && $user->anggota->role) { + // $roleName = $user->anggota->role->nama_role; + // } + $roleName = null; - if ($user->role) { - $roleName = $user->role->nama_role; - } elseif ($user->anggota && $user->anggota->role) { - $roleName = $user->anggota->role->nama_role; + $anggota = $user->anggota; + + if ($anggota) { + // Cek apakah dia punya role Pengurus + if ($anggota->roles->contains('nama_role', 'Pengurus')) { + $roleName = 'Pengurus'; + } + // Kalau bukan Pengurus, cek apakah dia Pelatih + elseif ($anggota->roles->contains('nama_role', 'Pelatih')) { + $roleName = 'Pelatih'; + } + // Kalau bukan keduanya, berarti Anggota biasa + elseif ($anggota->roles->contains('nama_role', 'Anggota')) { + $roleName = 'Anggota'; + } } + // 3. Logika Pengarahan (Redirect) berdasarkan String Role if ($roleName === 'Anggota') { return redirect()->route('anggota.dashboard')->with('success', 'Selamat datang, Anggota!'); @@ -110,7 +129,7 @@ public function register(Request $request) $user = User::create([ 'email' => $request->email, 'password' => Hash::make($request->password), - 'role_id' => $role_id, + // 'role_id' => $role_id, ]); // 3. Logika Penomoran Induk JB-xxx @@ -119,11 +138,11 @@ public function register(Request $request) $no_induk_baru = "JB-" . $nomor_urut; // 4. Buat Profil Anggota - Anggota::create([ + $anggota =Anggota::create([ 'user_id' => $user->id, 'no_induk' => $no_induk_baru, 'nama_lengkap' => $request->nama_lengkap, - 'role_id' => $role_id, + // 'role_id' => $role_id, 'jenis_kelamin' => $request->jenis_kelamin, 'tempat_lahir' => $request->tempat_lahir, 'tgl_lahir' => $request->tgl_lahir, @@ -137,6 +156,8 @@ public function register(Request $request) 'status' => 'Non-Aktif', // Default sesuai permintaanmu ]); + $anggota->roles()->attach($role_id); + DB::commit(); return redirect()->route('login')->with('success', 'Registrasi Berhasil! Akun Anda akan segera diverifikasi oleh Admin.'); diff --git a/manajemen_mp/app/Http/Controllers/DashboardController.php b/manajemen_mp/app/Http/Controllers/DashboardController.php index 1b3dcb0..48d1b0a 100644 --- a/manajemen_mp/app/Http/Controllers/DashboardController.php +++ b/manajemen_mp/app/Http/Controllers/DashboardController.php @@ -20,17 +20,21 @@ public function index() // // Menghitung jumlah Kolat yang terdaftar $total_kolat = Kolat::count(); - $roleAnggota = Role::where('nama_role', 'Anggota')->first(); - $rolePelatih = Role::where('nama_role', 'Pelatih')->first(); + // $roleAnggota = Role::where('nama_role', 'Anggota')->first(); + // $rolePelatih = Role::where('nama_role', 'Pelatih')->first(); // 2. Hitung jumlah "Anggota" (Hanya yang ber-role 'Anggota' DAN berstatus 'Aktif') $total_anggota_aktif = Anggota::where('status', 'Aktif') - ->where('role_id', $roleAnggota->id) + ->whereHas('roles', function($q) { + $q->where('nama_role', 'Anggota'); + }) ->count(); // 3. Hitung jumlah "Pelatih" (Hanya yang ber-role 'Pelatih' DAN berstatus 'Aktif') $total_pelatih = Anggota::where('status', 'Aktif') - ->where('role_id', $rolePelatih->id) + ->whereHas('roles', function($q) { + $q->where('nama_role', 'Pelatih'); + }) ->count(); // Menghitung SPP yang belum lunas (Pending atau Belum Lunas) diff --git a/manajemen_mp/app/Http/Controllers/JadwalController.php b/manajemen_mp/app/Http/Controllers/JadwalController.php index 669d5f2..11058ac 100644 --- a/manajemen_mp/app/Http/Controllers/JadwalController.php +++ b/manajemen_mp/app/Http/Controllers/JadwalController.php @@ -55,7 +55,7 @@ public function create() $data_kolat = Kolat::all(); // Ambil Anggota yang memiliki role 'Pelatih' dan statusnya 'Aktif' - $data_pelatih = Anggota::whereHas('role', function($query) { + $data_pelatih = Anggota::whereHas('roles', function($query) { $query->where('nama_role', 'Pelatih'); }) ->where('status', 'Aktif') @@ -98,7 +98,7 @@ public function edit($id) $data_kolat = Kolat::all(); // Tetap filter agar hanya muncul daftar pelatih - $data_pelatih = Anggota::whereHas('role', function($query) { + $data_pelatih = Anggota::whereHas('roles', function($query) { $query->where('nama_role', 'Pelatih'); })->get(); diff --git a/manajemen_mp/app/Http/Controllers/KolatController.php b/manajemen_mp/app/Http/Controllers/KolatController.php index 34df744..a7734d8 100644 --- a/manajemen_mp/app/Http/Controllers/KolatController.php +++ b/manajemen_mp/app/Http/Controllers/KolatController.php @@ -55,9 +55,22 @@ public function update(Request $request, $id) } // 4. Hapus Data Kolat + // public function destroy($id) + // { + // $kolat = Kolat::findOrFail($id); + // $kolat->delete(); + // return redirect()->back()->with('success', 'Kolat telah dihapus!'); + // } + public function destroy($id) { $kolat = Kolat::findOrFail($id); + + // Cek apakah ada anggota di kolat ini + if ($kolat->anggota()->count() > 0) { + return redirect()->back()->with('error', 'Kolat tidak bisa dihapus karena masih ada anggota yang terdaftar di dalamnya!'); + } + $kolat->delete(); return redirect()->back()->with('success', 'Kolat telah dihapus!'); } diff --git a/manajemen_mp/app/Http/Controllers/MemberDashboardController.php b/manajemen_mp/app/Http/Controllers/MemberDashboardController.php index db0e448..01ae480 100644 --- a/manajemen_mp/app/Http/Controllers/MemberDashboardController.php +++ b/manajemen_mp/app/Http/Controllers/MemberDashboardController.php @@ -75,4 +75,4 @@ public function index() return view('anggota.dashboard', compact('anggota', 'jadwal', 'tagihan_spp', 'persentase_hadir')); } -}; +} diff --git a/manajemen_mp/app/Http/Controllers/PelatihController.php b/manajemen_mp/app/Http/Controllers/PelatihController.php index e491586..03c730b 100644 --- a/manajemen_mp/app/Http/Controllers/PelatihController.php +++ b/manajemen_mp/app/Http/Controllers/PelatihController.php @@ -14,9 +14,10 @@ class PelatihController extends Controller public function index() { // Asumsi: Role pelatih memiliki nama 'Pelatih' di tabel roles - $data_pelatih = Anggota::whereHas('role', function($q) { + $data_pelatih = Anggota::whereHas('roles', function($q) { $q->where('nama_role', 'Pelatih'); - })->with('kolat')->get(); + })->with('kolatLatihan')->get(); + // })->with('kolat')->get(); return view('pelatih.pelatih', compact('data_pelatih')); } @@ -25,11 +26,15 @@ public function index() public function create() { // Ambil anggota yang role-nya masih 'Anggota' (bukan pelatih) - $calon_pelatih = Anggota::whereHas('role', function($q) { + $calon_pelatih = Anggota::whereHas('roles', function($q) { $q->where('nama_role', 'Anggota'); + })->whereDoesntHave('roles', function($q) { + $q->where('nama_role', 'Pelatih'); })->get(); - return view('pelatih.pelatihcreate', compact('calon_pelatih')); + $data_kolat = Kolat::all(); + + return view('pelatih.pelatihcreate', compact('calon_pelatih', 'data_kolat')); } // Proses Upgrade Anggota ke Pelatih @@ -41,6 +46,8 @@ public function store(Request $request) 'tgl_sk' => 'required|date', 'masa_berlaku' => 'required|date', 'foto_sk' => 'nullable|image|mimes:jpg,png,jpeg|max:2048', + 'kolat_ids' => 'required|array', + 'kolat_ids.*' => 'exists:kolat,id', ]); // Cari data anggota berdasarkan ID yang dipilih @@ -51,20 +58,30 @@ public function store(Request $request) // Data yang akan diupdate $updateData = [ - 'role_id' => $rolePelatih->id, - 'jabatan' => 'pelatih', // Update status jabatan + // 'role_id' => $rolePelatih->id, + // 'jabatan' => 'pelatih', // Update status jabatan 'no_sk' => $request->no_sk, 'tgl_sk' => $request->tgl_sk, 'masa_berlaku' => $request->masa_berlaku, 'status' => 'Aktif', ]; + $jabatan_lama = strtolower($anggota->jabatan); + if (empty($jabatan_lama) || $jabatan_lama == 'anggota') { + $updateData['jabatan'] = 'Pelatih'; // Jika kosong/anggota biasa, set murni Pelatih + } else if (!str_contains($jabatan_lama, 'pelatih')) { + $updateData['jabatan'] = $anggota->jabatan . ', Pelatih'; // Gabungkan, misal: "Sekretaris, Pelatih" + } + // Handle upload foto SK jika ada if ($request->hasFile('foto_sk')) { $path = $request->file('foto_sk')->store('sk_pelatih', 'public'); $updateData['foto_sk'] = $path; } + $anggota->roles()->syncWithoutDetaching([$rolePelatih->id]); + $anggota->kolatLatihan()->sync($request->kolat_ids); + // Eksekusi Update $anggota->update($updateData); @@ -93,9 +110,12 @@ public function update(Request $request, $id) 'no_sk' => 'required|unique:anggotas,no_sk,' . $id, // pastikan nama tabel benar 'anggota' 'tgl_sk' => 'nullable|date', // tambahkan jika di form ada tgl_sk 'foto_sk' => 'nullable|image|max:2048', + 'kolat_ids' => 'required|array', + 'kolat_ids.*' => 'exists:kolat,id', ]); - $data = $request->all(); + // $data = $request->all(); + $data = $request->except(['kolat_ids', '_token', '_method']); if ($request->hasFile('foto_sk')) { if ($pelatih->foto_sk) { @@ -105,6 +125,7 @@ public function update(Request $request, $id) } $pelatih->update($data); + $pelatih->kolatLatihan()->sync($request->kolat_ids); return redirect()->route('pelatih.index')->with('success', 'Data kepelatihan diperbarui!'); } diff --git a/manajemen_mp/app/Http/Controllers/PengurusController.php b/manajemen_mp/app/Http/Controllers/PengurusController.php new file mode 100644 index 0000000..d8ae8bf --- /dev/null +++ b/manajemen_mp/app/Http/Controllers/PengurusController.php @@ -0,0 +1,112 @@ +where('nama_role', 'Pengurus'); + })->latest()->get(); + + return view('pengurus.index', compact('data_pengurus')); + } + + // Menampilkan Form Angkat Pengurus Baru + public function create() + { + // Aturan: Harus sudah memiliki role Pelatih, tetapi BELUM memiliki role Pengurus + $calon_pengurus = Anggota::whereHas('roles', function($q) { + $q->where('nama_role', 'Pelatih'); + })->whereDoesntHave('roles', function($q) { + $q->where('nama_role', 'Pengurus'); + })->get(); + + return view('pengurus.create', compact('calon_pengurus')); + } + + // Menyimpan Data Pengurus Baru ke Database + public function store(Request $request) + { + $request->validate([ + 'anggota_id' => 'required|exists:anggotas,id', + 'jabatan_struktural' => 'required|string|max:255', // Contoh: Ketua, Sekretaris, Bendahara + ]); + + DB::beginTransaction(); + + try { + $anggota = Anggota::findOrFail($request->anggota_id); + $rolePengurus = Role::where('nama_role', 'Pengurus')->firstOrFail(); + + // Gabungkan jabatan lama (pelatih) dengan jabatan struktural baru + $jabatan_baru = $anggota->jabatan . ', Pengurus (' . $request->jabatan_struktural . ')'; + + // 1. Tambahkan role Pengurus ke tabel pivot tanpa menghapus role lama + $anggota->roles()->syncWithoutDetaching([$rolePengurus->id]); + + // 2. Perbarui kolom jabatan strukturalnya + $anggota->update([ + 'jabatan' => $jabatan_baru + ]); + + DB::commit(); + return redirect()->route('pengurus.index') + ->with('success', $anggota->nama_lengkap . ' berhasil diangkat menjadi Pengurus!'); + + } catch (\Exception $e) { + DB::rollBack(); + Log::error("Gagal mengangkat pengurus: " . $e->getMessage()); + return back()->withInput()->with('error', 'Terjadi kesalahan sistem saat memproses data.'); + } + } + + // Menampilkan Form Edit Jabatan Struktural Pengurus + public function edit($id) + { + $pengurus = Anggota::whereHas('roles', function($q) { + $q->where('nama_role', 'Pengurus'); + })->findOrFail($id); + + // Ekstrak nilai di dalam kurung dari string jabatan untuk mempermudah edit di form + // Contoh: "Pelatih, Pengurus (Sekretaris)" diambil kata "Sekretaris" + preg_match('#\((.*?)\)#', $pengurus->jabatan, $match); + $jabatan_sekarang = $match[1] ?? ''; + + return view('pengurus.edit', compact('pengurus', 'jabatan_sekarang')); + } + + // Membarui Jabatan Struktural Pengurus + public function update(Request $request, $id) + { + $request->validate([ + 'jabatan_struktural' => 'required|string|max:255', + ]); + + try { + $pengurus = Anggota::findOrFail($id); + + // Set ulang string jabatannya dengan nilai struktural yang baru + $jabatan_baru = 'Pelatih, Pengurus (' . $request->jabatan_struktural . ')'; + + $pengurus->update([ + 'jabatan' => $jabatan_baru + ]); + + return redirect()->route('pengurus.index') + ->with('success', 'Jabatan struktural ' . $pengurus->nama_lengkap . ' berhasil diperbarui!'); + + } catch (\Exception $e) { + Log::error("Gagal update jabatan pengurus: " . $e->getMessage()); + return back()->with('error', 'Terjadi kesalahan sistem saat memperbarui data.'); + } + } +} diff --git a/manajemen_mp/app/Http/Controllers/PenilaianController.php b/manajemen_mp/app/Http/Controllers/PenilaianController.php index e6983a3..b8b3c86 100644 --- a/manajemen_mp/app/Http/Controllers/PenilaianController.php +++ b/manajemen_mp/app/Http/Controllers/PenilaianController.php @@ -14,7 +14,7 @@ class PenilaianController extends Controller public function index() { // Mencari anggota berdasarkan relasi 'role' yang bernama 'Pelatih' - $data_pelatih = Anggota::whereHas('role', function ($query) { + $data_pelatih = Anggota::whereHas('roles', function ($query) { $query->where('nama_role', 'Pelatih'); }) ->with('kolat') @@ -151,7 +151,7 @@ public function exportPdf($id) public function indexAnggota() { // Ubah juga bagian ini menggunakan whereHas - $data_pelatih = Anggota::whereHas('role', function ($query) { + $data_pelatih = Anggota::whereHas('roles', function ($query) { $query->where('nama_role', 'Pelatih'); }) ->with('kolat') diff --git a/manajemen_mp/app/Http/Controllers/RekapController.php b/manajemen_mp/app/Http/Controllers/RekapController.php index 4d46118..c48e1e0 100644 --- a/manajemen_mp/app/Http/Controllers/RekapController.php +++ b/manajemen_mp/app/Http/Controllers/RekapController.php @@ -14,7 +14,8 @@ public function index(Request $request) // Tambahkan Request untuk filter $data_kolat = Kolat::all(); // 2. Query data anggota dengan filter - $query = Anggota::with(['presensi', 'spp', 'kolat']); + // $query = Anggota::with(['presensi', 'spp', 'kolat']); + $query = Anggota::with(['presensi', 'spp', 'kolatLatihan']); if ($request->kolat_id) { $query->where('kolat_id', $request->kolat_id); @@ -46,7 +47,8 @@ public function index(Request $request) // Tambahkan Request untuk filter 'nama' => $item->nama_lengkap, // Sesuaikan dengan kolom tabel Anda 'no_induk' => $item->no_induk, 'tingkatan' => $item->tingkatan, - 'nama_kolat' => $item->kolat->nama_kolat ?? '-', + // 'nama_kolat' => $item->kolat->nama_kolat ?? '-', + 'nama_kolat' => $item->kolatLatihan->pluck('nama_kolat')->join(', '), 'status_aktif' => $statusAktif, 'persentase_presensi' => round($persentasePresensi, 1), 'status_spp' => $punyaTunggakan ? 'Ada Tunggakan' : 'Lunas', diff --git a/manajemen_mp/app/Http/Middleware/CheckRole.php b/manajemen_mp/app/Http/Middleware/CheckRole.php index 7706757..4b2ec14 100644 --- a/manajemen_mp/app/Http/Middleware/CheckRole.php +++ b/manajemen_mp/app/Http/Middleware/CheckRole.php @@ -16,32 +16,55 @@ class CheckRole */ public function handle(Request $request, Closure $next, ...$roles): Response { + // // 1. Pastikan user sudah login + // if (!Auth::check()) { + // return redirect()->route('login'); + // } + + // $user = Auth::user(); + // $namaRole = null; + + // // 2. Ambil nama_role dari relasi. + // if ($user->role) { + // $namaRole = $user->role->nama_role; + // } elseif ($user->anggota && $user->anggota->role) { + // $namaRole = $user->anggota->role->nama_role; + // } + + // // ========================================== + // // LETAKKAN KODE DD DI SINI (UNTUK DEBUGGING) + // // ========================================== + // // dd('Role di DB: ' . $namaRole, 'Role di Rute: ', $roles); + + // // 3. Cek apakah nama_role user ada di dalam daftar role + // if (in_array($namaRole, $roles)) { + // return $next($request); + // } + + // // 4. Jika role tidak cocok, tolak akses + // abort(403, 'Akses Ditolak. Anda tidak memiliki wewenang untuk mengakses halaman ini.'); + + + // baru // 1. Pastikan user sudah login if (!Auth::check()) { return redirect()->route('login'); } $user = Auth::user(); - $namaRole = null; - // 2. Ambil nama_role dari relasi. - if ($user->role) { - $namaRole = $user->role->nama_role; - } elseif ($user->anggota && $user->anggota->role) { - $namaRole = $user->anggota->role->nama_role; + // 2. LOGIKA BARU: Pengecekan Banyak Peran (Multiple Roles) + if ($user->anggota) { + // Looping daftar role yang diizinkan oleh Route (misal: 'Pengurus', 'Pelatih') + foreach ($roles as $role) { + // Jika user yang sedang login punya salah satu role tersebut, langsung loloskan! + if ($user->anggota->roles->contains('nama_role', $role)) { + return $next($request); + } + } } - // ========================================== - // LETAKKAN KODE DD DI SINI (UNTUK DEBUGGING) - // ========================================== - // dd('Role di DB: ' . $namaRole, 'Role di Rute: ', $roles); - - // 3. Cek apakah nama_role user ada di dalam daftar role - if (in_array($namaRole, $roles)) { - return $next($request); - } - - // 4. Jika role tidak cocok, tolak akses + // 3. Jika tidak ada satupun role yang cocok, tolak akses abort(403, 'Akses Ditolak. Anda tidak memiliki wewenang untuk mengakses halaman ini.'); } } diff --git a/manajemen_mp/app/Models/Anggota.php b/manajemen_mp/app/Models/Anggota.php index c7aece6..f89e4f2 100644 --- a/manajemen_mp/app/Models/Anggota.php +++ b/manajemen_mp/app/Models/Anggota.php @@ -13,7 +13,7 @@ class Anggota extends Model protected $table = 'anggotas'; protected $fillable = [ - 'user_id', 'no_induk', 'nama_lengkap', 'foto_profil', 'role_id', 'jenis_kelamin', + 'user_id', 'no_induk', 'nama_lengkap', 'foto_profil', 'jenis_kelamin', 'tempat_lahir', 'tgl_lahir', 'no_hp', 'kolat_id', 'tingkatan', 'tgl_gabung', 'status', 'alamat', 'catatan_medis', 'jabatan', 'no_sk', 'masa_berlaku', 'foto_sk' @@ -25,20 +25,46 @@ public function kolat() return $this->belongsTo(Kolat::class, 'kolat_id'); } - public function role() + // public function role() + // { + // return $this->belongsTo(Role::class, 'role_id'); + // } + + // TAMBAHKAN relasi baru ini: + public function roles() { - return $this->belongsTo(Role::class, 'role_id'); + // Menghubungkan Anggota ke Role lewat tabel pivot anggota_role + return $this->belongsToMany(Role::class, 'anggota_role', 'anggota_id', 'role_id')->withTimestamps(); } + /** + * Fungsi bantuan (Helper) untuk mengecek apakah anggota memiliki role tertentu. + * Sangat berguna nanti di Controller, Middleware, atau Blade. + */ + public function hasRole($roleName) + { + return $this->roles()->where('nama_role', $roleName)->exists(); + } + + + public function kolatLatihan() { return $this->belongsToMany(Kolat::class, 'kolat_pelatih', 'anggota_id', 'kolat_id'); } // Scope agar gampang memanggil data yang hanya ber-role Pelatih + // public function scopeIsPelatih($query) + // { + // return $query->whereHas('role', function ($q) { + // $q->where('nama_role', 'Pelatih'); + // }); + // } + + // KODE BARU (Ubah jadi 'roles') public function scopeIsPelatih($query) { - return $query->whereHas('role', function ($q) { + return $query->whereHas('roles', function ($q) { // <-- Ubah 'role' jadi 'roles' $q->where('nama_role', 'Pelatih'); }); } diff --git a/manajemen_mp/app/Models/Kolat.php b/manajemen_mp/app/Models/Kolat.php index ef83ef9..d53040f 100644 --- a/manajemen_mp/app/Models/Kolat.php +++ b/manajemen_mp/app/Models/Kolat.php @@ -26,8 +26,6 @@ public function anggota() public function pelatihs() { - // Panggil relasi pivot, lalu sambungkan dengan scope isPelatih() - return $this->belongsToMany(Anggota::class, 'kolat_pelatih', 'kolat_id', 'anggota_id') - ->isPelatih(); + return $this->belongsToMany(Anggota::class, 'kolat_pelatih', 'kolat_id', 'anggota_id')->withTimestamps(); } } diff --git a/manajemen_mp/app/Models/Role.php b/manajemen_mp/app/Models/Role.php index 1a38cd2..81dcec7 100644 --- a/manajemen_mp/app/Models/Role.php +++ b/manajemen_mp/app/Models/Role.php @@ -11,4 +11,9 @@ class Role extends Model protected $table = 'role'; // Pastikan nama tabelnya 'roles' di database protected $fillable = ['nama_role']; // Sesuaikan kolom di tabel roles kamu + + public function anggotas() + { + return $this->belongsToMany(Anggota::class, 'anggota_role', 'role_id', 'anggota_id')->withTimestamps(); + } } diff --git a/manajemen_mp/app/Models/User.php b/manajemen_mp/app/Models/User.php index d685df1..e59ab9b 100644 --- a/manajemen_mp/app/Models/User.php +++ b/manajemen_mp/app/Models/User.php @@ -18,7 +18,6 @@ class User extends Authenticatable * @var array */ protected $fillable = [ - 'role_id', 'email', 'password', ]; diff --git a/manajemen_mp/app/Providers/AppServiceProvider.php b/manajemen_mp/app/Providers/AppServiceProvider.php index 793c5a6..9437fe0 100644 --- a/manajemen_mp/app/Providers/AppServiceProvider.php +++ b/manajemen_mp/app/Providers/AppServiceProvider.php @@ -29,7 +29,14 @@ public function boot(): void View::composer('*', function ($view) { if (Auth::check()) { $user = Auth::user(); - $userRole = $user->role->nama_role; // Sesuaikan dengan cara Anda ambil role + $userRole = 'Anggota'; + if ($user->anggota) { + if ($user->anggota->roles->contains('nama_role', 'Pengurus')) { + $userRole = 'Pengurus'; + } elseif ($user->anggota->roles->contains('nama_role', 'Pelatih')) { + $userRole = 'Pelatih'; + } + }// Sesuaikan dengan cara Anda ambil role $notifications = []; $unreadCount = 0; diff --git a/manajemen_mp/database/migrations/2026_04_02_152646_create_anggota_table.php b/manajemen_mp/database/migrations/2026_04_02_152646_create_anggota_table.php index 7a876d5..8668661 100644 --- a/manajemen_mp/database/migrations/2026_04_02_152646_create_anggota_table.php +++ b/manajemen_mp/database/migrations/2026_04_02_152646_create_anggota_table.php @@ -14,7 +14,7 @@ public function up(): void Schema::create('anggotas', function (Blueprint $table) { $table->id(); // --- RELASI (Penghubung ke Dropdown) --- - $table->foreignId('role_id')->constrained('role')->onDelete('cascade'); + // $table->foreignId('role_id')->constrained('role')->onDelete('cascade'); $table->foreignId('kolat_id')->constrained('kolat')->onDelete('cascade'); // --- DATA IDENTITAS --- diff --git a/manajemen_mp/database/migrations/2026_04_20_151749_add_role_id_to_users_table.php b/manajemen_mp/database/migrations/2026_04_20_151749_add_role_id_to_users_table.php index 45b5036..ddd1be7 100644 --- a/manajemen_mp/database/migrations/2026_04_20_151749_add_role_id_to_users_table.php +++ b/manajemen_mp/database/migrations/2026_04_20_151749_add_role_id_to_users_table.php @@ -12,7 +12,7 @@ public function up(): void { Schema::table('users', function (Blueprint $table) { - $table->foreignId('role_id')->after('id')->constrained('role')->onDelete('cascade'); + // $table->foreignId('role_id')->after('id')->constrained('role')->onDelete('cascade'); }); } @@ -22,8 +22,8 @@ public function up(): void public function down(): void { Schema::table('users', function (Blueprint $table) { - $table->dropForeign(['role_id']); - $table->dropColumn('role_id'); + // $table->dropForeign(['role_id']); + // $table->dropColumn('role_id'); }); } }; diff --git a/manajemen_mp/database/migrations/2026_06_06_103148_create_anggota_role_table.php b/manajemen_mp/database/migrations/2026_06_06_103148_create_anggota_role_table.php new file mode 100644 index 0000000..6aa2385 --- /dev/null +++ b/manajemen_mp/database/migrations/2026_06_06_103148_create_anggota_role_table.php @@ -0,0 +1,37 @@ +id(); + + // Relasi ke tabel anggotas + $table->foreignId('anggota_id')->constrained('anggotas')->onDelete('cascade'); + + // Relasi ke tabel roles (asumsi nama tabel master role kamu adalah 'roles') + $table->foreignId('role_id')->constrained('role')->onDelete('cascade'); + + $table->timestamps(); + + // Kunci unik agar satu orang tidak bisa punya role yang sama persis secara ganda + $table->unique(['anggota_id', 'role_id']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('anggota_role'); + } +}; diff --git a/manajemen_mp/database/seeders/DatabaseSeeder.php b/manajemen_mp/database/seeders/DatabaseSeeder.php index e467d4c..2d51fff 100644 --- a/manajemen_mp/database/seeders/DatabaseSeeder.php +++ b/manajemen_mp/database/seeders/DatabaseSeeder.php @@ -13,7 +13,7 @@ class DatabaseSeeder extends Seeder public function run(): void { $this->call([ - RoleSeeder::class, + RoleSeeder::class, KolatSeeder::class, UserSeeder::class, ]); diff --git a/manajemen_mp/database/seeders/UserSeeder.php b/manajemen_mp/database/seeders/UserSeeder.php index ea23dff..f6aa56f 100644 --- a/manajemen_mp/database/seeders/UserSeeder.php +++ b/manajemen_mp/database/seeders/UserSeeder.php @@ -16,32 +16,43 @@ class UserSeeder extends Seeder */ public function run(): void { + // 1. Ambil ID Role Pelatih $rolePelatih = Role::where('nama_role', 'Pelatih')->first(); + $rolePengurus = Role::where('nama_role', 'Pengurus')->first(); // 2. Buat Akun User untuk Pelatih $user = User::create([ - 'role_id' => $rolePelatih->id, 'email' => 'pelatih@tapakmp.com', 'password' => Hash::make('password123'), // Password default ]); // 3. Buat Profil Anggota untuk User tersebut - Anggota::create([ + $anggota = Anggota::create([ 'user_id' => $user->id, - 'role_id' => $rolePelatih->id, 'no_induk' => 'MP-2026-001', 'nama_lengkap' => 'Siti Afiah Dahliawati', 'jenis_kelamin' => 'P', 'tempat_lahir' => 'Jember', 'tgl_lahir' => '2004-10-29', 'no_hp' => '081455057453', - 'kolat_id' => 1, // Pastikan sudah ada data Kolat ID 1 atau sesuaikan + 'kolat_id' => 1, // Menyambung ke Kolat Unej di KolatSeeder 'tingkatan' => 'Balik 1', 'tgl_gabung' => now(), 'status' => 'Aktif', 'alamat' => 'Jl. Merpati Putih No. 1, Jember', - 'jabatan' => 'Pelatih Kolat', + 'jabatan' => 'Pelatih, Pengurus Kolat', ]); + // 4. INI BAGIAN TERPENTING: Masukkan data ke tabel pivot anggota_role! + // Perintah attach() ini akan otomatis mengisi tabel anggota_role dengan anggota_id dan role_id + if ($rolePelatih) { + $anggota->roles()->attach($rolePelatih->id); + } + + // Menempelkan peran sebagai Pengurus (Menjadikannya akun super ganda untuk kebutuhan pengetesan) + if ($rolePengurus) { + $anggota->roles()->attach($rolePengurus->id); + } + } } diff --git a/manajemen_mp/resources/views/anggota/anggota.blade.php b/manajemen_mp/resources/views/anggota/anggota.blade.php index 049d2e0..47ef78d 100644 --- a/manajemen_mp/resources/views/anggota/anggota.blade.php +++ b/manajemen_mp/resources/views/anggota/anggota.blade.php @@ -164,10 +164,25 @@ class="fw-bold text-primary mb-3 border-bottom pb-2"> {{ $item->kolat->nama_kolat ?? '-' }} -
+ {{--
Jabatan {{ $item->role->nama_role ?? 'ANGGOTA' }} +
--}} +
+ Jabatan + Terdaftar +
+ @forelse($item->roles as $role) + {{ $role->nama_role }} + @empty + ANGGOTA + @endforelse +
Tingkatan @@ -303,11 +318,11 @@ class="icon-heart me-2">Catatan .btn-action-edit { background-color: #fff8e6; - color: #f59e0b; - border: 1px solid #ffecb3; - border-radius: 10px; - transition: 0.3s; - } + color: #f59e0b; + border: 1px solid #ffecb3; + border-radius: 10px; + transition: 0.3s; + } .btn-action-edit:hover { background-color: #f59e0b !important; diff --git a/manajemen_mp/resources/views/anggota/anggotacreate.blade.php b/manajemen_mp/resources/views/anggota/anggotacreate.blade.php index 174495a..cc1ad4e 100644 --- a/manajemen_mp/resources/views/anggota/anggotacreate.blade.php +++ b/manajemen_mp/resources/views/anggota/anggotacreate.blade.php @@ -2,8 +2,17 @@ @section('content') @php - // Ambil nama role user yang login saat ini - $userRole = auth()->user()->role->nama_role ?? 'Anggota'; + // LOGIKA BARU: Ambil nama role user menggunakan relasi pivot + $user = auth()->user(); + $userRole = 'Anggota'; + + if ($user && $user->anggota) { + if ($user->anggota->roles->contains('nama_role', 'Pengurus')) { + $userRole = 'Pengurus'; + } elseif ($user->anggota->roles->contains('nama_role', 'Pelatih')) { + $userRole = 'Pelatih'; + } + } @endphp
@@ -120,7 +129,7 @@ @endif @endforeach @@ -209,7 +218,7 @@ function toggleSKFields() { const roleSelect = document.getElementById('roleSelect'); const boxSK = document.getElementById('boxSK'); - + if (boxSK && roleSelect.selectedIndex > 0) { const selectedText = roleSelect.options[roleSelect.selectedIndex].text.toLowerCase(); diff --git a/manajemen_mp/resources/views/anggota/editanggota.blade.php b/manajemen_mp/resources/views/anggota/editanggota.blade.php index 879486b..60ad12e 100644 --- a/manajemen_mp/resources/views/anggota/editanggota.blade.php +++ b/manajemen_mp/resources/views/anggota/editanggota.blade.php @@ -1,206 +1,251 @@ @extends('layout.app') @section('content') -@php - // Ambil nama role user yang login saat ini - $userRole = auth()->user()->role->nama_role ?? 'Anggota'; -@endphp + @php + // LOGIKA BARU: Ambil nama role user menggunakan relasi pivot + $user = auth()->user(); + $userRole = 'Anggota'; -
- @if ($errors->any()) -
-
- -
    - @foreach ($errors->all() as $error) -
  • {{ $error }}
  • - @endforeach -
+ if ($user && $user->anggota) { + if ($user->anggota->roles->contains('nama_role', 'Pengurus')) { + $userRole = 'Pengurus'; + } elseif ($user->anggota->roles->contains('nama_role', 'Pelatih')) { + $userRole = 'Pelatih'; + } + } + @endphp + +
+ @if ($errors->any()) +
+
+ +
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+
+ @endif + + + +
+
+
+ @csrf + @method('PUT') + +
+
+
Informasi Akun & Pribadi +
+
+
+
+
+ + + * Email digunakan untuk login + sistem +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ +
+
+
+ + +
+
+
+
+ +
+
+
Informasi Organisasi
+
+
+
+
+ + + + @if ($userRole != 'Pengurus') + Anda hanya dapat + mengubah data Anggota biasa. + @endif +
+
+ + +
+
+ + +
+ + {{-- BOX SK HANYA DIBUKA UNTUK PENGURUS --}} + @if ($userRole == 'Pengurus') + + @endif + +
+ + +
+
+
+ + +
+
- @endif - - -
-
-
- @csrf - @method('PUT') + + document.addEventListener("DOMContentLoaded", toggleSKFields); + - + @endsection diff --git a/manajemen_mp/resources/views/dashboard/dashboard.blade.php b/manajemen_mp/resources/views/dashboard/dashboard.blade.php index d4a2d91..8281ba8 100644 --- a/manajemen_mp/resources/views/dashboard/dashboard.blade.php +++ b/manajemen_mp/resources/views/dashboard/dashboard.blade.php @@ -1,6 +1,30 @@ @extends('layout.app') @section('content') +@php + // LOGIKA MULTI-ROLE: Memeriksa jabatan apa saja yang tersemat pada pengguna ini + $user = auth()->user(); + + // Periksa apakah user memiliki tabel anggota yang terhubung + $isPengurus = false; + $isPelatih = false; + + if ($user && $user->anggota) { + $isPengurus = $user->anggota->roles->contains('nama_role', 'Pengurus'); + $isPelatih = $user->anggota->roles->contains('nama_role', 'Pelatih'); + } + + // Tentukan label yang akan tampil di header + if ($isPengurus && $isPelatih) { + $roleDisplay = 'Pengurus & Pelatih'; + } elseif ($isPengurus) { + $roleDisplay = 'Pengurus Cabang'; + } elseif ($isPelatih) { + $roleDisplay = 'Pelatih Kolat'; + } else { + $roleDisplay = 'Anggota Biasa'; + } +@endphp
@@ -19,7 +43,7 @@
ROLE AKSES - Administrator + {{ $roleDisplay }}
diff --git a/manajemen_mp/resources/views/layout/sidebar.blade.php b/manajemen_mp/resources/views/layout/sidebar.blade.php index 814e231..805212d 100644 --- a/manajemen_mp/resources/views/layout/sidebar.blade.php +++ b/manajemen_mp/resources/views/layout/sidebar.blade.php @@ -1,12 +1,14 @@ @php - // Ambil nama role user dengan logika yang sama persis seperti di Middleware + // LOGIKA BARU: Deteksi multi-role dari tabel perantara (pivot) roles() $user = auth()->user(); - $userRole = null; + $userRole = 'Anggota'; // Default fallback - if ($user->role) { - $userRole = $user->role->nama_role; - } elseif ($user->anggota && $user->anggota->role) { - $userRole = $user->anggota->role->nama_role; + if ($user && $user->anggota) { + if ($user->anggota->roles->contains('nama_role', 'Pengurus')) { + $userRole = 'Pengurus'; + } elseif ($user->anggota->roles->contains('nama_role', 'Pelatih')) { + $userRole = 'Pelatih'; + } } @endphp @@ -21,7 +23,7 @@ - Dashboard + Dashboard @else diff --git a/manajemen_mp/resources/views/pelatih/editpelatih.blade.php b/manajemen_mp/resources/views/pelatih/editpelatih.blade.php index 8b57514..12e1601 100644 --- a/manajemen_mp/resources/views/pelatih/editpelatih.blade.php +++ b/manajemen_mp/resources/views/pelatih/editpelatih.blade.php @@ -82,7 +82,7 @@ class="text-muted text-decoration-none small">Daftar Pelatih
-
+ {{--
+
--}} +
+ + + {{-- Ambil data ID Kolat yang sudah pernah dipilih pelatih ini --}} + @php + $selectedKolat = old('kolat_ids', $pelatih->kolatLatihan->pluck('id')->toArray()); + @endphp + + + Bisa memilih lebih dari satu kolat sekaligus.
@@ -143,4 +161,18 @@ class="text-muted text-decoration-none small">Daftar Pelatih .btn-save { border-radius: 12px; background: linear-gradient(45deg, #4f46e5, #3730a3); border: none; transition: all 0.3s ease; } .btn-save:hover { transform: translateY(-2px); box-shadow: 0 5px 15px rgba(79, 70, 229, 0.4) !important; } + + @push('scripts') + + + +@endpush @endsection diff --git a/manajemen_mp/resources/views/pelatih/pelatih.blade.php b/manajemen_mp/resources/views/pelatih/pelatih.blade.php index 2e79025..29a6512 100644 --- a/manajemen_mp/resources/views/pelatih/pelatih.blade.php +++ b/manajemen_mp/resources/views/pelatih/pelatih.blade.php @@ -1,9 +1,14 @@ @extends('layout.app') @section('content') - @php + {{-- @php // Ambil nama role user yang login saat ini $userRole = auth()->user()->role->nama_role ?? 'Anggota'; + @endphp --}} + @php + // LOGIKA BARU: Cek apakah user yang login punya role 'Pengurus' di tabel pivot + $user = auth()->user(); + $isPengurus = $user->anggota && $user->anggota->roles->contains('nama_role', 'Pengurus'); @endphp
@@ -29,7 +34,7 @@
- @if($userRole == 'Pengurus') + @if($isPengurus) Upgrade Anggota ke Pelatih @@ -48,7 +53,7 @@ Status SK - @if($userRole == 'Pengurus') + @if($isPengurus) Aksi @endif @@ -65,8 +70,19 @@
{{ $item->no_sk }}
Hingga: {{ \Carbon\Carbon::parse($item->masa_berlaku)->format('d M Y') }}
- + {{-- {{ $item->kolat->nama_kolat ?? '-' }} + --}} + + @if($item->kolatLatihan->count() > 0) + @foreach($item->kolatLatihan as $kolat) + + {{ $kolat->nama_kolat }} + + @endforeach + @else + - Belum ada kolat - + @endif @php @@ -78,12 +94,12 @@ - @if($userRole == 'Pengurus') + @if($isPengurus)
diff --git a/manajemen_mp/resources/views/pelatih/pelatihcreate.blade.php b/manajemen_mp/resources/views/pelatih/pelatihcreate.blade.php index 8900308..a33fa86 100644 --- a/manajemen_mp/resources/views/pelatih/pelatihcreate.blade.php +++ b/manajemen_mp/resources/views/pelatih/pelatihcreate.blade.php @@ -26,6 +26,16 @@ Hanya anggota yang belum memiliki jabatan pelatih yang muncul di sini.
+
+ + + Bisa memilih lebih dari satu kolat sekaligus. +
+
@@ -76,7 +86,10 @@ diff --git a/manajemen_mp/resources/views/pengurus/create.blade.php b/manajemen_mp/resources/views/pengurus/create.blade.php new file mode 100644 index 0000000..20440ef --- /dev/null +++ b/manajemen_mp/resources/views/pengurus/create.blade.php @@ -0,0 +1,65 @@ +@extends('layout.app') + +@section('content') +
+ + +
+
+
+
+ + @csrf + +
+ + + Sesuai aturan hierarki, hanya fungsionaris bertatus Pelatih yang dapat diangkat ke kepengurusan struktural. +
+ +
+ + + Tuliskan nama posisi spesifik yang akan diemban di kepengurusan. +
+ +
+ + Batal +
+ +
+
+
+ +
+
+
+
Sistem Multi-Role
+
    +
  • Akses kepelatihan lapangan yang bersangkutan tidak akan hilang atau terhapus.
  • +
  • Sistem secara otomatis akan menggabungkan peran lama dengan posisi struktural baru di riwayat jabatan.
  • +
  • Pengurus baru akan langsung diberikan hak penuh untuk mengelola data anggota keseluruhan serta laporan keuangan tingkat cabang.
  • +
+
+
+
+
+
+ + +@endsection diff --git a/manajemen_mp/resources/views/pengurus/edit.blade.php b/manajemen_mp/resources/views/pengurus/edit.blade.php new file mode 100644 index 0000000..0e09dce --- /dev/null +++ b/manajemen_mp/resources/views/pengurus/edit.blade.php @@ -0,0 +1,60 @@ +@extends('layout.app') + +@section('content') +
+ + +
+
+
+ @csrf + @method('PUT') + +
+
+ +
+ + +
+ +
+ + +
+ +
+ + + *Perubahan posisi ini tidak akan mengganggu data riwayat kepelatihan yang bersangkutan. +
+ +
+ + Batal +
+
+
+
+
+
+
+ + +@endsection diff --git a/manajemen_mp/resources/views/pengurus/index.blade.php b/manajemen_mp/resources/views/pengurus/index.blade.php new file mode 100644 index 0000000..70f87f2 --- /dev/null +++ b/manajemen_mp/resources/views/pengurus/index.blade.php @@ -0,0 +1,102 @@ +@extends('layout.app') + +@section('content') +
+ + +
+
+
+
+ +
+
+
Daftar Pengurus Aktif
+

Kelola fungsionaris struktural dan kepengurusan organisasi.

+
+ + + Angkat Pengurus Baru + +
+ + @if(session('success')) +
+ {{ session('success') }} + +
+ @endif + +
+ + + + + + + + + + + + + @forelse ($data_pengurus as $no => $item) + + + + + + + + + @empty + + + + @endforelse + +
NoIdentitas PengurusNo. HP / WhatsAppJabatan & Peran SistemStatus AkunAksi
{{ $no + 1 }} +
{{ $item->nama_lengkap }}
+ ID: {{ $item->no_induk }} +
{{ $item->no_hp }} +
{{ ucwords($item->jabatan) }}
+ @foreach($item->roles as $role) + {{ $role->nama_role }} + @endforeach +
+ + {{ $item->status }} + + +
+ + + +
+
Belum ada anggota yang diangkat menjadi pengurus struktural.
+
+ +
+
+
+
+
+ + +@endsection diff --git a/manajemen_mp/resources/views/penilaian/index.blade.php b/manajemen_mp/resources/views/penilaian/index.blade.php index 40c5052..95c51cc 100644 --- a/manajemen_mp/resources/views/penilaian/index.blade.php +++ b/manajemen_mp/resources/views/penilaian/index.blade.php @@ -56,8 +56,15 @@ Hingga: {{ $item->masa_berlaku ? \Carbon\Carbon::parse($item->masa_berlaku)->format('d M Y') : '-' }}
- + {{-- {{ $item->kolat->nama_kolat ?? '-' }} + --}} + + @forelse($item->kolatLatihan as $kolat) + {{ $kolat->nama_kolat }} + @empty + - + @endforelse @php diff --git a/manajemen_mp/resources/views/penilaian/laporan_pdf.blade.php b/manajemen_mp/resources/views/penilaian/laporan_pdf.blade.php index 4c98b32..00e166a 100644 --- a/manajemen_mp/resources/views/penilaian/laporan_pdf.blade.php +++ b/manajemen_mp/resources/views/penilaian/laporan_pdf.blade.php @@ -40,7 +40,13 @@ Unit Latihan - : Kolat {{ $pelatih->kolat->nama_kolat ?? '-' }} + {{-- : Kolat {{ $pelatih->kolat->nama_kolat ?? '-' }} --}} + Unit Latihan + : + @foreach($pelatih->kolatLatihan as $kolat) + {{ $kolat->nama_kolat }}{{ !$loop->last ? ', ' : '' }} + @endforeach + Tanggal Cetak : {{ now()->format('d/m/Y') }} diff --git a/manajemen_mp/resources/views/profil/edit.blade.php b/manajemen_mp/resources/views/profil/edit.blade.php index 2486a00..3d32a6d 100644 --- a/manajemen_mp/resources/views/profil/edit.blade.php +++ b/manajemen_mp/resources/views/profil/edit.blade.php @@ -409,7 +409,7 @@
- {{ $anggota->role->nama_role }} + {{ $anggota->roles->pluck('nama_role')->join(', ') }}
diff --git a/manajemen_mp/routes/web.php b/manajemen_mp/routes/web.php index 618ab68..f08dd8f 100644 --- a/manajemen_mp/routes/web.php +++ b/manajemen_mp/routes/web.php @@ -9,6 +9,7 @@ use App\Http\Controllers\LaporanController; use App\Http\Controllers\MemberDashboardController; use App\Http\Controllers\PelatihController; +use App\Http\Controllers\PengurusController; use App\Http\Controllers\PenilaianController; use App\Http\Controllers\PresensiController; use App\Http\Controllers\ProfileController; @@ -131,7 +132,7 @@ Route::middleware('checkrole:Pengurus')->group(function () { // Aksi CRUD Anggota - Route::get('/anggota/export/excel ', [AnggotaController::class, 'exportExcel'])->name('anggota.export.excel'); + Route::get('/anggota/export/excel', [AnggotaController::class, 'exportExcel'])->name('anggota.export.excel'); Route::get('/anggota/export/pdf', [AnggotaController::class, 'exportPdf'])->name('anggota.export.pdf'); // Aksi CRUD Kolat @@ -185,4 +186,13 @@ }); +Route::middleware(['auth', 'checkrole:Pengurus'])->group(function () { + Route::get('/pengurus', [PengurusController::class, 'index'])->name('pengurus.index'); + Route::get('/pengurus/create', [PengurusController::class, 'create'])->name('pengurus.create'); + Route::post('/pengurus/store', [PengurusController::class, 'store'])->name('pengurus.store'); + Route::get('/pengurus/{id}/edit', [PengurusController::class, 'edit'])->name('pengurus.edit'); + Route::put('/pengurus/{id}/update', [PengurusController::class, 'update'])->name('pengurus.update'); + }); + +