# Implementasi Role Kepala Perpustakaan

## Deskripsi
Implementasi role **Kepala Perpustakaan** yang memberikan akses penuh ke sistem manajemen perpustakaan. Hanya pengguna dengan role guru yang dapat menjadi kepala perpustakaan.

## Tanggal Implementasi
2 Agustus 2026

## Perubahan yang Dilakukan

### 1. Database Migration
**File:** `database/migrations/2026_08_02_104244_update_users_role_add_kepala_perpustakaan.php`

- Menambahkan role `kepala_perpustakaan` ke kolom enum `role` pada tabel `users`
- Role yang tersedia sekarang: `admin`, `guru`, `wali_kelas`, `kepala_perpustakaan`

```php
DB::statement("ALTER TABLE users MODIFY COLUMN role ENUM('admin', 'guru', 'wali_kelas', 'kepala_perpustakaan') NOT NULL DEFAULT 'admin'");
```

### 2. User Model
**File:** `app/Models/User.php`

Menambahkan method baru untuk mengecek role kepala perpustakaan:

```php
public function isKepalaPerpustakaan(): bool
{
    return $this->role === 'kepala_perpustakaan';
}
```

Memperbarui `getRoleLabelAttribute()` untuk menampilkan label yang sesuai:

```php
'kepala_perpustakaan' => 'Kepala Perpustakaan'
```

### 3. Routes (web.php)
**File:** `routes/web.php`

Mengupdate semua route perpustakaan untuk memberikan akses ke admin dan kepala_perpustakaan:

```php
// Sebelumnya: Route::middleware('role:admin')
// Sekarang: Route::middleware('role:admin,kepala_perpustakaan')
```

Route yang diupdate:
- Kategori Buku (`perpustakaan.kategori.*`)
- Manajemen Buku (`perpustakaan.buku.*`)
- Manajemen Anggota (`perpustakaan.anggota.*`)
- Peminjaman Buku (`perpustakaan.peminjaman.*`)
- Pengembalian Buku (`perpustakaan.pengembalian.*`)

### 4. Sidebar Menu
**File:** `resources/views/simaju/layouts/main.blade.php`

Mengupdate kondisi tampilan menu Perpustakaan:

```php
// Sebelumnya: @if(auth()->user()->role == 'admin')
// Sekarang: @if(auth()->user()->role == 'admin' || auth()->user()->role == 'kepala_perpustakaan')
```

Menu Perpustakaan sekarang muncul untuk:
- Admin
- Kepala Perpustakaan

## Hak Akses Kepala Perpustakaan

Kepala Perpustakaan memiliki akses ke dua area utama:

### A. Sistem Perpustakaan (Akses Penuh)

1. **Kategori Buku**
   - Lihat semua kategori
   - Tambah kategori baru
   - Edit kategori
   - Hapus kategori

2. **Manajemen Buku**
   - Lihat semua buku
   - Tambah buku baru
   - Edit informasi buku
   - Hapus buku

3. **Manajemen Anggota**
   - Lihat semua anggota perpustakaan
   - Tambah anggota baru (guru/siswa)
   - Edit data anggota
   - Hapus anggota

4. **Peminjaman Buku**
   - Lihat semua transaksi peminjaman
   - Proses peminjaman baru
   - Edit data peminjaman
   - Lihat detail peminjaman

5. **Pengembalian Buku**
   - Lihat semua pengembalian
   - Proses pengembalian buku
   - Lihat detail pengembalian

### B. Fitur Akademik (Seperti Guru, TANPA Data Master)

1. **Akademik**
   - Jadwal Pembelajaran
   - Input dan kelola Nilai
   - Absensi Siswa
   - Absensi Guru (bisa absen masuk/pulang)
   - Jurnal Mengajar
   - Guru Wali
   - Rapor Siswa
   - Ekstrakurikuler & Kokurikuler

3. **Perencanaan**
   - Modul Ajar
   - Program Semester (Promes)
   - Program Tahunan (Prota)

4. **Dokumen Guru**
   - Upload dokumen (Promes, Prota, Analisis Kaldik)
   - Download dokumen
   - Lihat semua dokumen guru

## Cara Menggunakan

### Membuat User Kepala Perpustakaan

#### 1. Via Halaman Admin (Rekomendasi)
1. Login sebagai Admin
2. Buka menu **Pengaturan** → **Kepala Perpustakaan** di sidebar
3. Pilih guru dari dropdown yang tersedia
4. Klik tombol **"Tetapkan Kepala Perpustakaan"**

Route: `/simaju/kepala-perpustakaan`

#### 2. Via Database (Manual)
   ```sql
   -- Pastikan user memiliki guru_id (harus terhubung ke data guru)
   UPDATE users 
   SET role = 'kepala_perpustakaan' 
   WHERE id = [ID_USER] AND guru_id IS NOT NULL;
   ```

#### 3. Via Laravel Tinker
   ```php
   php artisan tinker
   
   // Cari user yang adalah guru
   $user = User::where('guru_id', [ID_GURU])->first();
   $user->role = 'kepala_perpustakaan';
   $user->save();
   ```

### Validasi
Untuk memastikan hanya guru yang bisa menjadi kepala perpustakaan:
- User harus memiliki `guru_id` yang valid
- `guru_id` harus terhubung ke data guru yang ada di tabel `gurus`

## Testing

Setelah implementasi, lakukan testing berikut:

1. ✅ Login sebagai user dengan role `kepala_perpustakaan`
2. ✅ Verifikasi menu Perpustakaan muncul di sidebar
3. ✅ Test akses ke semua fitur perpustakaan:
   - Kategori: Create, Read, Update, Delete
   - Buku: Create, Read, Update, Delete
   - Anggota: Create, Read, Update, Delete
   - Peminjaman: Create, Read, Update
   - Pengembalian: Create, Read
4. ✅ Verifikasi user non-kepala perpustakaan tidak bisa mengakses

## Catatan Penting

1. **Syarat Menjadi Kepala Perpustakaan:**
   - User harus memiliki data guru (`guru_id` tidak boleh NULL)
   - Hanya bisa diterapkan pada user yang sudah terdaftar sebagai guru

2. **Perbedaan dengan Admin:**
   - Admin: Akses penuh ke SEMUA fitur sistem (akademik, perpustakaan, aset, dll)
   - Kepala Perpustakaan: Akses penuh HANYA ke fitur perpustakaan

3. **Keamanan:**
   - Middleware `RoleMiddleware` memastikan hanya user dengan role yang tepat yang bisa mengakses
   - Setiap route dilindungi dengan middleware `role:admin,kepala_perpustakaan`

## Fitur Manajemen Kepala Perpustakaan

### Controller & Routes
**File:** `app/Http/Controllers/Simaju/KepalaPerpustakaanController.php`

Menyediakan fitur untuk admin mengelola kepala perpustakaan:

**Method yang tersedia:**
- `index()` - Menampilkan halaman kelola kepala perpustakaan
- `store()` - Menetapkan/mengganti kepala perpustakaan
- `destroy()` - Membatalkan kepala perpustakaan (kembali jadi guru)

**Routes:**
```php
Route::get('kepala-perpustakaan', [KepalaPerpustakaanController::class, 'index'])
    ->name('kepala-perpustakaan.index');
Route::post('kepala-perpustakaan', [KepalaPerpustakaanController::class, 'store'])
    ->name('kepala-perpustakaan.store');
Route::delete('kepala-perpustakaan', [KepalaPerpustakaanController::class, 'destroy'])
    ->name('kepala-perpustakaan.destroy');
```

### View
**File:** `resources/views/simaju/kepala-perpustakaan/index.blade.php`

Halaman untuk mengelola kepala perpustakaan dengan fitur:
- Menampilkan kepala perpustakaan yang aktif
- Form dropdown untuk memilih guru
- Tombol untuk menetapkan/mengganti kepala perpustakaan
- Tombol untuk membatalkan kepala perpustakaan
- Tabel daftar semua guru yang dapat dijadikan kepala perpustakaan

### Menu Admin
Menu "Kepala Perpustakaan" ditambahkan di sidebar bagian Pengaturan (khusus Admin).

## File yang Dimodifikasi/Dibuat

1. `database/migrations/2026_08_02_104244_update_users_role_add_kepala_perpustakaan.php` (Baru)
2. `app/Models/User.php` (Diperbarui)
3. `app/Http/Controllers/Simaju/KepalaPerpustakaanController.php` (Baru)
4. `routes/web.php` (Diperbarui)
5. `resources/views/simaju/kepala-perpustakaan/index.blade.php` (Baru)
6. `resources/views/simaju/layouts/main.blade.php` (Diperbarui)

## Rollback

Jika perlu rollback, jalankan:

```bash
php artisan migrate:rollback --step=1
```

Ini akan mengembalikan kolom role ke kondisi semula tanpa `kepala_perpustakaan`.
