From 2092a810ce3a3a7edb6efcd6c90ae4cde42c0e8d Mon Sep 17 00:00:00 2001 From: SitiAfiah Date: Mon, 20 Apr 2026 19:10:44 +0700 Subject: [PATCH] pengumuman (masih eror) --- .../Http/Controllers/AnggotaController.php | 75 +++--- .../app/Http/Controllers/JadwalController.php | 103 +++++++ .../Http/Controllers/PelatihController.php | 98 ++++++- .../Http/Controllers/PenilaianController.php | 10 + .../Http/Controllers/PresensiController.php | 10 + manajemen_mp/app/Models/Anggota.php | 38 ++- manajemen_mp/app/Models/Jadwal.php | 42 +++ manajemen_mp/app/Models/Penilaian.php | 33 +++ manajemen_mp/app/Models/Presensi.php | 30 +++ ...2026_04_13_165528_create_jadwals_table.php | 36 +++ ...26_04_13_165708_create_presensis_table.php | 32 +++ ...6_04_13_170757_create_penilaians_table.php | 37 +++ .../resources/views/anggota/anggota.blade.php | 254 ++++-------------- .../views/anggota/anggotacreate.blade.php | 128 +++++---- .../resources/views/jadwal/jadwal.blade.php | 208 ++++++++++++++ .../views/jadwal/jadwalcreate.blade.php | 164 +++++++++++ .../resources/views/pelatih/pelatih.blade.php | 167 ++++-------- .../views/pelatih/pelatihcreate.blade.php | 205 +++++--------- manajemen_mp/routes/web.php | 25 +- 19 files changed, 1140 insertions(+), 555 deletions(-) create mode 100644 manajemen_mp/app/Http/Controllers/JadwalController.php create mode 100644 manajemen_mp/app/Http/Controllers/PenilaianController.php create mode 100644 manajemen_mp/app/Http/Controllers/PresensiController.php create mode 100644 manajemen_mp/app/Models/Jadwal.php create mode 100644 manajemen_mp/app/Models/Penilaian.php create mode 100644 manajemen_mp/app/Models/Presensi.php create mode 100644 manajemen_mp/database/migrations/2026_04_13_165528_create_jadwals_table.php create mode 100644 manajemen_mp/database/migrations/2026_04_13_165708_create_presensis_table.php create mode 100644 manajemen_mp/database/migrations/2026_04_13_170757_create_penilaians_table.php create mode 100644 manajemen_mp/resources/views/jadwal/jadwal.blade.php create mode 100644 manajemen_mp/resources/views/jadwal/jadwalcreate.blade.php diff --git a/manajemen_mp/app/Http/Controllers/AnggotaController.php b/manajemen_mp/app/Http/Controllers/AnggotaController.php index dcfa073..3250941 100644 --- a/manajemen_mp/app/Http/Controllers/AnggotaController.php +++ b/manajemen_mp/app/Http/Controllers/AnggotaController.php @@ -12,9 +12,12 @@ class AnggotaController extends Controller // 1. Menampilkan Daftar Anggota public function anggota() { - // Menggunakan with('kolat') agar data relasi langsung terbawa (Eager Loading) - $data_anggota = Anggota::with(['kolat', 'role'])->get(); - return view('anggota.anggota', compact('data_anggota')); + // Filter data: Ambil anggota yang relasi 'role'-nya bernama 'Anggota' + $data_anggota = Anggota::whereHas('role', function($query) { + $query->where('nama_role', 'Anggota'); + })->with(['kolat', 'role'])->get(); + + return view('anggota.anggota', compact('data_anggota')); } // 2. Menampilkan Form Tambah @@ -22,52 +25,55 @@ public function create() { // Ambil semua daftar kolat untuk ditampilkan di dropdown form $data_kolat = Kolat::all(); - return view('anggota.anggotacreate', compact('data_kolat')); + $data_role = Role::all(); + + return view('anggota.anggotacreate', compact('data_kolat', 'data_role')); } - // 3. Menyimpan Anggota Baru public function store(Request $request) - { - // Validasi data - $request->validate([ - 'nama_lengkap' => 'required', - 'jabatan' => 'required|in:pengurus,pelatih,anggota', - 'no_hp' => 'required', - 'role_id' => 'required', - 'kolat_id' => 'required|exists:kolat,id', // Validasi ID kolat harus ada di tabel kolat - ]); +{ + // 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', + ]); - // Logika Membuat No Induk Otomatis (JB-001) - $terakhir = Anggota::orderBy('id', 'desc')->first(); + // 2. Ambil nama role untuk mengisi kolom jabatan secara otomatis + $role = Role::find($request->role_id); + $nama_jabatan = strtolower($role->nama_role); - if (!$terakhir) { - $nomor_urut = "001"; - } else { - // Ambil angka setelah "JB-" (JB-001 -> 001) - $nomor_terakhir = substr($terakhir->no_induk, 3); - $nomor_urut = sprintf("%03d", intval($nomor_terakhir) + 1); - } + // 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; - $no_induk_baru = "JB-" . $nomor_urut; + // 4. Gabungkan semua data + $data = $request->all(); + $data['no_induk'] = $no_induk_baru; + $data['jabatan'] = $nama_jabatan; // Mengisi kolom jabatan otomatis - // Gabungkan data input dengan No Induk otomatis - $data = $request->all(); - $data['no_induk'] = $no_induk_baru; + // 5. Simpan (Pastikan fillable di Model sudah lengkap) + Anggota::create($data); - // Simpan ke database - Anggota::create($data); - - return redirect()->route('anggota.anggota') - ->with('success', 'Anggota ' . $request->nama_lengkap . ' berhasil terdaftar dengan ID: ' . $no_induk_baru); - } + return redirect()->route('anggota.anggota') + ->with('success', 'Anggota berhasil terdaftar!'); +} // 4. Menampilkan Form Edit public function edit($id) { $anggota = Anggota::findOrFail($id); $data_kolat = Kolat::all(); // Ambil daftar kolat lagi untuk pilihan saat edit + $data_role = Role::all(); - return view('anggota.editanggota', compact('anggota', 'data_kolat')); + return view('anggota.editanggota', compact('anggota', 'data_kolat', 'data_role')); } // 5. Update Data Anggota @@ -89,4 +95,5 @@ public function update(Request $request, $id) return redirect()->route('anggota.anggota') ->with('success', 'Data ' . $anggota->nama_lengkap . ' Berhasil Diperbarui!'); } + } diff --git a/manajemen_mp/app/Http/Controllers/JadwalController.php b/manajemen_mp/app/Http/Controllers/JadwalController.php new file mode 100644 index 0000000..8bf1735 --- /dev/null +++ b/manajemen_mp/app/Http/Controllers/JadwalController.php @@ -0,0 +1,103 @@ +orderBy('tanggal', 'desc')->get(); + + return view('jadwal.jadwal', compact('data_jadwal')); + } + + + public function create() + { + $data_kolat = Kolat::all(); + $rolePelatih = Role::where('nama_role', 'Pelatih')->first(); + + // Ambil Anggota yang memiliki role 'Pelatih' saja (filter lewat relasi) + $data_pelatih = Anggota::whereHas('role', function($query) { + $query->where('nama_role', 'Pelatih'); + })->get(); + + return view('jadwal.jadwalcreate', compact('data_kolat', 'data_pelatih')); + } + + + public function store(Request $request) + { + $request->validate([ + 'judul_kegiatan' => 'required|string|max:255', + 'kolat_id' => 'required|exists:kolat,id', + 'pelatih_id' => 'required|exists:anggotas,id', + 'jenis' => 'required|in:Rutin,Tambahan,Pengumuman', + 'tanggal' => 'required|date', + 'jam_mulai' => 'required', + 'lokasi' => 'required|string', + ]); + + Jadwal::create($request->all()); + + return redirect()->route('jadwal.index') + ->with('success', 'Jadwal latihan berhasil ditambahkan!'); + } + + public function show($id) +{ + // Ambil satu data dengan relasinya + $jadwal = Jadwal::with(['kolat', 'pelatih'])->findOrFail($id); + + return view('jadwal.show', compact('jadwal')); +} + + public function edit($id) + { + $jadwal = Jadwal::findOrFail($id); + $data_kolat = Kolat::all(); + + // Tetap filter agar hanya muncul daftar pelatih + $data_pelatih = Anggota::whereHas('role', function($query) { + $query->where('nama_role', 'Pelatih'); + })->get(); + + return view('jadwal.edit', compact('jadwal', 'data_kolat', 'data_pelatih')); + } + + + public function update(Request $request, $id) + { + $jadwal = Jadwal::findOrFail($id); + + $request->validate([ + 'judul_kegiatan' => 'required|string', + 'kolat_id' => 'required', + 'pelatih_id' => 'required', + 'tanggal' => 'required|date', + ]); + + $jadwal->update($request->all()); + + return redirect()->route('jadwal.index') + ->with('success', 'Jadwal berhasil diperbarui!'); + } + + + public function destroy($id) + { + $jadwal = Jadwal::findOrFail($id); + $jadwal->delete(); + + return redirect()->route('jadwal.index') + ->with('success', 'Jadwal telah dihapus dari sistem.'); + } +} diff --git a/manajemen_mp/app/Http/Controllers/PelatihController.php b/manajemen_mp/app/Http/Controllers/PelatihController.php index a295a2e..6befb87 100644 --- a/manajemen_mp/app/Http/Controllers/PelatihController.php +++ b/manajemen_mp/app/Http/Controllers/PelatihController.php @@ -1,12 +1,104 @@ where('nama_role', 'Pelatih'); + })->with('kolat')->get(); + + return view('pelatih.pelatih', compact('data_pelatih')); + } + + // Menampilkan form untuk upgrade anggota ke pelatih + public function create() + { + // Ambil anggota yang role-nya masih 'Anggota' (bukan pelatih) + $calon_pelatih = Anggota::whereHas('role', function($q) { + $q->where('nama_role', 'Anggota'); + })->get(); + + return view('pelatih.pelatihcreate', compact('calon_pelatih')); + } + + // Proses Upgrade Anggota ke Pelatih + public function store(Request $request) + { + $request->validate([ + 'anggota_id' => 'required|exists:anggotas,id', + 'no_sk' => 'required|unique:anggotas,no_sk', + 'tgl_sk' => 'required|date', + 'masa_berlaku' => 'required|date', + 'foto_sk' => 'nullable|image|mimes:jpg,png,jpeg|max:2048', + ]); + + // Cari data anggota berdasarkan ID yang dipilih + $anggota = Anggota::findOrFail($request->anggota_id); + + // Cari ID Role Pelatih + $rolePelatih = Role::where('nama_role', 'Pelatih')->first(); + + // Data yang akan diupdate + $updateData = [ + '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', + ]; + + // Handle upload foto SK jika ada + if ($request->hasFile('foto_sk')) { + $path = $request->file('foto_sk')->store('sk_pelatih', 'public'); + $updateData['foto_sk'] = $path; + } + + // Eksekusi Update + $anggota->update($updateData); + + return redirect()->route('pelatih.index') + ->with('success', $anggota->nama_lengkap . ' berhasil diupgrade menjadi Pelatih!'); + } + + // Menampilkan form edit data kepelatihan (misal perpanjang SK) + public function edit($id) + { + $pelatih = Anggota::findOrFail($id); + return view('pelatih.edit', compact('pelatih')); + } + + public function update(Request $request, $id) + { + $pelatih = Anggota::findOrFail($id); + + $request->validate([ + 'no_sk' => 'required|unique:anggotas,no_sk,' . $id, + 'tgl_sk' => 'required|date', + 'foto_sk' => 'nullable|image|max:2048', + ]); + + $data = $request->all(); + + if ($request->hasFile('foto_sk')) { + if ($pelatih->foto_sk) { + Storage::disk('public')->delete($pelatih->foto_sk); + } + $data['foto_sk'] = $request->file('foto_sk')->store('sk_pelatih', 'public'); + } + + $pelatih->update($data); + + return redirect()->route('pelatih.index')->with('success', 'Data kepelatihan diperbarui!'); } } diff --git a/manajemen_mp/app/Http/Controllers/PenilaianController.php b/manajemen_mp/app/Http/Controllers/PenilaianController.php new file mode 100644 index 0000000..ba21d52 --- /dev/null +++ b/manajemen_mp/app/Http/Controllers/PenilaianController.php @@ -0,0 +1,10 @@ +belongsTo(Role::class, 'role_id'); } + + // Relasi: Mendapatkan riwayat kehadiran anggota +public function riwayatPresensi() +{ + return $this->hasMany(Presensi::class, 'anggota_id'); +} + +// Relasi: Jika dia pelatih, mendapatkan semua jadwal tugasnya +public function jadwalMelatih() +{ + return $this->hasMany(Jadwal::class, 'pelatih_id'); +} + +// Relasi: Jika dia pelatih, mendapatkan semua evaluasi dari murid +public function evaluasiMasuk() +{ + return $this->hasMany(Penilaian::class, 'pelatih_id'); +} + } diff --git a/manajemen_mp/app/Models/Jadwal.php b/manajemen_mp/app/Models/Jadwal.php new file mode 100644 index 0000000..c80bd7e --- /dev/null +++ b/manajemen_mp/app/Models/Jadwal.php @@ -0,0 +1,42 @@ +belongsTo(Kolat::class, 'kolat_id'); + } + + // Relasi: Siapa pelatih yang bertugas di jadwal ini? + public function pelatih() + { + return $this->belongsTo(Anggota::class, 'pelatih_id'); + } + + // Relasi: Jadwal ini punya banyak data presensi anggota + public function presensi() + { + return $this->hasMany(Presensi::class, 'jadwal_id'); + } +} diff --git a/manajemen_mp/app/Models/Penilaian.php b/manajemen_mp/app/Models/Penilaian.php new file mode 100644 index 0000000..57d2f5f --- /dev/null +++ b/manajemen_mp/app/Models/Penilaian.php @@ -0,0 +1,33 @@ +belongsTo(Anggota::class, 'pelatih_id'); + } + + // Relasi: Siapa anggota yang memberikan nilai (penilai)? + public function penilai() + { + return $this->belongsTo(Anggota::class, 'anggota_id'); + } +} diff --git a/manajemen_mp/app/Models/Presensi.php b/manajemen_mp/app/Models/Presensi.php new file mode 100644 index 0000000..168c475 --- /dev/null +++ b/manajemen_mp/app/Models/Presensi.php @@ -0,0 +1,30 @@ +belongsTo(Jadwal::class, 'jadwal_id'); + } + + // Relasi: Siapa anggota yang melakukan presensi? + public function anggota() + { + return $this->belongsTo(Anggota::class, 'anggota_id'); + } +} diff --git a/manajemen_mp/database/migrations/2026_04_13_165528_create_jadwals_table.php b/manajemen_mp/database/migrations/2026_04_13_165528_create_jadwals_table.php new file mode 100644 index 0000000..09a2684 --- /dev/null +++ b/manajemen_mp/database/migrations/2026_04_13_165528_create_jadwals_table.php @@ -0,0 +1,36 @@ +id(); + $table->foreignId('kolat_id')->constrained('kolat')->onDelete('cascade'); + $table->foreignId('pelatih_id')->constrained('anggotas')->onDelete('cascade'); // Relasi ke anggota (yang rolenya pelatih) + $table->string('judul_kegiatan'); // Misal: Latihan Rutin, UKT, atau Pengumuman Libur + $table->enum('jenis', ['Rutin', 'Tambahan', 'Pengumuman']); + $table->date('tanggal'); + $table->time('jam_mulai'); + $table->time('jam_selesai')->nullable(); + $table->string('lokasi'); + $table->text('deskripsi')->nullable(); // Untuk isi pengumuman + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('jadwals'); + } +}; diff --git a/manajemen_mp/database/migrations/2026_04_13_165708_create_presensis_table.php b/manajemen_mp/database/migrations/2026_04_13_165708_create_presensis_table.php new file mode 100644 index 0000000..cacba96 --- /dev/null +++ b/manajemen_mp/database/migrations/2026_04_13_165708_create_presensis_table.php @@ -0,0 +1,32 @@ +id(); + $table->foreignId('jadwal_id')->constrained('jadwals')->onDelete('cascade'); + $table->foreignId('anggota_id')->constrained('anggotas')->onDelete('cascade'); + $table->enum('status', ['Hadir', 'Izin', 'Sakit', 'Alfa'])->default('Alfa'); + $table->text('keterangan')->nullable(); // Alasan izin/sakit + $table->timestamp('waktu_presensi')->nullable(); // Catat jam tepatnya dia absen + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('presensis'); + } +}; diff --git a/manajemen_mp/database/migrations/2026_04_13_170757_create_penilaians_table.php b/manajemen_mp/database/migrations/2026_04_13_170757_create_penilaians_table.php new file mode 100644 index 0000000..43a4b9d --- /dev/null +++ b/manajemen_mp/database/migrations/2026_04_13_170757_create_penilaians_table.php @@ -0,0 +1,37 @@ +id(); + $table->foreignId('pelatih_id')->constrained('anggotas')->onDelete('cascade'); // Pelatih yang dinilai + $table->foreignId('anggota_id')->constrained('anggotas')->onDelete('cascade'); // Anggota yang menilai + $table->date('bulan_evaluasi'); // Untuk menandai evaluasi bulan apa + + // Kriteria Evaluasi Pelatih (Skala 1-5 atau 1-10) + $table->integer('kedisiplinan')->default(0); + $table->integer('kejelasan_materi')->default(0); + $table->integer('penguasaan_teknik')->default(0); + $table->integer('sikap_perilaku')->default(0); // Etika pelatih + $table->text('kritik_saran')->nullable(); // Masukan dari anggota + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('penilaians'); + } +}; diff --git a/manajemen_mp/resources/views/anggota/anggota.blade.php b/manajemen_mp/resources/views/anggota/anggota.blade.php index 95ebce5..a6f1d48 100644 --- a/manajemen_mp/resources/views/anggota/anggota.blade.php +++ b/manajemen_mp/resources/views/anggota/anggota.blade.php @@ -42,41 +42,28 @@ - @foreach ($data_anggota as $no => $item) + @forelse ($data_anggota as $no => $item) {{ $no + 1 }} -
{{ $item->nama_lengkap }}
- ID: - {{ $item->no_induk }} +
{{ $item->nama_lengkap }}
+ ID: {{ $item->no_induk }} - + {{ $item->jenis_kelamin }} - {{ $item->tingkatan }} -
Kolat - {{ $item->asal_kolat }}
+ {{ $item->tingkatan }} +
Kolat {{ $item->kolat->nama_kolat ?? '-' }}
- @if ($item->jabatan == 'pelatih') - Pelatih - @elseif($item->jabatan == 'pengurus') - Pengurus - @else - Anggota - @endif + {{-- Karena di filter 'anggota', maka jabatan otomatis Anggota --}} + Anggota - + {{ $item->status }} @@ -95,17 +82,16 @@ class="btn btn-sm btn-action-edit fw-bold px-3 shadow-xs"> -