# Rencana Implementasi: Quiz Assignment

**Tanggal**: 14 Juli 2026  
**Status**: ✅ IMPLEMENTASI SELESAI

---

## Status Implementasi

### ✅ Semua Sprint Selesai

| Sprint | Komponen | Status |
|--------|----------|--------|
| **Sprint 1** | Database + Model | ✅ |
| **Sprint 2** | Backend Logic (QuizController) | ✅ |
| **Sprint 3** | Guru UI (Quiz Builder) | ✅ |
| **Sprint 4** | Siswa UI (QuizPlay, Result, Leaderboard) | ✅ |

---

## File yang Dibuat/Diubah

### Migration Baru (4)

| File | Fungsi |
|------|--------|
| `database/migrations/2026_07_14_000001_create_quiz_questions_table.php` | Tabel soal quiz |
| `database/migrations/2026_07_14_000002_add_quiz_columns_to_assignments_table.php` | Tambah `assignment_type`, `quiz_config` |
| `database/migrations/2026_07_14_000003_add_quiz_columns_to_assignment_submissions_table.php` | Tambah `attempt_number`, `points`, `time_taken_seconds`, `answers` |
| `database/migrations/2026_07_14_000004_create_assignment_classes_table.php` | Pivot quiz ↔ kelas |

### Model Baru (1)

| File | Fungsi |
|------|--------|
| `app/Models/QuizQuestion.php` | Model soal quiz |

### Model Diubah (2)

| File | Perubahan |
|------|-----------|
| `app/Models/Assignment.php` | Tambah `assignment_type`, `quiz_config`, relasi `quizQuestions()`, `classes()`, `isQuiz()` |
| `app/Models/AssignmentSubmission.php` | Tambah `attempt_number`, `points`, `time_taken_seconds`, `answers` |

### Enum Diubah (2)

| File | Perubahan |
|------|-----------|
| `app/Enums/SubmissionType.php` | Tambah `QUIZ` |
| `app/Enums/SubmissionStatus.php` | Tambah `DRAFT` |

### Controller Baru (1)

| File | Fungsi |
|------|--------|
| `app/Http/Controllers/QuizController.php` | 6 method: `start`, `autosave`, `submit`, `result`, `globalLeaderboard` |

### Controller Diubah (1)

| File | Perubahan |
|------|-----------|
| `app/Http/Controllers/AssignmentController.php` | Update `store()` dan `update()` untuk handle quiz + questions |

### Routes (1)

| File | Perubahan |
|------|-----------|
| `routes/web.php` | 5 route baru: `quiz.start`, `quiz.autosave`, `quiz.submit`, `quiz.result`, `quiz.leaderboard.global` |

### Frontend Baru (4)

| File | Fungsi |
|------|--------|
| `resources/js/pages/StudentPortal/QuizPlay.tsx` | Halaman pengerjaan quiz (autosave, navigasi, timer) |
| `resources/js/pages/StudentPortal/QuizResult.tsx` | Hasil quiz + leaderboard + pembahasan |
| `resources/js/pages/StudentPortal/GlobalLeaderboard.tsx` | Leaderboard global semua quiz |
| `resources/js/pages/Assignment/QuizLeaderboard.tsx` | Leaderboard untuk guru |

### Frontend Diubah (2)

| File | Perubahan |
|------|-----------|
| `resources/js/pages/Materi/Create.tsx` | Tambah Quiz Builder (tipe PG/TF, multi-kelas, acak, attempt) |
| `resources/js/pages/Materi/Edit.tsx` | Tambah interfaces untuk quiz data |

---

## Perintah yang Perlu Dijalankan

```bash
php artisan migrate
```

Ini akan menjalankan 8 migration (4 quiz + 4 sebelumnya).

---

## Fitur yang Tersedia

### Guru:
1. ✅ Buat materi dengan tugas quiz
2. ✅ Pilih beberapa kelas untuk quiz yang sama
3. ✅ Buat soal PG dan True/False dengan bobot per soal
4. ✅ Konfigurasi: max attempt, acak soal, acak opsi
5. ✅ Lihat leaderboard per quiz

### Siswa:
1. ✅ Kerjakan quiz dengan autosave
2. ✅ Navigasi soal (klik nomor soal)
3. ✅ Timer (catat waktu pengerjaan)
4. ✅ Submit → lihat skor + poin + leaderboard
5. ✅ Bisa ulang sampai max attempt
6. ✅ Setelah semua attempt → lihat pembahasan
7. ✅ Lihat leaderboard global

---

## Rumus Poin

```
Poin = Jawaban Benar × Points × Attempt Multiplier

Attempt Multiplier:
  1 → ×1.0
  2 → ×0.7
  3 → ×0.5
  4+ → ×0.3
```

---

*Implementasi Quiz Assignment selesai. Semua fitur core sudah berfungsi.*
