# Implementasi NPSN sebagai Username untuk User Sekolah

## Overview
Sistem kini mendukung login menggunakan NPSN untuk user dengan role Admin Sekolah. User dengan role lain tetap menggunakan email untuk login.

## Perubahan Database

### Migration: `2026_01_19_100001_add_npsn_to_users_table.php`
Menambahkan kolom ke tabel `users`:
- `school_id` (nullable, foreign key ke tabel `schools`)
- `npsn` (nullable, unique, varchar 10) - Username untuk admin sekolah

## Perubahan Model

### User Model
**File**: `app/Models/User.php`

Menambahkan:
- `school_id` dan `npsn` ke `$fillable`
- Relationship `school()` ke model School

## Perubahan Controller

### UserController
**File**: `app/Http/Controllers/Superadmin/UserController.php`

#### Method `create()`
- Menambahkan `$schools` ke view untuk dropdown sekolah

#### Method `store()`
- Validasi conditional berdasarkan role:
  - Admin Sekolah: `school_id` dan `npsn` required, `email`, `nip`, `pangkat_golongan` optional
  - Role lain: `email`, `nip`, `pangkat_golongan` required
- Auto-fill `npsn` dari sekolah yang dipilih
- Auto-generate email jika kosong: `{npsn}@sekolah.local`

#### Method `edit()` & `update()`
- Logic yang sama dengan create/store
- Menambahkan `$schools` ke view

### LoginController
**File**: `app/Http/Controllers/Auth/LoginController.php`

#### Method `login()`
- Mengubah field dari `email` menjadi `login`
- Auto-detect apakah input adalah email atau NPSN:
  - Jika valid email format → authenticate dengan field `email`
  - Jika numeric/non-email → authenticate dengan field `npsn`

## Perubahan View

### Create User Form
**File**: `resources/views/superadmin/users/create.blade.php`

Fitur:
- Role dropdown dengan `data-slug` attribute
- Field sekolah (conditional, hanya untuk admin_sekolah)
- Field NIP, Pangkat, Email dengan conditional required
- JavaScript untuk toggle visibility dan required attribute berdasarkan role
- Helper text: "NPSN akan otomatis menjadi username untuk login"

### Edit User Form
**File**: `resources/views/superadmin/users/edit.blade.php`

Fitur yang sama dengan create form, plus:
- Menampilkan NPSN saat ini
- Update NPSN display saat sekolah berubah

### Index User Table
**File**: `resources/views/superadmin/users/index.blade.php`

- Menambahkan kolom NPSN
- Menampilkan NPSN sebagai badge hijau

### Login Form
**File**: `resources/views/auth/login.blade.php`

- Mengubah field `email` menjadi `login`
- Placeholder: "Email atau NPSN sekolah"
- Helper text: "Admin Sekolah gunakan NPSN, yang lain gunakan Email"
- Menampilkan error untuk field `login`

## Cara Penggunaan

### Membuat User Admin Sekolah

1. Akses menu **Manajemen User** → **Tambah User**
2. Pilih Role: **Admin Sekolah**
3. Pilih Sekolah dari dropdown
4. NPSN akan otomatis terisi dari sekolah yang dipilih
5. Field berikut menjadi optional:
   - NIP
   - Pangkat dan Golongan
   - Email (akan auto-generate jika kosong)
6. Isi Nama dan Password
7. Klik **Simpan**

### Login sebagai Admin Sekolah

1. Buka halaman login
2. Masukkan **NPSN** sekolah di field "Email / NPSN"
   - Contoh: `20203456`
3. Masukkan password
4. Klik **Masuk**

### Login sebagai User Lain (Non-Admin Sekolah)

1. Buka halaman login
2. Masukkan **Email** di field "Email / NPSN"
   - Contoh: `admin@dinas.go.id`
3. Masukkan password
4. Klik **Masuk**

## Validasi

### User Admin Sekolah
- ✅ `school_id`: Required
- ✅ `npsn`: Required (auto-filled dari sekolah)
- ⚪ `email`: Optional (auto-generate jika kosong)
- ⚪ `nip`: Optional
- ⚪ `pangkat_golongan`: Optional
- ✅ `name`: Required
- ✅ `password`: Required (min 8 karakter)

### User Role Lain (Superadmin, Admin Dinas, Admin KCD, Pengawas, Guru)
- ✅ `email`: Required, unique
- ✅ `nip`: Required, unique
- ✅ `pangkat_golongan`: Required
- ✅ `name`: Required
- ✅ `password`: Required (min 8 karakter)

## Fitur Keamanan

1. **Unique NPSN**: NPSN harus unik di seluruh sistem (database constraint)
2. **School Association**: Admin Sekolah hanya bisa di-assign ke 1 sekolah
3. **Auto-detect Login Type**: System otomatis mengenali apakah login menggunakan email atau NPSN
4. **Conditional Validation**: Validasi berbeda berdasarkan role untuk fleksibilitas

## Technical Notes

### Authentication Flow
```
Login Input (text field)
    ↓
Validate: is valid email?
    ├── YES → Authenticate dengan field 'email'
    └── NO  → Authenticate dengan field 'npsn'
```

### Auto-fill Logic (Admin Sekolah)
```
Select School
    ↓
Get School NPSN
    ↓
Set npsn field = school.npsn
    ↓
If email empty:
    Set email = "{npsn}@sekolah.local"
```

### JavaScript Toggling
Saat role berubah ke "Admin Sekolah":
- Show: School dropdown
- Hide required indicator: NIP, Pangkat, Email
- Remove required attribute dari fields tersebut

## Testing Checklist

- [x] Create user admin sekolah dengan NPSN
- [x] NPSN otomatis terisi dari sekolah yang dipilih
- [x] Email auto-generate jika kosong
- [x] Login dengan NPSN berhasil
- [x] Login dengan email tetap berfungsi untuk role lain
- [x] Validasi unique NPSN
- [x] Edit user admin sekolah
- [x] Tampilan NPSN di index user
- [x] Conditional required fields bekerja di form

## Future Enhancements

1. **Password Reset by NPSN**: Implementasi reset password untuk admin sekolah menggunakan NPSN
2. **School Dashboard**: Dashboard khusus untuk admin sekolah dengan data sekolah mereka
3. **Bulk Import**: Import admin sekolah dari CSV dengan NPSN
4. **NPSN Verification**: Validasi NPSN dengan database DAPODIK (jika tersedia API)

## Troubleshooting

### Error: "Column 'school_id' already exists"
Migration sudah pernah dijalankan sebelumnya. Kolom sudah ada di database, tidak perlu migrasi ulang.

### Login gagal dengan NPSN
1. Pastikan NPSN sudah terdaftar di tabel users
2. Pastikan role user adalah "Admin Sekolah" (slug: admin_sekolah)
3. Pastikan NPSN sama persis dengan yang tersimpan (case-sensitive)
4. Pastikan user dalam status active (is_active = 1)

### Field tidak toggle saat pilih role
1. Cek console browser untuk JavaScript error
2. Pastikan attribute `data-slug` ada di option role
3. Pastikan semua ID element sesuai (roleSelect, schoolField, dll)

---

**Created**: 2026-01-19  
**Version**: 1.0  
**Author**: System Implementation
