# Implementasi CRUD Ekstrakurikuler & Kokurikuler

## 📋 Overview
Fitur manajemen ekstrakurikuler dan kokurikuler yang lengkap dengan:
- CRUD data ekstrakurikuler/kokurikuler
- Manajemen peserta siswa
- Input nilai dan predikat
- Otomatis terkoneksi ke rapor siswa

---

## ✅ Yang Sudah Selesai

### 1. **Controllers**
✅ **EkstrakurikulerController.php**
- `index()` - Menampilkan daftar ekstrakurikuler
- `create()` - Form tambah ekstrakurikuler
- `store()` - Simpan ekstrakurikuler baru
- `show()` - Detail ekstrakurikuler & daftar peserta
- `edit()` - Form edit ekstrakurikuler
- `update()` - Update ekstrakurikuler
- `destroy()` - Hapus ekstrakurikuler
- `manageStudents()` - Form kelola peserta
- `storeStudents()` - Simpan peserta
- `inputNilai()` - Form input nilai
- `updateNilai()` - Simpan nilai

✅ **KokurikulerController.php**
- Semua method sama dengan EkstrakurikulerController

### 2. **Routes** 
✅ **routes/web.php**
```php
// Ekstrakurikuler
Route::resource('ekstrakurikuler', EkstrakurikulerController::class);
Route::get('ekstrakurikuler/{ekstrakurikuler}/manage-students', ...)->name('ekstrakurikuler.manage-students');
Route::post('ekstrakurikuler/{ekstrakurikuler}/store-students', ...)->name('ekstrakurikuler.store-students');
Route::get('ekstrakurikuler/{ekstrakurikuler}/input-nilai', ...)->name('ekstrakurikuler.input-nilai');
Route::put('ekstrakurikuler/{ekstrakurikuler}/update-nilai', ...)->name('ekstrakurikuler.update-nilai');

// Kokurikuler
Route::resource('kokurikuler', KokurikulerController::class);
Route::get('kokurikuler/{kokurikuler}/manage-students', ...)->name('kokurikuler.manage-students');
Route::post('kokurikuler/{kokurikuler}/store-students', ...)->name('kokurikuler.store-students');
Route::get('kokurikuler/{kokurikuler}/input-nilai', ...)->name('kokurikuler.input-nilai');
Route::put('kokurikuler/{kokurikuler}/update-nilai', ...)->name('kokurikuler.update-nilai');
```

### 3. **Models**
✅ `app/Models/Ekstrakurikuler.php` - Sudah ada sebelumnya
✅ `app/Models/Kokurikuler.php` - Sudah dibuat

### 4. **Database**
✅ Tabel `ekstrakurikulers` - Sudah ada
✅ Tabel `siswa_ekstrakurikuler` - Sudah ada  
✅ Tabel `kokurikulers` - Sudah dibuat
✅ Tabel `siswa_kokurikuler` - Sudah dibuat

### 5. **Integrasi Rapor**
✅ RaporController sudah diupdate untuk load data ekstrakurikuler & kokurikuler
✅ View rapor print sudah ditambahkan section ekstrakurikuler & kokurikuler

---

## 📝 Yang Perlu Dibuat (Views)

Anda perlu membuat file-file view berikut:

### Ekstrakurikuler Views:
```
resources/views/simaju/ekstrakurikuler/
├── index.blade.php         - Daftar ekstrakurikuler
├── create.blade.php        - Form tambah ekstrakurikuler
├── edit.blade.php          - Form edit ekstrakurikuler
├── show.blade.php          - Detail & daftar peserta
├── manage-students.blade.php - Form kelola peserta
└── input-nilai.blade.php   - Form input nilai
```

### Kokurikuler Views:
```
resources/views/simaju/kokurikuler/
├── index.blade.php         - Daftar kokurikuler
├── create.blade.php        - Form tambah kokurikuler
├── edit.blade.php          - Form edit kokurikuler
├── show.blade.php          - Detail & daftar peserta
├── manage-students.blade.php - Form kelola peserta
└── input-nilai.blade.php   - Form input nilai
```

---

## 🎨 Template View (Contoh index.blade.php)

Saya akan berikan contoh struktur dasar yang bisa Anda duplikasi:

### resources/views/simaju/ekstrakurikuler/index.blade.php
```blade
@extends('simaju.layouts.main')

@section('title', 'Ekstrakurikuler')

@section('content')
<div class="container-fluid py-4">
    <div class="row">
        <div class="col-12">
            <div class="card">
                <div class="card-header pb-0">
                    <div class="d-flex justify-content-between align-items-center">
                        <h6>Data Ekstrakurikuler</h6>
                        <a href="{{ route('simaju.ekstrakurikuler.create') }}" class="btn btn-primary btn-sm">
                            <i class="fas fa-plus"></i> Tambah Ekstrakurikuler
                        </a>
                    </div>
                </div>
                <div class="card-body">
                    <!-- Filter & Search -->
                    <form method="GET" class="mb-3">
                        <div class="row">
                            <div class="col-md-4">
                                <input type="text" name="search" class="form-control" placeholder="Cari nama..." value="{{ request('search') }}">
                            </div>
                            <div class="col-md-3">
                                <select name="status" class="form-control">
                                    <option value="">Semua Status</option>
                                    <option value="aktif" {{ request('status') == 'aktif' ? 'selected' : '' }}>Aktif</option>
                                    <option value="nonaktif" {{ request('status') == 'nonaktif' ? 'selected' : '' }}>Non-Aktif</option>
                                </select>
                            </div>
                            <div class="col-md-2">
                                <button type="submit" class="btn btn-info btn-sm">Filter</button>
                            </div>
                        </div>
                    </form>

                    <!-- Table -->
                    <div class="table-responsive">
                        <table class="table align-items-center mb-0">
                            <thead>
                                <tr>
                                    <th>No</th>
                                    <th>Nama</th>
                                    <th>Jenis</th>
                                    <th>Pembina</th>
                                    <th>Hari</th>
                                    <th>Waktu</th>
                                    <th>Status</th>
                                    <th>Aksi</th>
                                </tr>
                            </thead>
                            <tbody>
                                @forelse($ekstrakurikulers as $ekskul)
                                <tr>
                                    <td>{{ $loop->iteration + ($ekstrakurikulers->currentPage() - 1) * $ekstrakurikulers->perPage() }}</td>
                                    <td>{{ $ekskul->nama }}</td>
                                    <td>{{ ucfirst($ekskul->jenis) }}</td>
                                    <td>{{ $ekskul->pembina->nama ?? '-' }}</td>
                                    <td>{{ $ekskul->hari ?? '-' }}</td>
                                    <td>{{ $ekskul->jam_mulai ? $ekskul->jam_mulai->format('H:i') : '-' }} - {{ $ekskul->jam_selesai ? $ekskul->jam_selesai->format('H:i') : '-' }}</td>
                                    <td>
                                        <span class="badge bg-{{ $ekskul->status == 'aktif' ? 'success' : 'secondary' }}">
                                            {{ ucfirst($ekskul->status) }}
                                        </span>
                                    </td>
                                    <td>
                                        <a href="{{ route('simaju.ekstrakurikuler.show', $ekskul) }}" class="btn btn-info btn-sm">Detail</a>
                                        <a href="{{ route('simaju.ekstrakurikuler.edit', $ekskul) }}" class="btn btn-warning btn-sm">Edit</a>
                                        <form action="{{ route('simaju.ekstrakurikuler.destroy', $ekskul) }}" method="POST" class="d-inline">
                                            @csrf
                                            @method('DELETE')
                                            <button type="submit" class="btn btn-danger btn-sm" onclick="return confirm('Yakin hapus?')">Hapus</button>
                                        </form>
                                    </td>
                                </tr>
                                @empty
                                <tr>
                                    <td colspan="8" class="text-center">Tidak ada data</td>
                                </tr>
                                @endforelse
                            </tbody>
                        </table>
                    </div>

                    <!-- Pagination -->
                    <div class="mt-3">
                        {{ $ekstrakurikulers->links() }}
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection
```

---

## 🔗 Menambahkan Menu di Sidebar

Tambahkan di `resources/views/simaju/layouts/main.blade.php` di bagian menu Akademik:

```blade
<!-- Dalam menu Akademik -->
<li class="nav-item">
    <a class="nav-link {{ request()->routeIs('simaju.ekstrakurikuler.*') ? 'active' : '' }}" 
       href="{{ route('simaju.ekstrakurikuler.index') }}">
        <i class="fas fa-running"></i>
        <span class="nav-link-text ms-1">Ekstrakurikuler</span>
    </a>
</li>

<li class="nav-item">
    <a class="nav-link {{ request()->routeIs('simaju.kokurikuler.*') ? 'active' : '' }}" 
       href="{{ route('simaju.kokurikuler.index') }}">
        <i class="fas fa-users"></i>
        <span class="nav-link-text ms-1">Kokurikuler</span>
    </a>
</li>
```

---

## 🎯 Flow Kerja

### 1. **Mengelola Ekstrakurikuler/Kokurikuler:**
1. Admin/Guru akses menu Ekstrakurikuler/Kokurikuler
2. Klik "Tambah" untuk membuat kegiatan baru
3. Isi form: Nama, Jenis, Pembina, Jadwal, dll
4. Simpan

### 2. **Mengelola Peserta:**
1. Dari halaman index, klik "Detail" pada kegiatan
2. Klik "Kelola Peserta"
3. Centang siswa yang mengikuti kegiatan
4. Simpan (otomatis tersimpan untuk tahun ajaran & semester saat ini)

### 3. **Input Nilai:**
1. Dari halaman detail kegiatan
2. Klik "Input Nilai"
3. Isi nilai, predikat (A/B/C/D), dan keterangan untuk setiap siswa
4. Simpan

### 4. **Data Muncul di Rapor:**
- Data otomatis muncul saat rapor digenerate/dicetak
- Filter berdasarkan siswa_id, tahun_ajaran, dan semester
- Tampil di section "Ekstrakurikuler" dan "Kokurikuler"

---

## 📊 Struktur Predikat

| Predikat | Keterangan | Nilai |
|----------|------------|-------|
| A | Sangat Baik | 85-100 |
| B | Baik | 70-84 |
| C | Cukup | 55-69 |
| D | Kurang | <55 |

---

## 🧪 Testing

### 1. Test CRUD Ekstrakurikuler
```
URL: /simaju/ekstrakurikuler
- Buat kegiatan baru
- Edit kegiatan
- Hapus kegiatan
```

### 2. Test Kelola Peserta
```
URL: /simaju/ekstrakurikuler/{id}/manage-students
- Tambah peserta
- Hapus peserta
```

### 3. Test Input Nilai
```
URL: /simaju/ekstrakurikuler/{id}/input-nilai
- Input nilai, predikat, keterangan
- Verifikasi tersimpan
```

### 4. Test Integrasi Rapor
```
URL: /simaju/rapor/{id}/preview
- Cek apakah data ekstrakurikuler muncul
- Cek apakah data kokurikuler muncul
```

---

## 🔐 Access Control

✅ Middleware: `role:admin,guru`
- Admin dapat akses semua fitur
- Guru dapat akses semua fitur
- Wali Kelas otomatis dapat akses (karena role = guru)

---

## 📁 Files Created

1. ✅ `app/Http/Controllers/Simaju/EkstrakurikulerController.php`
2. ✅ `app/Http/Controllers/Simaju/KokurikulerController.php`
3. ✅ `app/Models/Kokurikuler.php`
4. ✅ `database/migrations/2026_08_02_075404_create_kokurikulers_table.php`
5. ✅ Routes updated in `routes/web.php`
6. ✅ RaporController updated
7. ✅ Rapor print view updated

---

## 📝 Next Steps (Yang Perlu Anda Lakukan)

1. ⬜ **Buat semua view files** (gunakan contoh template di atas)
2. ⬜ **Tambahkan menu di sidebar** (copy code di atas)
3. ⬜ **Test semua fitur** (CRUD, kelola peserta, input nilai)
4. ⬜ **Verifikasi data muncul di rapor**
5. ⬜ **Styling sesuai kebutuhan**

---

## 💡 Tips Membuat Views

1. **Duplicate & Modify**: 
   - Copy view dari module lain (misalnya dari nilai atau absensi)
   - Modify sesuai kebutuhan ekstrakurikuler/kokurikuler

2. **Gunakan Layout yang Sama**:
   ```blade
   @extends('simaju.layouts.main')
   ```

3. **Form Elements**:
   - Input text untuk nama
   - Textarea untuk deskripsi
   - Select untuk pembina (dari tabel gurus)
   - Select untuk status (aktif/nonaktif)
   - Time picker untuk jam

4. **Checkbox untuk Kelola Peserta**:
   ```blade
   @foreach($allSiswas as $siswa)
   <div class="form-check">
       <input type="checkbox" name="siswa_ids[]" value="{{ $siswa->id }}" 
              {{ in_array($siswa->id, $enrolledIds) ? 'checked' : '' }}>
       <label>{{ $siswa->nama }} - {{ $siswa->kelas->nama_kelas }}</label>
   </div>
   @endforeach
   ```

---

## ✅ Summary

**Backend sudah 100% selesai!** 
- ✅ Controllers lengkap dengan semua method
- ✅ Routes sudah ditambahkan
- ✅ Models sudah ada
- ✅ Database sudah di-migrate
- ✅ Integrasi dengan rapor sudah selesai

**Yang tinggal dibuat: Views (Frontend)**
- Copy structure dari module lain
- Sesuaikan field dengan ekstrakurikuler/kokurikuler
- Test dan styling

---

Implementasi backend berhasil! Data yang diinput akan otomatis terkoneksi ke rapor siswa. 🎉
