# Implementasi Akses Wali Kelas

## Ringkasan
Implementasi ini memungkinkan semua guru dengan jabatan "wali_kelas" untuk mengakses dan mengelola fitur-fitur tertentu dalam sistem SIMAJU.

## Fitur yang Dapat Diakses oleh Wali Kelas

### 1. **Rapor Siswa** ✅
- **Akses**: Penuh (CRUD + Print)
- **Batasan**: Hanya untuk siswa di kelas yang mereka bimbing
- **Fitur**:
  - Melihat daftar rapor siswa di kelasnya
  - Membuat rapor baru untuk siswa di kelasnya
  - Melihat detail rapor
  - Mencetak rapor (PDF)
  - Update status rapor
  - Menghapus rapor (hanya status draft)

### 2. **Dokumen Guru** ✅
- **Akses**: Penuh untuk dokumen sendiri
- **Jenis Dokumen**: Promes, Prota, Analisis Kaldik
- **Fitur**:
  - Melihat dokumen milik sendiri
  - Menambah dokumen baru
  - Mengedit dokumen sendiri
  - Menghapus dokumen sendiri
  - Download dokumen

### 3. **Modul Ajar** ✅
- **Akses**: Penuh untuk modul sendiri
- **Fitur**:
  - Melihat modul ajar yang dibuat sendiri
  - Upload modul ajar baru
  - Mengedit modul ajar sendiri
  - Menghapus modul ajar sendiri
  - Download modul ajar

### 4. **Jadwal Pelajaran** ✅
- **Akses**: Baca semua jadwal (Read-only)
- **Fitur**:
  - Melihat jadwal pelajaran semua kelas
  - Filter berdasarkan kelas, guru, hari
  - Lihat jadwal mingguan per kelas

### 5. **Kalender Pendidikan** ✅
- **Akses**: Baca semua kalender (Read-only)
- **Fitur**:
  - Melihat kalender pendidikan
  - Filter berdasarkan tahun ajaran, kategori, bulan
  - Lihat detail kegiatan

### 6. **Absensi Guru** 
- **Akses Rekap**: ❌ HANYA ADMIN (dibatasi)
- **Fitur Lainnya**: ✅ Wali kelas bisa absen masuk/pulang seperti guru lainnya
- **Catatan**: Rekapan absensi guru hanya bisa diakses oleh admin

### 7. **Fitur Akademik Lainnya** ✅
Wali kelas juga dapat mengakses:
- Nilai siswa
- Absensi siswa
- Jurnal mengajar
- Promes & Prota
- Data siswa
- Dan fitur akademik lainnya (sudah ada di middleware role:admin,guru)

## Perubahan Teknis

### 1. Trait WaliKelasAccess
**File**: `app/Http/Controllers/Simaju/Traits/WaliKelasAccess.php`

Trait baru yang menyediakan helper methods:
- `isWaliKelasOrAdmin()`: Cek apakah user adalah wali kelas atau admin
- `isWaliKelas()`: Cek apakah user adalah wali kelas (bukan admin)
- `getWaliKelasClasses()`: Ambil kelas yang dibimbing oleh wali kelas
- `getWaliKelasClassIds()`: Ambil ID kelas yang dibimbing
- `checkWaliKelasAccess()`: Validasi akses wali kelas dengan redirect otomatis

### 2. Controllers yang Diupdate

#### a. **RaporController** 
- Menggunakan trait `WaliKelasAccess`
- Refactored untuk menggunakan helper methods dari trait
- Validasi akses di setiap method (index, create, store, show, print, updateStatus, destroy)
- Filter data berdasarkan kelas yang dibimbing

#### b. **DokumenGuruController**
- Menggunakan trait `WaliKelasAccess`
- Wali kelas hanya bisa CRUD dokumen sendiri
- Admin tetap bisa akses semua dokumen
- Pre-select guru_id untuk wali kelas saat create

#### c. **ModulAjarController**
- Menggunakan trait `WaliKelasAccess`
- Wali kelas hanya bisa CRUD modul ajar sendiri
- Admin tetap bisa akses semua modul
- Pre-select guru_id untuk wali kelas saat create

#### d. **JadwalPelajaranController**
- Menggunakan trait `WaliKelasAccess`
- Akses read-only untuk semua jadwal
- Tidak ada batasan khusus (wali kelas perlu lihat semua jadwal)

#### e. **KalenderPendidikanController**
- Menggunakan trait `WaliKelasAccess`
- Akses read-only untuk semua kalender
- Tidak ada batasan khusus (wali kelas perlu lihat semua kalender)

#### f. **AbsensiGuruController**
- Method `rekap()` dibatasi hanya untuk admin
- Wali kelas tidak bisa akses rekapan absensi guru
- Wali kelas tetap bisa absen masuk/pulang seperti biasa

## Cara Kerja

### Identifikasi Wali Kelas
Sistem mengidentifikasi wali kelas berdasarkan field `jabatan` di tabel `gurus`:
```php
$user->guru->jabatan === 'wali_kelas'
```

### Logika Akses
1. **Admin**: Akses penuh ke semua fitur
2. **Wali Kelas**: 
   - Akses penuh untuk rapor siswa di kelasnya
   - Akses terbatas untuk dokumen/modul sendiri
   - Akses read-only untuk jadwal dan kalender
3. **Guru Biasa**: Sesuai middleware yang sudah ada (role:admin,guru)

### Contoh Implementasi
```php
// Di RaporController
public function index(Request $request)
{
    // Cek akses wali kelas
    if ($check = $this->checkWaliKelasAccess('Pesan error')) {
        return $check;
    }
    
    // Ambil kelas yang dibimbing
    $kelasList = $this->getWaliKelasClasses();
    $kelasIds = $kelasList->pluck('id');
    
    // Filter rapor berdasarkan kelas yang dibimbing
    $query->whereHas('siswa', function($q) use ($kelasIds) {
        $q->whereIn('kelas_id', $kelasIds);
    });
}
```

## Keamanan
- Setiap method controller memvalidasi akses user
- Wali kelas tidak bisa akses data di luar kewenangannya
- Admin tetap memiliki akses penuh
- Validasi dilakukan di level controller dan model relationship
- **Pembatasan Khusus**:
  - Rekapan absensi guru: hanya admin
  - Print rapor: hanya admin dan wali kelas (untuk siswa di kelasnya)

## Testing
Untuk menguji implementasi:
1. Login sebagai user dengan guru yang memiliki `jabatan = 'wali_kelas'`
2. Pastikan guru tersebut sudah di-assign sebagai wali_kelas di tabel `kelas`
3. Coba akses:
   - Menu Rapor → hanya muncul siswa dari kelas yang dibimbing
   - Menu Dokumen Guru → hanya muncul dokumen sendiri
   - Menu Modul Ajar → hanya muncul modul sendiri
   - Menu Jadwal Pelajaran → bisa lihat semua jadwal
   - Menu Kalender Pendidikan → bisa lihat semua kalender

## Catatan Penting
1. Wali kelas harus sudah di-assign di tabel `kelas` (field `wali_kelas_id`)
2. Field `jabatan` di tabel `gurus` harus diset ke `'wali_kelas'`
3. Routes sudah dikonfigurasi dengan middleware `role:admin,guru`
4. Tidak perlu perubahan pada routes atau middleware
5. Semua logika akses ada di controller level

## File yang Diubah
1. `app/Http/Controllers/Simaju/Traits/WaliKelasAccess.php` (NEW)
2. `app/Http/Controllers/Simaju/RaporController.php` (UPDATED)
3. `app/Http/Controllers/Simaju/DokumenGuruController.php` (UPDATED)
4. `app/Http/Controllers/Simaju/ModulAjarController.php` (UPDATED)
5. `app/Http/Controllers/Simaju/JadwalPelajaranController.php` (UPDATED)
6. `app/Http/Controllers/Simaju/KalenderPendidikanController.php` (UPDATED)
7. `app/Http/Controllers/Simaju/AbsensiGuruController.php` (UPDATED - rekap dibatasi untuk admin)

---
**Tanggal Implementasi**: 1 Agustus 2026
**Status**: ✅ Selesai
