# Implementasi Ekstrakurikuler dan Kokurikuler di Rapor

## 📋 Overview
Fitur ini menambahkan tampilan data **Ekstrakurikuler** dan **Kokurikuler** pada rapor siswa.

---

## 🗂️ Struktur Database

### Tabel: `kokurikulers`
```sql
- id (primary key)
- nama (string)
- deskripsi (text, nullable)
- pembina_id (foreign key ke gurus, nullable)
- status (enum: aktif, nonaktif)
- timestamps
```

### Tabel: `siswa_kokurikuler` (Pivot Table)
```sql
- id (primary key)
- siswa_id (foreign key ke siswas)
- kokurikuler_id (foreign key ke kokurikulers)
- tahun_ajaran (string)
- semester (enum: ganjil, genap)
- nilai (integer, nullable)
- keterangan (text, nullable)
- predikat (enum: A, B, C, D, nullable)
- timestamps
- unique constraint: siswa_id, kokurikuler_id, tahun_ajaran, semester
```

### Tabel: `ekstrakurikulers` (Sudah Ada Sebelumnya)
```sql
- id (primary key)
- nama (string)
- jenis (enum: ekstrakurikuler, intrakurikuler, kokurikuler)
- deskripsi (text, nullable)
- pembina_id (foreign key ke gurus, nullable)
- hari (string, nullable)
- jam_mulai (time, nullable)
- jam_selesai (time, nullable)
- tempat (string, nullable)
- status (enum: aktif, nonaktif)
- timestamps
```

### Tabel: `siswa_ekstrakurikuler` (Pivot Table - Sudah Ada)
```sql
- id (primary key)
- siswa_id (foreign key ke siswas)
- ekstrakurikuler_id (foreign key ke ekstrakurikulers)
- tahun_ajaran (string)
- semester (enum: ganjil, genap)
- nilai (integer, nullable)
- keterangan (text, nullable)
- predikat (enum: A, B, C, D, nullable)
- timestamps
- unique constraint: siswa_id, ekstrakurikuler_id, tahun_ajaran, semester
```

---

## 📁 File yang Dibuat/Dimodifikasi

### 1. Migration
- **File**: `database/migrations/2026_08_02_075404_create_kokurikulers_table.php`
- **Tujuan**: Membuat tabel `kokurikulers` dan `siswa_kokurikuler`

### 2. Model
- **File**: `app/Models/Kokurikuler.php`
- **Fitur**:
  - Relasi ke Guru (pembina)
  - Relasi many-to-many ke Siswa
  - Method `siswasByPeriode()` untuk filter berdasarkan tahun ajaran dan semester

### 3. Controller
- **File**: `app/Http/Controllers/Simaju/RaporController.php`
- **Modifikasi**:
  - Import model `Ekstrakurikuler` dan `Kokurikuler`
  - Method `preview()`: Load data ekstrakurikuler dan kokurikuler
  - Method `print()`: Load data ekstrakurikuler dan kokurikuler untuk PDF

### 4. View
- **File**: `resources/views/simaju/rapor/print.blade.php`
- **Modifikasi**:
  - Mengganti section "Kekuruhan" dengan "Ekstrakurikuler" yang lebih terstruktur
  - Menambahkan section "Kokurikuler" baru
  - Tampilan tabel dengan kolom: No, Kegiatan, Predikat, Keterangan

---

## 🔍 Cara Kerja

### 1. Load Data di Controller
```php
// Get Ekstrakurikuler data
$ekstrakurikulers = \DB::table('siswa_ekstrakurikuler')
    ->join('ekstrakurikulers', 'siswa_ekstrakurikuler.ekstrakurikuler_id', '=', 'ekstrakurikulers.id')
    ->where('siswa_ekstrakurikuler.siswa_id', $rapor->siswa_id)
    ->where('siswa_ekstrakurikuler.tahun_ajaran', $rapor->tahun_ajaran)
    ->where('siswa_ekstrakurikuler.semester', $rapor->semester)
    ->select('ekstrakurikulers.nama', 'siswa_ekstrakurikuler.nilai', 'siswa_ekstrakurikuler.keterangan', 'siswa_ekstrakurikuler.predikat')
    ->get();

// Get Kokurikuler data
$kokurikulers = \DB::table('siswa_kokurikuler')
    ->join('kokurikulers', 'siswa_kokurikuler.kokurikuler_id', '=', 'kokurikulers.id')
    ->where('siswa_kokurikuler.siswa_id', $rapor->siswa_id)
    ->where('siswa_kokurikuler.tahun_ajaran', $rapor->tahun_ajaran)
    ->where('siswa_kokurikuler.semester', $rapor->semester)
    ->select('kokurikulers.nama', 'siswa_kokurikuler.nilai', 'siswa_kokurikuler.keterangan', 'siswa_kokurikuler.predikat')
    ->get();
```

### 2. Tampilan di View
```blade
<!-- Ekstrakurikuler -->
<div class="footer-section">
    <table class="footer-table">
        <thead>
            <tr>
                <th colspan="4">Ekstrakurikuler</th>
            </tr>
            <tr>
                <th style="width: 30px;">No</th>
                <th>Kegiatan</th>
                <th style="width: 80px;">Predikat</th>
                <th style="width: 200px;">Keterangan</th>
            </tr>
        </thead>
        <tbody>
            @if(isset($ekstrakurikulers) && $ekstrakurikulers->count() > 0)
                @foreach($ekstrakurikulers as $index => $ekskul)
                <tr>
                    <td style="text-align: center;">{{ $index + 1 }}</td>
                    <td>{{ $ekskul->nama }}</td>
                    <td style="text-align: center;">{{ $ekskul->predikat ?? '-' }}</td>
                    <td>{{ $ekskul->keterangan ?? '-' }}</td>
                </tr>
                @endforeach
            @else
                <tr>
                    <td colspan="4" style="text-align: center; font-style: italic;">Tidak ada data ekstrakurikuler</td>
                </tr>
            @endif
        </tbody>
    </table>
</div>

<!-- Kokurikuler -->
<div class="footer-section" style="margin-top: 10px;">
    <table class="footer-table">
        <thead>
            <tr>
                <th colspan="4">Kokurikuler</th>
            </tr>
            <tr>
                <th style="width: 30px;">No</th>
                <th>Kegiatan</th>
                <th style="width: 80px;">Predikat</th>
                <th style="width: 200px;">Keterangan</th>
            </tr>
        </thead>
        <tbody>
            @if(isset($kokurikulers) && $kokurikulers->count() > 0)
                @foreach($kokurikulers as $index => $kokur)
                <tr>
                    <td style="text-align: center;">{{ $index + 1 }}</td>
                    <td>{{ $kokur->nama }}</td>
                    <td style="text-align: center;">{{ $kokur->predikat ?? '-' }}</td>
                    <td>{{ $kokur->keterangan ?? '-' }}</td>
                </tr>
                @endforeach
            @else
                <tr>
                    <td colspan="4" style="text-align: center; font-style: italic;">Tidak ada data kokurikuler</td>
                </tr>
            @endif
        </tbody>
    </table>
</div>
```

---

## 💾 Cara Input Data

### 1. Menambahkan Kegiatan Kokurikuler
```sql
INSERT INTO kokurikulers (nama, deskripsi, pembina_id, status, created_at, updated_at)
VALUES ('PMR (Palang Merah Remaja)', 'Kegiatan sosial dan kemanusiaan', 1, 'aktif', NOW(), NOW());
```

### 2. Mendaftarkan Siswa ke Kokurikuler
```sql
INSERT INTO siswa_kokurikuler 
(siswa_id, kokurikuler_id, tahun_ajaran, semester, nilai, keterangan, predikat, created_at, updated_at)
VALUES 
(1, 1, '2024/2025', 'ganjil', 85, 'Aktif mengikuti kegiatan PMR', 'A', NOW(), NOW());
```

### 3. Mendaftarkan Siswa ke Ekstrakurikuler
```sql
-- Ekstrakurikuler sudah ada, tinggal input data pivot
INSERT INTO siswa_ekstrakurikuler 
(siswa_id, ekstrakurikuler_id, tahun_ajaran, semester, nilai, keterangan, predikat, created_at, updated_at)
VALUES 
(1, 1, '2024/2025', 'ganjil', 90, 'Sangat aktif dalam kegiatan pramuka', 'A', NOW(), NOW());
```

---

## 🎯 Contoh Data

### Ekstrakurikuler
| Nama Kegiatan | Predikat | Keterangan |
|---------------|----------|------------|
| Pramuka | A | Sangat aktif dalam kegiatan kepramukaan |
| Paskibra | B | Baik dalam latihan baris-berbaris |
| Voli | A | Aktif dalam tim voli sekolah |

### Kokurikuler
| Nama Kegiatan | Predikat | Keterangan |
|---------------|----------|------------|
| PMR | A | Aktif dalam kegiatan sosial |
| Pramuka Penggalang | B | Mengikuti kegiatan dengan baik |
| Kegiatan Rohani | A | Rajin mengikuti kegiatan keagamaan |

---

## 📊 Predikat
- **A**: Sangat Baik (Nilai 85-100)
- **B**: Baik (Nilai 70-84)
- **C**: Cukup (Nilai 55-69)
- **D**: Kurang (Nilai < 55)

---

## 🧪 Testing

### 1. Cek Tampilan Preview Rapor
```
URL: /simaju/rapor/{id}/preview
```

### 2. Cek Tampilan Print/PDF Rapor
```
URL: /simaju/rapor/{id}/print
```

### 3. Verifikasi Data
- Pastikan data ekstrakurikuler muncul jika siswa terdaftar
- Pastikan data kokurikuler muncul jika siswa terdaftar
- Jika tidak ada data, tampilkan pesan "Tidak ada data..."

---

## 🔐 Catatan Penting

1. **Data Otomatis**: Data ekstrakurikuler dan kokurikuler akan otomatis muncul di rapor berdasarkan:
   - siswa_id
   - tahun_ajaran
   - semester

2. **Struktur Fleksibel**: 
   - Satu siswa bisa ikut banyak ekstrakurikuler/kokurikuler
   - Setiap kegiatan bisa diisi nilai, predikat, dan keterangan

3. **Pembina**: 
   - Setiap kegiatan bisa memiliki pembina (guru)
   - Pembina bersifat opsional (nullable)

4. **Status**: 
   - Hanya kegiatan dengan status 'aktif' yang biasanya ditampilkan
   - Data historis tetap tersimpan walaupun status diubah

---

## 📝 TODO (Pengembangan Selanjutnya)

- [ ] Membuat CRUD untuk manajemen ekstrakurikuler
- [ ] Membuat CRUD untuk manajemen kokurikuler
- [ ] Membuat form pendaftaran siswa ke ekstrakurikuler/kokurikuler
- [ ] Membuat laporan kehadiran ekstrakurikuler/kokurikuler
- [ ] Menambahkan fitur import/export data

---

## ✅ Status Implementasi

- [x] Membuat migration untuk tabel kokurikuler
- [x] Membuat model Kokurikuler
- [x] Update RaporController untuk load data
- [x] Update view rapor print untuk tampilkan data
- [x] Testing tampilan rapor

---

Implementasi berhasil! 🎉
Data ekstrakurikuler dan kokurikuler sekarang akan muncul di rapor siswa.
