From e28efe700b9e92a2bd96097ea22dabcd35f58a1c Mon Sep 17 00:00:00 2001 From: ell Date: Mon, 27 Apr 2026 19:50:36 +0700 Subject: [PATCH] login + register, update view anggota --- .../Http/Controllers/AnggotaController.php | 131 +++++++--- .../app/Http/Controllers/AuthController.php | 145 +++++++++++ .../Http/Controllers/DashboardController.php | 13 + manajemen_mp/app/Models/Anggota.php | 8 +- manajemen_mp/app/Models/User.php | 14 +- ...4_20_151749_add_role_id_to_users_table.php | 29 +++ ...0_152009_add_user_id_to_anggotas_table.php | 33 +++ ...20_153001_remove_name_from_users_table.php | 28 ++ .../database/seeders/DatabaseSeeder.php | 3 + .../resources/views/anggota/anggota.blade.php | 193 +++++++++++--- .../views/anggota/anggotacreate.blade.php | 51 ++-- .../views/anggota/editanggota.blade.php | 174 +++++++++++++ .../views/dashboard/dashboard.blade.php | 5 + .../views/login-register/login.blade.php | 148 +++++++++++ .../views/login-register/register.blade.php | 246 ++++++++++++++++++ manajemen_mp/routes/web.php | 18 ++ 16 files changed, 1127 insertions(+), 112 deletions(-) create mode 100644 manajemen_mp/app/Http/Controllers/AuthController.php create mode 100644 manajemen_mp/app/Http/Controllers/DashboardController.php create mode 100644 manajemen_mp/database/migrations/2026_04_20_151749_add_role_id_to_users_table.php create mode 100644 manajemen_mp/database/migrations/2026_04_20_152009_add_user_id_to_anggotas_table.php create mode 100644 manajemen_mp/database/migrations/2026_04_20_153001_remove_name_from_users_table.php create mode 100644 manajemen_mp/resources/views/dashboard/dashboard.blade.php create mode 100644 manajemen_mp/resources/views/login-register/login.blade.php create mode 100644 manajemen_mp/resources/views/login-register/register.blade.php diff --git a/manajemen_mp/app/Http/Controllers/AnggotaController.php b/manajemen_mp/app/Http/Controllers/AnggotaController.php index 3250941..5a1fc9e 100644 --- a/manajemen_mp/app/Http/Controllers/AnggotaController.php +++ b/manajemen_mp/app/Http/Controllers/AnggotaController.php @@ -5,7 +5,11 @@ use App\Models\Anggota; use App\Models\Kolat; // Import model Kolat use App\Models\Role; +use App\Models\User; use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Hash; +use Illuminate\Support\Facades\Log; class AnggotaController extends Controller { @@ -31,45 +35,73 @@ public function create() } public function store(Request $request) -{ - // 1. Validasi diperbaiki (Hapus jabatan dari required karena kita isi manual) - $request->validate([ - 'nama_lengkap' => 'required', - 'no_hp' => 'required', - 'role_id' => 'required|exists:role,id', // pastikan nama tabel benar - 'kolat_id' => 'required|exists:kolat,id', - 'jenis_kelamin'=> 'required', - 'tempat_lahir' => 'required', - 'tgl_lahir' => 'required|date', - 'tingkatan' => 'required', - 'tgl_gabung' => 'required|date', - ]); + { + $request->validate([ + 'email' => 'required|email|unique:users,email', + 'nama_lengkap' => 'required', + 'no_hp' => 'required', + 'role_id' => 'required|exists:role,id', + 'kolat_id' => 'required|exists:kolat,id', + 'jenis_kelamin' => 'required', + 'tempat_lahir' => 'required', + 'tgl_lahir' => 'required|date', + 'tingkatan' => 'required', + 'tgl_gabung' => 'required|date', + ]); - // 2. Ambil nama role untuk mengisi kolom jabatan secara otomatis - $role = Role::find($request->role_id); - $nama_jabatan = strtolower($role->nama_role); + DB::beginTransaction(); - // 3. Logika No Induk - $terakhir = Anggota::orderBy('id', 'desc')->first(); - $nomor_urut = $terakhir ? sprintf("%03d", intval(substr($terakhir->no_induk, 3)) + 1) : "001"; - $no_induk_baru = "JB-" . $nomor_urut; + try { + // A. Buat Akun Login di tabel Users + $user = User::create([ + 'email' => $request->email, + 'password' => Hash::make('tapakmp123'), // Password default + 'role_id' => $request->role_id, + ]); - // 4. Gabungkan semua data - $data = $request->all(); - $data['no_induk'] = $no_induk_baru; - $data['jabatan'] = $nama_jabatan; // Mengisi kolom jabatan otomatis + // B. Cari nama jabatan berdasarkan role + $role = Role::find($request->role_id); + $nama_jabatan = strtolower($role->nama_role); - // 5. Simpan (Pastikan fillable di Model sudah lengkap) - Anggota::create($data); + // C. Logika No Induk (JB-001) + $terakhir = Anggota::orderBy('id', 'desc')->first(); + $nomor_urut = $terakhir ? sprintf("%03d", intval(substr($terakhir->no_induk, 3)) + 1) : "001"; + $no_induk_baru = "JB-" . $nomor_urut; - return redirect()->route('anggota.anggota') - ->with('success', 'Anggota berhasil terdaftar!'); -} + // D. Simpan Profil di tabel Anggotas + 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, + 'no_hp' => $request->no_hp, + 'kolat_id' => $request->kolat_id, + 'tingkatan' => $request->tingkatan, + 'tgl_gabung' => $request->tgl_gabung, + 'alamat' => $request->alamat, + 'catatan_medis' => $request->catatan_medis, + 'jabatan' => $nama_jabatan, + 'status' => 'aktif', // Input admin otomatis aktif + ]); + + DB::commit(); + return redirect()->route('anggota.anggota') + ->with('success', 'Data berhasil ditambah! Password login: tapakmp123'); + + } catch (\Exception $e) { + DB::rollBack(); + Log::error("Gagal tambah anggota: " . $e->getMessage()); + return back()->withInput()->with('error', 'Terjadi kesalahan sistem.'); + } + } // 4. Menampilkan Form Edit public function edit($id) { - $anggota = Anggota::findOrFail($id); + $anggota = Anggota::with('user')->findOrFail($id); $data_kolat = Kolat::all(); // Ambil daftar kolat lagi untuk pilihan saat edit $data_role = Role::all(); @@ -80,20 +112,45 @@ public function edit($id) public function update(Request $request, $id) { $anggota = Anggota::findOrFail($id); + $user = User::findOrFail($anggota->user_id); $request->validate([ - 'no_induk' => 'required|unique:anggotas,no_induk,' . $id, + 'email' => 'required|email|unique:users,email,' . $user->id, 'nama_lengkap' => 'required', 'no_hp' => 'required', - 'jabatan' => 'required|in:pengurus,pelatih,anggota', + 'role_id' => 'required|exists:role,id', 'kolat_id' => 'required|exists:kolat,id', + 'status' => 'required|in:aktif,Non-Aktif', ]); - // Update data menggunakan data yang sudah divalidasi - $anggota->update($request->all()); + DB::beginTransaction(); - return redirect()->route('anggota.anggota') - ->with('success', 'Data ' . $anggota->nama_lengkap . ' Berhasil Diperbarui!'); + try { + // 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); + + // C. Update tabel Anggota + $data_anggota = $request->all(); + $data_anggota['jabatan'] = $nama_jabatan; + + $anggota->update($data_anggota); + + DB::commit(); + return redirect()->route('anggota.anggota') + ->with('success', 'Data ' . $anggota->nama_lengkap . ' berhasil diperbarui!'); + + } catch (\Exception $e) { + DB::rollBack(); + Log::error("Gagal update anggota: " . $e->getMessage()); + return back()->with('error', 'Terjadi kesalahan saat memperbarui data.'); + } } - + } diff --git a/manajemen_mp/app/Http/Controllers/AuthController.php b/manajemen_mp/app/Http/Controllers/AuthController.php new file mode 100644 index 0000000..1867854 --- /dev/null +++ b/manajemen_mp/app/Http/Controllers/AuthController.php @@ -0,0 +1,145 @@ +validate([ + 'email' => 'required|email', + 'password' => 'required', + ]); + + if (Auth::attempt($credentials)) { + $user = Auth::user(); + + // Proteksi Status: Jika belum diaktifkan admin, tidak boleh masuk + if ($user->anggota && $user->anggota->status !== 'Aktif') { + Auth::logout(); + return back()->with('error', 'Akun Anda sedang dalam tahap verifikasi admin. Mohon tunggu.'); + } + + $request->session()->regenerate(); + + // Redirect sesuai role jika diperlukan, atau ke dashboard utama + return redirect()->intended('/dashboard')->with('success', 'Selamat datang kembali!'); + } + + return back()->withErrors([ + 'email' => 'Email atau password yang Anda masukkan salah.', + ])->onlyInput('email'); + } + + /** + * Menampilkan Halaman Register + */ + public function showRegister() + { + $data_kolat = Kolat::all(); + return view('login-register.register', compact('data_kolat')); + } + + /** + * Proses Register (User & Anggota) + */ + public function register(Request $request) + { + // 1. Validasi Input + $request->validate([ + 'email' => 'required|email|unique:users,email', + 'password' => 'required|min:6|confirmed', + 'nama_lengkap' => 'required|string|max:255', + 'no_hp' => 'required', + 'jenis_kelamin' => 'required|in:L,P', + 'tempat_lahir' => 'required', + 'tgl_lahir' => 'required|date', + 'alamat' => 'required', + 'kolat_id' => 'required|exists:kolat,id', + 'tingkatan' => 'required', + 'tgl_gabung' => 'required|date', + ]); + + // Cari ID Role "Anggota" + $role = Role::where('nama_role', 'Anggota')->first(); + $role_id = $role ? $role->id : 2; + + // Gunakan Transaction agar data User & Anggota sinkron + DB::beginTransaction(); + + try { + // 2. Buat Akun User + $user = User::create([ + 'email' => $request->email, + 'password' => Hash::make($request->password), + 'role_id' => $role_id, + ]); + + // 3. Logika Penomoran Induk JB-xxx + $terakhir = Anggota::orderBy('id', 'desc')->first(); + $nomor_urut = $terakhir ? sprintf("%03d", intval(substr($terakhir->no_induk, 3)) + 1) : "001"; + $no_induk_baru = "JB-" . $nomor_urut; + + // 4. Buat Profil Anggota + Anggota::create([ + 'user_id' => $user->id, + 'no_induk' => $no_induk_baru, + 'nama_lengkap' => $request->nama_lengkap, + 'role_id' => $role_id, + 'jenis_kelamin' => $request->jenis_kelamin, + 'tempat_lahir' => $request->tempat_lahir, + 'tgl_lahir' => $request->tgl_lahir, + 'no_hp' => $request->no_hp, + 'kolat_id' => $request->kolat_id, + 'tingkatan' => $request->tingkatan, + 'tgl_gabung' => $request->tgl_gabung, + 'alamat' => $request->alamat, + 'catatan_medis' => $request->catatan_medis, + 'jabatan' => 'anggota', + 'status' => 'Non-Aktif', // Default sesuai permintaanmu + ]); + + DB::commit(); + + return redirect()->route('login')->with('success', 'Registrasi Berhasil! Akun Anda akan segera diverifikasi oleh Admin.'); + + } catch (\Exception $e) { + DB::rollBack(); + Log::error("Register Error: " . $e->getMessage()); + return back()->withInput()->with('error', 'Terjadi kesalahan sistem saat mendaftar.'); + } + } + + /** + * Proses Logout + */ + public function logout(Request $request) + { + Auth::logout(); + $request->session()->invalidate(); + $request->session()->regenerateToken(); + + return redirect('/login')->with('success', 'Anda telah berhasil keluar.'); + } +} diff --git a/manajemen_mp/app/Http/Controllers/DashboardController.php b/manajemen_mp/app/Http/Controllers/DashboardController.php new file mode 100644 index 0000000..86ca402 --- /dev/null +++ b/manajemen_mp/app/Http/Controllers/DashboardController.php @@ -0,0 +1,13 @@ +hasMany(Penilaian::class, 'pelatih_id'); } +// Anggota.php +public function user() +{ + return $this->belongsTo(User::class, 'user_id'); +} + } diff --git a/manajemen_mp/app/Models/User.php b/manajemen_mp/app/Models/User.php index 4d7f70f..598e32a 100644 --- a/manajemen_mp/app/Models/User.php +++ b/manajemen_mp/app/Models/User.php @@ -18,7 +18,7 @@ class User extends Authenticatable * @var array */ protected $fillable = [ - 'name', + 'role_id', 'email', 'password', ]; @@ -42,4 +42,16 @@ class User extends Authenticatable 'email_verified_at' => 'datetime', 'password' => 'hashed', ]; + + public function anggota() + { + // Setiap User memiliki satu data profil Anggota + return $this->hasOne(Anggota::class, 'user_id'); + } + + // Relasi ke tabel Role + public function role() + { + return $this->belongsTo(Role::class, 'role_id'); + } } 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 new file mode 100644 index 0000000..45b5036 --- /dev/null +++ b/manajemen_mp/database/migrations/2026_04_20_151749_add_role_id_to_users_table.php @@ -0,0 +1,29 @@ +foreignId('role_id')->after('id')->constrained('role')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropForeign(['role_id']); + $table->dropColumn('role_id'); + }); + } +}; diff --git a/manajemen_mp/database/migrations/2026_04_20_152009_add_user_id_to_anggotas_table.php b/manajemen_mp/database/migrations/2026_04_20_152009_add_user_id_to_anggotas_table.php new file mode 100644 index 0000000..e59592f --- /dev/null +++ b/manajemen_mp/database/migrations/2026_04_20_152009_add_user_id_to_anggotas_table.php @@ -0,0 +1,33 @@ +foreignId('user_id') + ->nullable() + ->after('id') + ->constrained('users') + ->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('anggotas', function (Blueprint $table) { + $table->dropForeign(['user_id']); + $table->dropColumn('user_id'); + }); + } +}; diff --git a/manajemen_mp/database/migrations/2026_04_20_153001_remove_name_from_users_table.php b/manajemen_mp/database/migrations/2026_04_20_153001_remove_name_from_users_table.php new file mode 100644 index 0000000..2622b56 --- /dev/null +++ b/manajemen_mp/database/migrations/2026_04_20_153001_remove_name_from_users_table.php @@ -0,0 +1,28 @@ +dropColumn('name'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->string('name')->after('id')->nullable(); + }); + } +}; diff --git a/manajemen_mp/database/seeders/DatabaseSeeder.php b/manajemen_mp/database/seeders/DatabaseSeeder.php index 3ae00ff..24fd953 100644 --- a/manajemen_mp/database/seeders/DatabaseSeeder.php +++ b/manajemen_mp/database/seeders/DatabaseSeeder.php @@ -21,5 +21,8 @@ public function run(): void // 'name' => 'Test User', // 'email' => 'test@example.com', // ]); + $this->call([ + RoleSeeder::class, + ]); } } diff --git a/manajemen_mp/resources/views/anggota/anggota.blade.php b/manajemen_mp/resources/views/anggota/anggota.blade.php index a6f1d48..bd50ccc 100644 --- a/manajemen_mp/resources/views/anggota/anggota.blade.php +++ b/manajemen_mp/resources/views/anggota/anggota.blade.php @@ -34,6 +34,7 @@ No Identitas Anggota + Email JK Tingkatan & Kolat Jabatan @@ -46,24 +47,34 @@ {{ $no + 1 }} -
{{ $item->nama_lengkap }}
- ID: {{ $item->no_induk }} +
{{ $item->nama_lengkap }} +
+ ID: + {{ $item->no_induk }} + + +
{{ $item->user->email ?? '-' }}
- + {{ $item->jenis_kelamin }} - {{ $item->tingkatan }} -
Kolat {{ $item->kolat->nama_kolat ?? '-' }}
+ {{ $item->tingkatan }} +
Kolat + {{ $item->kolat->nama_kolat ?? '-' }}
{{-- Karena di filter 'anggota', maka jabatan otomatis Anggota --}} - Anggota + Anggota - + {{ $item->status }} @@ -84,14 +95,17 @@ class="btn btn-sm btn-action-edit fw-bold px-3 shadow-xs"> {{-- MODAL DETAIL --}} -