# 📋 Requirements & Design Package (RDP) + Minimum Viable Product (MVP)
## Sistem Pendaftaran & Absensi Sekolah — Laravel

> **Versi Dokumen:** 1.0.0  
> **Tanggal:** Juni 2025  
> **Status:** Draft untuk Review  
> **Platform:** Laravel 11.x + MySQL 8.x + Tailwind CSS

---

# BAGIAN I — REQUIREMENTS & DESIGN PACKAGE (RDP)

---

## 1. LATAR BELAKANG & TUJUAN PROYEK

### 1.1 Latar Belakang

Pengelolaan data siswa, proses penerimaan peserta didik baru (PPDB), dan pencatatan kehadiran di banyak sekolah masih dilakukan secara manual atau menggunakan sistem yang terpisah-pisah. Kondisi ini menyebabkan:

- **Inefisiensi waktu** — rekapitulasi absensi manual membutuhkan waktu berjam-jam setiap bulannya.
- **Potensi kesalahan data** — pencatatan tangan rentan terhadap kekeliruan pencatatan dan kehilangan data.
- **Keterlambatan informasi** — orang tua baru mengetahui ketidakhadiran anak setelah beberapa hari.
- **Tidak ada audit trail** — tidak dapat melacak siapa yang mengubah data dan kapan.
- **Proses PPDB yang panjang** — antrian panjang dan berkas fisik yang rentan rusak/hilang.

### 1.2 Tujuan Proyek

| No | Tujuan | Indikator Keberhasilan |
|----|--------|----------------------|
| 1 | Digitalisasi proses PPDB | Calon siswa dapat mendaftar online tanpa harus datang ke sekolah |
| 2 | Otomatisasi absensi | Absensi terekam real-time dengan metode QR Code / manual |
| 3 | Notifikasi orang tua | Orang tua menerima notifikasi ≤ 5 menit setelah ketidakhadiran tercatat |
| 4 | Laporan otomatis | Laporan bulanan ter-generate otomatis tanpa rekap manual |
| 5 | Manajemen hak akses | Setiap role hanya melihat dan mengakses menu yang relevan |
| 6 | Audit trail lengkap | Setiap perubahan data tercatat dengan timestamp dan user |

### 1.3 Ruang Lingkup Sistem

**Dalam Ruang Lingkup (In Scope):**
- Manajemen data sekolah, tahun ajaran, kelas, dan mata pelajaran
- Sistem PPDB online (pendaftaran, upload berkas, verifikasi, seleksi)
- Manajemen data siswa dan guru beserta profil lengkap
- Absensi harian dan per mata pelajaran (manual + QR Code)
- Pengajuan dan persetujuan surat izin/sakit secara digital
- Laporan dan rekap kehadiran (harian, mingguan, bulanan, per semester)
- Sistem notifikasi (in-app + email, opsional WhatsApp)
- Manajemen role, permission, dan menu dinamis
- Audit log seluruh aktivitas sistem
- Export PDF dan Excel

**Di Luar Ruang Lingkup (Out of Scope):**
- Sistem penilaian / rapor akademik
- Pembayaran SPP online
- E-learning / LMS
- Integrasi fingerprint hardware (direncanakan di versi 2.0)

---

## 2. STAKEHOLDER & USER ROLES

### 2.1 Daftar Stakeholder

| Stakeholder | Kepentingan | Pengaruh |
|-------------|-------------|----------|
| Kepala Sekolah | Pengawasan dan laporan eksekutif | Tinggi |
| Admin Sekolah / TU | Operasional harian sistem | Sangat Tinggi |
| Guru / Wali Kelas | Input absensi dan monitoring kelas | Tinggi |
| Siswa | Melihat rekap absensi pribadi | Sedang |
| Orang Tua / Wali | Monitoring kehadiran anak | Sedang |
| Operator PPDB | Pengelolaan proses penerimaan siswa baru | Tinggi |
| IT / Super Admin | Pengelolaan teknis dan konfigurasi sistem | Sangat Tinggi |

### 2.2 Definisi Role & Hak Akses

#### 🔴 Super Admin (Level 1)
- **Deskripsi:** Administrator sistem tertinggi. Memiliki akses penuh ke seluruh fitur termasuk manajemen multi-sekolah, backup/restore database, dan konfigurasi global.
- **Jumlah user:** 1–3 orang (tim IT)
- **Akses khusus:** Dapat mengakses data semua sekolah, manage roles & permissions, activity log

#### 🟣 Admin Sekolah (Level 2)
- **Deskripsi:** Administrator di level sekolah. Mengelola seluruh data operasional sekolah termasuk siswa, guru, kelas, dan absensi.
- **Jumlah user:** 1–5 orang per sekolah (Tata Usaha)
- **Batasan:** Hanya mengakses data sekolahnya sendiri

#### 🟢 Guru / Wali Kelas (Level 3)
- **Deskripsi:** Tenaga pengajar. Dapat melakukan input absensi untuk kelas/mata pelajaran yang diampu. Wali kelas mendapat akses tambahan ke data lengkap kelasnya.
- **Jumlah user:** Seluruh guru aktif
- **Batasan:** Hanya kelas/mapel yang ditugaskan

#### 🔵 Siswa (Level 4)
- **Deskripsi:** Peserta didik aktif. Akses read-only untuk data absensi dan informasi pribadi.
- **Jumlah user:** Seluruh siswa aktif
- **Batasan:** Hanya data miliknya sendiri

#### 🟠 Orang Tua / Wali (Level 4)
- **Deskripsi:** Orang tua atau wali siswa. Dapat memantau kehadiran anak dan mengajukan surat izin secara digital.
- **Jumlah user:** 1–2 akun per siswa
- **Batasan:** Hanya data anak yang terdaftar

#### 🟡 Operator PPDB (Level 3)
- **Deskripsi:** Petugas khusus yang mengelola proses PPDB. Akses terbatas hanya pada modul pendaftaran.
- **Jumlah user:** 2–5 orang per periode PPDB
- **Batasan:** Hanya modul PPDB

---

## 3. FUNCTIONAL REQUIREMENTS (FR)

### FR-01: Modul Autentikasi & Manajemen User

| ID | Requirement | Prioritas |
|----|-------------|-----------|
| FR-01-01 | Sistem menyediakan halaman login dengan validasi email/username dan password | Must Have |
| FR-01-02 | Login gagal lebih dari 5 kali → akun terkunci 30 menit | Must Have |
| FR-01-03 | Tersedia fitur "Lupa Password" via email | Must Have |
| FR-01-04 | Admin dapat membuat, mengedit, menonaktifkan akun user | Must Have |
| FR-01-05 | Setiap user memiliki satu atau lebih role | Must Have |
| FR-01-06 | Sistem mencatat waktu login terakhir tiap user | Should Have |
| FR-01-07 | User dapat mengubah password dan avatar profil | Should Have |
| FR-01-08 | Sesi otomatis berakhir setelah 2 jam tidak aktif | Should Have |
| FR-01-09 | Verifikasi email saat registrasi pertama | Could Have |
| FR-01-10 | Login dengan Two-Factor Authentication (2FA) | Won't Have (v2) |

### FR-02: Modul Manajemen Role & Permission

| ID | Requirement | Prioritas |
|----|-------------|-----------|
| FR-02-01 | Super Admin dapat membuat role baru dengan nama dan deskripsi | Must Have |
| FR-02-02 | Setiap role dapat ditetapkan daftar permission secara granular (C/R/U/D per modul) | Must Have |
| FR-02-03 | Menu yang tampil di sidebar dinamis berdasarkan role user yang login | Must Have |
| FR-02-04 | Permission dapat dikelola secara UI tanpa perlu mengubah kode | Must Have |
| FR-02-05 | Middleware Gate/Policy Laravel diterapkan di setiap route dan controller | Must Have |
| FR-02-06 | Role tidak dapat dihapus jika masih ada user yang menggunakannya | Must Have |
| FR-02-07 | Super Admin dapat melakukan override permission per user (tambahan individual) | Should Have |
| FR-02-08 | Log perubahan role/permission tercatat di activity log | Should Have |

### FR-03: Modul PPDB (Pendaftaran Peserta Didik Baru)

| ID | Requirement | Prioritas |
|----|-------------|-----------|
| FR-03-01 | Admin dapat membuka/menutup periode PPDB dengan tanggal mulai dan akhir | Must Have |
| FR-03-02 | Calon siswa dapat mendaftar secara online melalui form publik (tanpa login) | Must Have |
| FR-03-03 | Form pendaftaran meliputi: data diri, data orang tua, asal sekolah, pilihan jurusan | Must Have |
| FR-03-04 | Calon siswa dapat mengupload dokumen (ijazah, KK, akte lahir, sertifikat, foto) | Must Have |
| FR-03-05 | Sistem generate nomor pendaftaran otomatis dengan format yang dapat dikonfigurasi | Must Have |
| FR-03-06 | Operator dapat memverifikasi kelengkapan berkas per pendaftar | Must Have |
| FR-03-07 | Status pendaftaran: draft → submitted → verifikasi → diterima/ditolak | Must Have |
| FR-03-08 | Email konfirmasi dikirim otomatis pada setiap perubahan status | Must Have |
| FR-03-09 | Calon siswa dapat melihat status pendaftaran dengan nomor pendaftaran | Must Have |
| FR-03-10 | Operator dapat mencetak kartu pendaftaran (PDF) | Must Have |
| FR-03-11 | Siswa yang diterima dapat dikonversi langsung menjadi data siswa aktif | Must Have |
| FR-03-12 | Laporan PPDB: jumlah pendaftar, diterima, ditolak, per status | Should Have |
| FR-03-13 | Fitur seleksi berdasarkan nilai rapor/ujian | Could Have |
| FR-03-14 | Pembatasan kuota penerimaan per kelas/jurusan | Could Have |

### FR-04: Modul Data Siswa

| ID | Requirement | Prioritas |
|----|-------------|-----------|
| FR-04-01 | Admin dapat menambah, mengedit, dan menonaktifkan data siswa | Must Have |
| FR-04-02 | Data siswa meliputi: biodata lengkap, data orang tua, foto | Must Have |
| FR-04-03 | Import data siswa dari file Excel/CSV dengan template yang dapat diunduh | Must Have |
| FR-04-04 | Export data siswa ke Excel dan PDF | Must Have |
| FR-04-05 | Pencarian siswa berdasarkan nama, NISN, NIS, kelas | Must Have |
| FR-04-06 | Assign siswa ke kelas per tahun ajaran | Must Have |
| FR-04-07 | Fitur mutasi siswa antar kelas dan pindah sekolah | Must Have |
| FR-04-08 | Generate kartu pelajar digital dengan QR Code | Must Have |
| FR-04-09 | Riwayat kelas siswa dari tahun ke tahun | Should Have |
| FR-04-10 | Filter dan sorting berdasarkan berbagai parameter | Should Have |

### FR-05: Modul Data Guru & Staf

| ID | Requirement | Prioritas |
|----|-------------|-----------|
| FR-05-01 | Admin dapat menambah, mengedit data guru/staf | Must Have |
| FR-05-02 | Data guru meliputi: biodata, NIP/NUPTK, pendidikan, status kepegawaian | Must Have |
| FR-05-03 | Assign guru ke mata pelajaran dan kelas tertentu | Must Have |
| FR-05-04 | Penugasan wali kelas per tahun ajaran | Must Have |
| FR-05-05 | Import/export data guru dari Excel | Should Have |
| FR-05-06 | Absensi guru per hari (bisa dikelola terpisah dari absensi siswa) | Could Have |

### FR-06: Modul Absensi Siswa

| ID | Requirement | Prioritas |
|----|-------------|-----------|
| FR-06-01 | Guru dapat melakukan input absensi harian per kelas | Must Have |
| FR-06-02 | Guru dapat melakukan input absensi per mata pelajaran | Must Have |
| FR-06-03 | Status absensi: Hadir (H), Sakit (S), Izin (I), Alpha/Tanpa Keterangan (A) | Must Have |
| FR-06-04 | Absensi via scan QR Code dari kartu pelajar digital siswa | Must Have |
| FR-06-05 | QR Code bersifat dinamis (opsional expire per hari) untuk keamanan | Must Have |
| FR-06-06 | Admin dan wali kelas dapat mengedit absensi yang sudah diinput | Must Have |
| FR-06-07 | Sistem mencatat siapa yang melakukan perubahan absensi (audit) | Must Have |
| FR-06-08 | Rekap absensi: harian, mingguan, bulanan | Must Have |
| FR-06-09 | Rekap per siswa, per kelas, per mata pelajaran | Must Have |
| FR-06-10 | Notifikasi ke orang tua jika anak tidak hadir (alpha/sakit/izin) | Must Have |
| FR-06-11 | Sistem menandai otomatis siswa yang melebihi batas alpha | Must Have |
| FR-06-12 | Pencatatan waktu check-in dan check-out | Should Have |
| FR-06-13 | Pencatatan lokasi GPS saat scan QR (untuk validasi) | Could Have |
| FR-06-14 | Integrasi fingerprint / face recognition | Won't Have (v2) |

### FR-07: Modul Izin & Surat Keterangan

| ID | Requirement | Prioritas |
|----|-------------|-----------|
| FR-07-01 | Siswa/orang tua dapat mengajukan surat izin/sakit secara digital | Must Have |
| FR-07-02 | Upload lampiran (foto surat dokter, dll) pada pengajuan sakit | Must Have |
| FR-07-03 | Wali kelas / admin dapat approve atau reject pengajuan izin | Must Have |
| FR-07-04 | Izin yang disetujui otomatis mengubah status absensi | Must Have |
| FR-07-05 | Notifikasi status izin ke pemohon | Should Have |
| FR-07-06 | Laporan rekapitulasi izin/sakit per periode | Should Have |

### FR-08: Modul Jadwal Pelajaran

| ID | Requirement | Prioritas |
|----|-------------|-----------|
| FR-08-01 | Admin dapat membuat jadwal pelajaran per kelas dan per tahun ajaran | Must Have |
| FR-08-02 | Jadwal memuat: hari, jam mulai-selesai, ruangan, guru, mata pelajaran | Must Have |
| FR-08-03 | Validasi bentrok jadwal guru secara otomatis | Must Have |
| FR-08-04 | Validasi bentrok ruangan secara otomatis | Should Have |
| FR-08-05 | Siswa dan guru dapat melihat jadwal masing-masing | Must Have |
| FR-08-06 | Manajemen hari libur dan kalender akademik | Must Have |
| FR-08-07 | Cetak jadwal pelajaran ke PDF | Should Have |

### FR-09: Modul Laporan

| ID | Requirement | Prioritas |
|----|-------------|-----------|
| FR-09-01 | Laporan absensi per siswa (seluruh periode) | Must Have |
| FR-09-02 | Laporan absensi per kelas per bulan | Must Have |
| FR-09-03 | Laporan absensi per mata pelajaran | Must Have |
| FR-09-04 | Laporan rekap alpha tertinggi (ranking) | Must Have |
| FR-09-05 | Laporan persentase kehadiran per kelas | Must Have |
| FR-09-06 | Export laporan ke PDF (format rapor kehadiran) | Must Have |
| FR-09-07 | Export laporan ke Excel | Must Have |
| FR-09-08 | Filter laporan berdasarkan periode, kelas, siswa, mata pelajaran | Must Have |
| FR-09-09 | Dashboard statistik real-time (pie chart, bar chart) | Should Have |
| FR-09-10 | Laporan PPDB (statistik pendaftar, diterima, dll) | Must Have |

### FR-10: Modul Notifikasi

| ID | Requirement | Prioritas |
|----|-------------|-----------|
| FR-10-01 | Notifikasi in-app (bell icon dengan badge) | Must Have |
| FR-10-02 | Notifikasi email untuk kejadian penting (izin disetujui, PPDB diterima, dll) | Must Have |
| FR-10-03 | Template notifikasi email dapat dikustomisasi oleh admin | Should Have |
| FR-10-04 | Notifikasi WhatsApp (via API pihak ketiga, opsional) | Could Have |
| FR-10-05 | Pengaturan frekuensi notifikasi (real-time / harian / mingguan) | Could Have |

### FR-11: Modul Pengaturan Sistem

| ID | Requirement | Prioritas |
|----|-------------|-----------|
| FR-11-01 | Admin dapat mengkonfigurasi profil sekolah (nama, logo, alamat, dll) | Must Have |
| FR-11-02 | Pengaturan jam masuk dan jam pulang sekolah per hari | Must Have |
| FR-11-03 | Pengaturan batas toleransi keterlambatan | Must Have |
| FR-11-04 | Pengaturan batas maksimal alpha sebelum peringatan | Must Have |
| FR-11-05 | Manajemen user, role, dan permission dari UI | Must Have |
| FR-11-06 | Manajemen menu sidebar (aktif/nonaktif, urutan) | Must Have |
| FR-11-07 | Activity log seluruh aktivitas pengguna | Must Have |
| FR-11-08 | Backup dan restore database (Super Admin only) | Should Have |
| FR-11-09 | Pengaturan SMTP untuk pengiriman email | Must Have |

---

## 4. NON-FUNCTIONAL REQUIREMENTS (NFR)

### 4.1 Performa

| ID | Requirement | Target |
|----|-------------|--------|
| NFR-01 | Waktu loading halaman (LCP) | ≤ 2 detik pada jaringan 4G |
| NFR-02 | Waktu response API | ≤ 500ms untuk 95% request |
| NFR-03 | Sistem mampu menangani concurrent users | ≥ 200 user bersamaan |
| NFR-04 | Kapasitas data siswa | ≥ 10.000 siswa per instance |
| NFR-05 | Waktu generate laporan PDF | ≤ 10 detik untuk 1 bulan data |

### 4.2 Keamanan

| ID | Requirement |
|----|-------------|
| NFR-06 | Seluruh komunikasi menggunakan HTTPS/TLS 1.2+ |
| NFR-07 | Password di-hash menggunakan bcrypt (cost factor ≥ 10) |
| NFR-08 | Proteksi CSRF pada seluruh form |
| NFR-09 | Input sanitization dan validasi server-side di seluruh endpoint |
| NFR-10 | Proteksi SQL Injection via Eloquent ORM (no raw queries tanpa binding) |
| NFR-11 | Rate limiting pada endpoint login (max 5 request/menit per IP) |
| NFR-12 | File upload divalidasi tipe MIME dan ukuran maksimal (5MB per file) |
| NFR-13 | Session token di-regenerate setelah login berhasil |
| NFR-14 | QR Code absensi menggunakan token signed (HMAC-SHA256) |

### 4.3 Skalabilitas & Ketersediaan

| ID | Requirement |
|----|-------------|
| NFR-15 | Uptime target 99.5% (downtime maksimal 44 jam/tahun) |
| NFR-16 | Arsitektur mendukung horizontal scaling (stateless session dengan Redis) |
| NFR-17 | Database mendukung read replica untuk laporan berat |
| NFR-18 | Background job menggunakan Laravel Queue (Redis/Database driver) |
| NFR-19 | Cache laporan berulang menggunakan Redis dengan TTL 15 menit |

### 4.4 Usabilitas

| ID | Requirement |
|----|-------------|
| NFR-20 | Antarmuka responsif (mobile-first, mendukung layar 320px–1920px) |
| NFR-21 | Mendukung browser: Chrome 100+, Firefox 100+, Safari 15+, Edge 100+ |
| NFR-22 | Bahasa antarmuka: Bahasa Indonesia |
| NFR-23 | Feedback visual yang jelas untuk setiap aksi (loading, sukses, error) |
| NFR-24 | Fitur scan QR dapat digunakan dari kamera smartphone tanpa install aplikasi |

### 4.5 Maintainability

| ID | Requirement |
|----|-------------|
| NFR-25 | Kode mengikuti PSR-12 coding standard |
| NFR-26 | Unit test coverage ≥ 70% untuk business logic kritis |
| NFR-27 | Dokumentasi API menggunakan OpenAPI/Swagger |
| NFR-28 | Deployment menggunakan CI/CD pipeline (GitHub Actions) |
| NFR-29 | Setiap rilis memiliki changelog dan versi semantik (SemVer) |

---

## 5. ARSITEKTUR SISTEM

### 5.1 Stack Teknologi

| Layer | Teknologi | Versi |
|-------|-----------|-------|
| Backend Framework | Laravel | 11.x |
| Language | PHP | 8.3+ |
| Database | MySQL | 8.0+ |
| Cache & Queue | Redis | 7.x |
| Frontend Styling | Tailwind CSS | 3.x |
| Frontend JS | Alpine.js + Livewire | 3.x |
| UI Components | Filament Admin Panel | 3.x |
| PDF Generation | barryvdh/laravel-dompdf | Latest |
| Excel Export/Import | maatwebsite/excel | 3.x |
| QR Code | simplesoftwareio/simple-qrcode | Latest |
| Auth | Laravel Breeze / Fortify | Latest |
| Authorization | Custom Gate + Policy (Spatie optional) | — |
| Storage | Laravel Storage (local/S3) | — |
| Email | Laravel Mail + Mailtrap (dev) | — |
| Search | Laravel Scout + MeiliSearch | Latest |
| Testing | PHPUnit + Pest | Latest |
| Deployment | Docker + Nginx + Supervisor | — |
| CI/CD | GitHub Actions | — |
| Monitoring | Laravel Telescope (dev) + Sentry (prod) | — |

### 5.2 Arsitektur Aplikasi

```
┌─────────────────────────────────────────────────────────────┐
│                        BROWSER / MOBILE                      │
│              (Tailwind CSS + Alpine.js + Livewire)           │
└────────────────────────┬────────────────────────────────────┘
                         │ HTTPS
┌────────────────────────▼────────────────────────────────────┐
│                      NGINX (Web Server)                      │
│                   SSL Termination + Proxy                    │
└────────────────────────┬────────────────────────────────────┘
                         │
┌────────────────────────▼────────────────────────────────────┐
│                   LARAVEL APPLICATION                        │
│  ┌───────────┐  ┌──────────────┐  ┌──────────────────────┐  │
│  │  Routes   │  │  Middleware  │  │    Service Layer     │  │
│  │ (web/api) │  │ Auth+RBAC    │  │  (Business Logic)    │  │
│  └───────────┘  └──────────────┘  └──────────────────────┘  │
│  ┌───────────┐  ┌──────────────┐  ┌──────────────────────┐  │
│  │Controllers│  │   Livewire   │  │   Eloquent Models    │  │
│  │           │  │  Components  │  │   + Repositories     │  │
│  └───────────┘  └──────────────┘  └──────────────────────┘  │
└───────┬────────────────┬─────────────────┬──────────────────┘
        │                │                 │
┌───────▼──────┐  ┌──────▼──────┐  ┌──────▼──────┐
│    MySQL     │  │    Redis    │  │   Storage   │
│  (Primary +  │  │ (Cache +    │  │ (Local/S3)  │
│  Read Replica│  │  Queue +    │  │  Uploads +  │
│  )           │  │  Session)   │  │  Reports    │
└──────────────┘  └─────────────┘  └─────────────┘
        │
┌───────▼──────────────────────────────────────────┐
│              QUEUE WORKERS (Supervisor)           │
│  - SendNotificationEmail                         │
│  - GenerateAttendanceReport                      │
│  - ProcessQRCodeScan                             │
│  - SendWhatsAppNotification                      │
└──────────────────────────────────────────────────┘
```

### 5.3 Struktur Direktori Laravel

```
app/
├── Console/
│   └── Commands/
│       ├── GenerateDailyAttendanceReport.php
│       └── SendAbsenceNotification.php
├── Exceptions/
│   └── Handler.php
├── Http/
│   ├── Controllers/
│   │   ├── Auth/
│   │   │   ├── LoginController.php
│   │   │   └── ForgotPasswordController.php
│   │   ├── Admin/
│   │   │   ├── UserController.php
│   │   │   ├── RoleController.php
│   │   │   └── PermissionController.php
│   │   ├── Academic/
│   │   │   ├── AcademicYearController.php
│   │   │   ├── ClassroomController.php
│   │   │   └── SubjectController.php
│   │   ├── Attendance/
│   │   │   ├── AttendanceController.php
│   │   │   ├── QrScanController.php
│   │   │   └── PermitController.php
│   │   ├── Registration/
│   │   │   ├── RegistrationController.php
│   │   │   └── DocumentController.php
│   │   ├── Student/
│   │   │   └── StudentController.php
│   │   ├── Teacher/
│   │   │   └── TeacherController.php
│   │   └── Report/
│   │       └── ReportController.php
│   ├── Middleware/
│   │   ├── CheckPermission.php
│   │   ├── CheckMenuAccess.php
│   │   └── LogActivity.php
│   └── Requests/
│       ├── StoreStudentRequest.php
│       ├── StoreAttendanceRequest.php
│       └── StoreRegistrationRequest.php
├── Livewire/
│   ├── Attendance/
│   │   ├── AttendanceForm.php
│   │   └── QrScanner.php
│   ├── Registration/
│   │   └── RegistrationWizard.php
│   └── Report/
│       └── AttendanceChart.php
├── Models/
│   ├── User.php
│   ├── Role.php
│   ├── Permission.php
│   ├── Menu.php
│   ├── School.php
│   ├── AcademicYear.php
│   ├── Classroom.php
│   ├── Subject.php
│   ├── Student.php
│   ├── Teacher.php
│   ├── Parent.php (Guardian.php)
│   ├── Attendance.php
│   ├── AttendancePermit.php
│   ├── QrCode.php
│   ├── Schedule.php
│   ├── Registration.php
│   ├── RegistrationDocument.php
│   ├── ActivityLog.php
│   └── Setting.php
├── Policies/
│   ├── StudentPolicy.php
│   ├── AttendancePolicy.php
│   └── RegistrationPolicy.php
├── Services/
│   ├── AttendanceService.php
│   ├── QrCodeService.php
│   ├── RegistrationService.php
│   ├── NotificationService.php
│   ├── ReportService.php
│   └── RbacService.php
├── Repositories/
│   ├── AttendanceRepository.php
│   ├── StudentRepository.php
│   └── ReportRepository.php
├── Jobs/
│   ├── SendAbsenceNotificationEmail.php
│   ├── SendWhatsAppNotification.php
│   └── GeneratePdfReport.php
├── Notifications/
│   ├── AbsenceAlert.php
│   ├── RegistrationStatusChanged.php
│   └── PermitStatusChanged.php
├── Exports/
│   ├── AttendanceExport.php
│   └── StudentExport.php
└── Imports/
    └── StudentImport.php
```

### 5.4 Desain Database — Entity Relationship

Relasi antar entitas utama:

```
schools 1──∞ academic_years
schools 1──∞ students
schools 1──∞ teachers
schools 1──∞ classrooms
schools 1──∞ subjects
schools 1──∞ settings

academic_years 1──∞ classrooms
academic_years 1──∞ classroom_students (pivot)
academic_years 1──∞ teacher_subjects (pivot)
academic_years 1──∞ schedules
academic_years 1──∞ registrations

classrooms ∞──∞ students     (via classroom_students)
classrooms ∞──∞ teachers     (via teacher_subjects)
classrooms 1──∞ attendances
classrooms 1──∞ schedules

students 1──∞ parents
students 1──1 users (opsional)
students 1──∞ attendances
students 1──∞ attendance_permits
students 1──1 qr_codes

teachers 1──1 users
teachers ∞──∞ subjects (via teacher_subjects)
teachers 1──∞ attendances (sebagai pengisi absensi)

users ∞──∞ roles    (via role_user)
roles ∞──∞ permissions (via role_permission)
roles ∞──∞ menus    (via menu_role)
menus 1──∞ menus    (self-referential: parent_id)
```

### 5.5 Keamanan — Middleware Pipeline

```
Request
  │
  ▼
[web/api Middleware Group]
  ├── EncryptCookies
  ├── AddQueuedCookiesToResponse
  ├── StartSession
  ├── ShareErrorsFromSession
  ├── VerifyCsrfToken (web only)
  └── SubstituteBindings
  │
  ▼
[auth Middleware]
  └── Authenticate → redirect ke login jika belum auth
  │
  ▼
[CheckPermission Middleware]
  └── Cek permission string (e.g. 'siswa.create') dari role user
  │
  ▼
[LogActivity Middleware]
  └── Catat request ke activity_logs
  │
  ▼
[Controller Action]
  └── Gate::authorize() / Policy check tambahan
```

---

## 6. DESAIN ANTARMUKA (UI/UX)

### 6.1 Layout Umum

```
┌─────────────────────────────────────────────────────────────┐
│  HEADER: Logo | Sekolah | Notifikasi 🔔 | Avatar User ▾     │
├──────────────┬──────────────────────────────────────────────┤
│              │  BREADCRUMB: Dashboard > Absensi > Input     │
│  SIDEBAR     ├──────────────────────────────────────────────┤
│  (dinamis    │                                              │
│  berdasarkan │         AREA KONTEN UTAMA                    │
│  role)       │                                              │
│              │  - Form / Tabel / Chart / Laporan            │
│  🏠 Dashboard│                                              │
│  📋 PPDB     │                                              │
│  👥 Siswa   │                                              │
│  👨‍🏫 Guru    │                                              │
│  ✅ Absensi  │                                              │
│  📅 Jadwal   ├──────────────────────────────────────────────┤
│  📊 Laporan  │  FOOTER: Versi sistem | © 2025               │
│  ⚙️ Setting   │                                              │
└──────────────┴──────────────────────────────────────────────┘
```

### 6.2 Halaman Dashboard

**Widget yang ditampilkan berdasarkan role:**

| Widget | Super Admin | Admin | Guru | Siswa | Ortu |
|--------|-------------|-------|------|-------|------|
| Total siswa aktif hari ini | ✅ | ✅ | ✅ (kelas) | ❌ | ❌ |
| Pie chart kehadiran hari ini | ✅ | ✅ | ✅ (kelas) | ❌ | ❌ |
| Rekap absensi pribadi | ❌ | ❌ | ❌ | ✅ | ✅ |
| Daftar siswa alpha terbanyak | ✅ | ✅ | ✅ (kelas) | ❌ | ❌ |
| Pending approval izin | ✅ | ✅ | ✅ | ❌ | ❌ |
| Statistik PPDB | ✅ | ✅ | ❌ | ❌ | ❌ |
| Notifikasi terbaru | ✅ | ✅ | ✅ | ✅ | ✅ |
| Kalender akademik | ✅ | ✅ | ✅ | ✅ | ✅ |

### 6.3 Alur User Journey Utama

#### Alur Absensi Guru (Manual)
```
Login → Dashboard → Menu Absensi → Pilih Kelas
  → Pilih Tanggal → Lihat daftar siswa
  → Set status tiap siswa (H/S/I/A)
  → Submit → Konfirmasi → Notifikasi terkirim ke ortu
```

#### Alur Absensi via QR Scan
```
Guru buka halaman Scan QR → Aktifkan kamera
  → Arahkan ke kartu siswa → QR terbaca
  → Sistem validasi token + tanggal
  → Status "Hadir" ter-record otomatis
  → Nama siswa muncul di list "Sudah Hadir"
```

#### Alur PPDB Online
```
[Publik] Buka form pendaftaran → Isi data diri + orang tua
  → Upload berkas → Submit → Dapat nomor pendaftaran
  → Email konfirmasi terkirim
  → [Operator] Login → Verifikasi berkas
  → Ubah status diterima/ditolak
  → Email notifikasi ke calon siswa
  → [Admin] Konversi ke data siswa aktif
```

#### Alur Pengajuan Izin
```
[Siswa/Ortu] Login → Menu Izin → Isi form
  → Upload lampiran surat → Submit
  → [Wali Kelas] Notifikasi masuk
  → Approve/Reject izin
  → Absensi otomatis terupdate
  → Notifikasi status ke pemohon
```

---

## 7. API DESIGN (Internal)

### 7.1 Konvensi

- Base URL: `/api/v1/`
- Autentikasi: Laravel Sanctum (Bearer Token)
- Format Response: JSON
- Error format: `{ "message": "...", "errors": {...} }`

### 7.2 Endpoint Utama

| Method | Endpoint | Deskripsi | Role |
|--------|----------|-----------|------|
| POST | `/api/v1/auth/login` | Login user | Public |
| POST | `/api/v1/auth/logout` | Logout | Auth |
| GET | `/api/v1/students` | Daftar siswa | Admin, Guru |
| POST | `/api/v1/students` | Tambah siswa | Admin |
| GET | `/api/v1/students/{id}` | Detail siswa | Admin, Guru, Siswa (diri) |
| PUT | `/api/v1/students/{id}` | Update siswa | Admin |
| GET | `/api/v1/attendances` | Daftar absensi | Admin, Guru |
| POST | `/api/v1/attendances` | Input absensi | Admin, Guru |
| PUT | `/api/v1/attendances/{id}` | Edit absensi | Admin, Guru |
| POST | `/api/v1/attendances/qr-scan` | Scan QR absensi | Guru |
| GET | `/api/v1/registrations` | Daftar pendaftar | Admin, Operator PPDB |
| POST | `/api/v1/registrations` | Daftar baru | Public |
| PATCH | `/api/v1/registrations/{id}/status` | Update status | Admin, Operator PPDB |
| GET | `/api/v1/reports/attendance` | Laporan absensi | Admin, Guru |
| GET | `/api/v1/qr/{studentId}` | Generate QR | Admin, Siswa |
| GET | `/api/v1/menus` | Menu berdasarkan role | Auth |

---

## 8. TESTING STRATEGY

### 8.1 Unit Testing

```
Tests/Unit/
├── Services/
│   ├── AttendanceServiceTest.php     (hitung persentase, validasi QR)
│   ├── QrCodeServiceTest.php         (generate, validate token)
│   ├── RegistrationServiceTest.php   (workflow status)
│   └── RbacServiceTest.php           (permission check)
└── Models/
    ├── AttendanceTest.php
    └── StudentTest.php
```

### 8.2 Feature Testing

```
Tests/Feature/
├── Auth/
│   ├── LoginTest.php
│   └── PermissionTest.php
├── Attendance/
│   ├── ManualAttendanceTest.php
│   ├── QrScanAttendanceTest.php
│   └── PermitTest.php
├── Registration/
│   └── PpdbWorkflowTest.php
└── Report/
    └── AttendanceReportTest.php
```

### 8.3 Target Coverage

| Modul | Target Coverage |
|-------|----------------|
| Services | ≥ 80% |
| Controllers | ≥ 70% |
| Models | ≥ 60% |
| Middleware | ≥ 90% |
| Overall | ≥ 70% |

---

## 9. DEPLOYMENT & INFRASTRUKTUR

### 9.1 Environment

| Environment | URL | Tujuan |
|-------------|-----|--------|
| Development | localhost:8000 | Pengembangan lokal |
| Staging | staging.sekolah.id | UAT & review |
| Production | sekolah.id | Live system |

### 9.2 Minimum Server Requirements (Production)

| Komponen | Minimum | Rekomendasi |
|----------|---------|-------------|
| CPU | 2 vCPU | 4 vCPU |
| RAM | 4 GB | 8 GB |
| Storage | 50 GB SSD | 100 GB SSD |
| OS | Ubuntu 22.04 LTS | Ubuntu 22.04 LTS |
| PHP | 8.3 | 8.3 |
| MySQL | 8.0 | 8.0 + Read Replica |
| Redis | 7.x | 7.x |
| Nginx | 1.24+ | 1.24+ |

### 9.3 Docker Compose (Development)

```yaml
services:
  app:
    build: .
    volumes: ['.:/var/www']
    depends_on: [mysql, redis]

  nginx:
    image: nginx:alpine
    ports: ['8000:80']

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: sekolah_db
      MYSQL_ROOT_PASSWORD: secret

  redis:
    image: redis:7-alpine

  queue:
    build: .
    command: php artisan queue:work --sleep=3 --tries=3

  scheduler:
    build: .
    command: sh -c "while true; do php artisan schedule:run; sleep 60; done"
```

---

---

# BAGIAN II — MINIMUM VIABLE PRODUCT (MVP)

---

## 1. FILOSOFI MVP

MVP (Minimum Viable Product) ini dirancang untuk **menghadirkan nilai inti sistem secepat mungkin** kepada pengguna nyata, kemudian mengiterasi berdasarkan feedback. MVP bukanlah produk yang "setengah jadi", melainkan produk yang **lengkap untuk kebutuhan paling kritis** — yaitu absensi siswa yang akurat dan PPDB digital yang fungsional.

### Prinsip Prioritas MVP (MoSCoW)

| Kategori | Definisi | Jumlah FR |
|----------|----------|-----------|
| **Must Have** | Wajib ada di MVP, sistem tidak berguna tanpa ini | 42 FR |
| **Should Have** | Penting tapi bisa dirilis di sprint 2–3 | 18 FR |
| **Could Have** | Baik dimiliki, masuk roadmap v1.1 | 12 FR |
| **Won't Have** | Tidak di scope v1, rencanakan untuk v2 | 5 FR |

---

## 2. SCOPE MVP — FITUR YANG DIRILIS

### ✅ MVP Fase 1 (Sprint 1–4 | 8 Minggu)

**Yang masuk MVP Fase 1:**

1. **Sistem Autentikasi Lengkap**
   - Login, logout, lupa password
   - Manajemen session & keamanan dasar
   - Profil user (edit nama, password, avatar)

2. **Manajemen Role & Permission (RBAC)**
   - 6 role bawaan: Super Admin, Admin Sekolah, Guru, Siswa, Orang Tua, Operator PPDB
   - Permission granular per modul (CRUD)
   - Menu sidebar dinamis berdasarkan role
   - Middleware proteksi route

3. **Data Master Sekolah**
   - Profil sekolah
   - Tahun ajaran & semester
   - Daftar kelas/rombel
   - Daftar mata pelajaran

4. **Data Siswa**
   - CRUD data siswa lengkap
   - Import dari Excel (template tersedia)
   - Export ke Excel
   - Assign ke kelas
   - Generate QR Code kartu pelajar
   - Pencarian & filter

5. **Data Guru**
   - CRUD data guru
   - Assign ke mata pelajaran dan kelas
   - Penugasan wali kelas

6. **Absensi Harian (Manual)**
   - Input absensi per kelas per hari
   - Status: Hadir, Sakit, Izin, Alpha
   - Edit absensi
   - Rekap harian

7. **Absensi via QR Code**
   - Scan QR dari kamera browser (tidak perlu app)
   - Validasi token QR
   - Record otomatis

8. **Jadwal Pelajaran**
   - CRUD jadwal per kelas
   - Manajemen hari libur
   - View jadwal per siswa/guru

9. **PPDB Online**
   - Form pendaftaran publik
   - Upload berkas digital
   - Nomor pendaftaran otomatis
   - Workflow verifikasi operator
   - Email konfirmasi otomatis
   - Konversi ke siswa aktif

10. **Laporan Dasar**
    - Rekap absensi per kelas per bulan
    - Laporan per siswa
    - Export PDF dan Excel

11. **Notifikasi In-App + Email**
    - Notifikasi absensi alpha ke orang tua
    - Status PPDB via email
    - Bell notification di header

12. **Pengaturan Sistem**
    - Jam masuk/pulang sekolah
    - Batas alpha
    - Pengaturan SMTP
    - Activity log

---

### 🔄 MVP Fase 2 (Sprint 5–6 | 4 Minggu)

**Yang ditambahkan di Fase 2 (Should Have):**

- Pengajuan izin/sakit digital dengan workflow approval
- Absensi per mata pelajaran (tidak hanya harian)
- Dashboard statistik dengan chart interaktif
- Laporan persentase kehadiran per kelas
- Notifikasi WhatsApp (via API pihak ketiga)
- Import data guru dari Excel
- Laporan PPDB lengkap
- Kalender akademik interaktif
- Cetak jadwal ke PDF
- Validasi bentrok jadwal

---

### 🗺️ Roadmap v1.1 (Post-MVP | Q3 2025)

- Filter dan search lanjutan (Laravel Scout + MeiliSearch)
- Laporan rekap alpha ranking (peringkat)
- Manajemen menu dinamis dari UI
- Template notifikasi email yang dapat dikustomisasi
- Backup/restore database via UI
- API publik untuk integrasi pihak ketiga
- Mobile-friendly QR scanner yang lebih canggih
- Riwayat kelas siswa per tahun

---

### 🚀 Roadmap v2.0 (Future)

- Integrasi fingerprint hardware
- Integrasi face recognition
- Modul penilaian/rapor akademik
- Pembayaran SPP online
- Aplikasi mobile (Flutter)
- Multi-tenant (satu instance untuk banyak sekolah)
- Two-Factor Authentication (2FA)
- Modul e-learning terintegrasi

---

## 3. ESTIMASI TIMELINE PENGERJAAN

### Sprint Planning MVP Fase 1 (8 Minggu)

| Sprint | Durasi | Deliverable |
|--------|--------|-------------|
| **Sprint 1** | Minggu 1–2 | Setup proyek, Auth, RBAC (role, permission, menu dinamis), Middleware |
| **Sprint 2** | Minggu 3–4 | Data Master (sekolah, tahun ajaran, kelas, mapel), Data Siswa (CRUD + import), Data Guru |
| **Sprint 3** | Minggu 5–6 | Jadwal Pelajaran, QR Code Generator, Absensi Manual + QR Scan, Notifikasi email dasar |
| **Sprint 4** | Minggu 7–8 | PPDB Online (form publik + workflow), Laporan dasar, Export PDF/Excel, Testing & Bug fix |

### Detail Sprint 1 (Fondasi Sistem)

```
Minggu 1:
  ✅ Setup Laravel 11 + Tailwind + Alpine.js + Livewire
  ✅ Konfigurasi Docker development environment
  ✅ Database migrations: users, roles, permissions, menus, pivot tables
  ✅ Seeder: 6 role bawaan + permission lengkap + menu default
  ✅ Login page + Auth middleware
  ✅ Forgot password flow

Minggu 2:
  ✅ Halaman manajemen Role (CRUD)
  ✅ Halaman manajemen Permission (assign ke role)
  ✅ Halaman manajemen User (CRUD + assign role)
  ✅ Halaman manajemen Menu (aktif/nonaktif + urutan)
  ✅ Sidebar dinamis berdasarkan role
  ✅ Middleware CheckPermission
  ✅ Middleware LogActivity
  ✅ Unit test: RbacService
```

### Detail Sprint 2 (Data Master & Siswa)

```
Minggu 3:
  ✅ Migrasi + Model: schools, academic_years, classrooms, subjects
  ✅ CRUD Sekolah + upload logo
  ✅ CRUD Tahun Ajaran (set aktif/non-aktif)
  ✅ CRUD Kelas/Rombel + assign wali kelas
  ✅ CRUD Mata Pelajaran

Minggu 4:
  ✅ Migrasi + Model: students, parents, classroom_students
  ✅ CRUD Siswa (form lengkap + upload foto)
  ✅ Import siswa dari Excel (template + validasi)
  ✅ Export siswa ke Excel
  ✅ Assign siswa ke kelas (batch)
  ✅ CRUD Guru + assign mapel + wali kelas
  ✅ Generate QR Code per siswa
  ✅ Feature test: StudentImport
```

### Detail Sprint 3 (Inti Absensi)

```
Minggu 5:
  ✅ Migrasi + Model: schedules, attendances, qr_codes
  ✅ CRUD Jadwal pelajaran per kelas
  ✅ Manajemen hari libur
  ✅ Halaman input absensi harian (Livewire)
  ✅ Validasi: tidak bisa input absensi di hari libur
  ✅ Edit absensi + audit trail

Minggu 6:
  ✅ QR Scanner halaman (gunakan kamera browser via JS library)
  ✅ AttendanceService: proses scan QR + validasi token
  ✅ QrCodeService: generate + regenerate
  ✅ Queue Job: SendAbsenceNotificationEmail
  ✅ Notifikasi email ke orang tua saat alpha
  ✅ Feature test: QrScanAttendanceTest
```

### Detail Sprint 4 (PPDB + Laporan + Testing)

```
Minggu 7:
  ✅ Form PPDB publik (multi-step wizard, Livewire)
  ✅ Upload berkas PPDB (validasi tipe + ukuran)
  ✅ Generate nomor pendaftaran otomatis
  ✅ Email konfirmasi ke calon siswa
  ✅ Halaman verifikasi berkas (operator)
  ✅ Workflow perubahan status + email notifikasi
  ✅ Konversi pendaftar diterima → siswa aktif
  ✅ Halaman cek status pendaftaran (publik)

Minggu 8:
  ✅ Laporan rekap absensi kelas per bulan
  ✅ Laporan per siswa
  ✅ Export PDF (DomPDF)
  ✅ Export Excel (Laravel Excel)
  ✅ Dashboard: widget ringkasan hari ini
  ✅ Pengaturan sistem (jam masuk, batas alpha, SMTP)
  ✅ Activity log viewer
  ✅ End-to-end testing seluruh alur utama
  ✅ Bug fixing & polish UI
  ✅ Dokumentasi API (Swagger)
  ✅ Deployment ke staging + UAT
```

---

## 4. DEFINISI DONE (Definition of Done)

Sebuah fitur dinyatakan **DONE** jika memenuhi seluruh kriteria berikut:

- [ ] Kode telah di-review oleh minimal 1 developer lain (code review)
- [ ] Unit test / feature test telah ditulis dan passed
- [ ] Tidak ada PHP error, warning, atau deprecation di log
- [ ] Form validation berjalan di sisi server (HTTP 422 pada invalid input)
- [ ] Permission/Gate sudah diterapkan di controller dan route
- [ ] Aksi penting tercatat di activity_log
- [ ] Tampilan responsif di mobile (min 360px) dan desktop (max 1440px)
- [ ] Diuji di Chrome, Firefox, dan Safari
- [ ] Dokumentasi fungsi/method tersedia (PHPDoc)
- [ ] Tidak ada N+1 query issue (gunakan eager loading)
- [ ] Hasil QA testing pada environment staging passed

---

## 5. RISIKO & MITIGASI

| # | Risiko | Probabilitas | Dampak | Mitigasi |
|---|--------|-------------|--------|---------|
| 1 | Kamera browser tidak support di semua device untuk QR scan | Sedang | Tinggi | Sediakan fallback input manual NISN; test di berbagai device |
| 2 | Volume upload berkas PPDB membebani storage | Rendah | Sedang | Kompresi gambar otomatis; batasi ukuran file 5MB; gunakan S3 |
| 3 | Email notifikasi dianggap spam oleh provider | Sedang | Sedang | Gunakan domain email sekolah resmi; konfigurasi SPF/DKIM/DMARC |
| 4 | Import Excel dengan format tidak standar | Tinggi | Sedang | Sediakan template Excel yang sangat jelas dengan validasi + pesan error deskriptif |
| 5 | QR Code dipindai oleh orang lain (proxy absensi) | Sedang | Tinggi | QR dinamis per hari + validasi IP/lokasi (opsional) |
| 6 | Keterlambatan delivery Sprint karena scope creep | Sedang | Tinggi | Strict sprint planning; fitur tambahan masuk backlog, bukan sprint aktif |
| 7 | Data siswa tidak konsisten saat migrasi dari sistem lama | Tinggi | Tinggi | Buat script cleaning + validasi; dry run import sebelum production |
| 8 | Resistensi guru terhadap sistem baru | Sedang | Sedang | Buat UI semudah mungkin; sediakan training + panduan video singkat |

---

## 6. KRITERIA KEBERHASILAN MVP

MVP dianggap berhasil jika setelah 4 minggu go-live:

| Metrik | Target |
|--------|--------|
| Uptime sistem | ≥ 99% |
| Guru yang aktif menggunakan fitur absensi | ≥ 80% dari total guru |
| Absensi yang diinput melalui sistem (vs manual) | ≥ 90% hari sekolah |
| Waktu input absensi per kelas | ≤ 5 menit |
| Orang tua yang menerima notifikasi ketidakhadiran | ≥ 95% dari kejadian |
| Pendaftar PPDB yang berhasil submit online | ≥ 70% dari total pendaftar |
| Bug critical yang dilaporkan pengguna | 0 bug P1 yang belum terselesaikan |
| Kepuasan pengguna (survey singkat 1–5) | Rata-rata ≥ 4.0 |

---

## 7. TEAM & RESOURCE REQUIREMENTS

### Tim Pengembangan MVP

| Peran | Jumlah | Tanggung Jawab |
|-------|--------|----------------|
| Backend Developer | 2 | Laravel, API, database, queue, testing |
| Frontend Developer | 1 | Livewire components, Tailwind UI, responsiveness |
| QA Engineer | 1 | Testing, bug reporting, UAT coordination |
| Project Manager | 1 | Sprint planning, stakeholder komunikasi, risiko |
| UI/UX Designer | 1 (part-time) | Wireframe, desain komponen, review UI |
| DevOps | 1 (part-time) | Docker, CI/CD, deployment, monitoring |

### Tools & Lisensi

| Tool | Kegunaan | Biaya |
|------|---------|-------|
| GitHub | Version control + CI/CD | Gratis (public) / ~$4/user/bulan |
| Mailtrap | Testing email dev | Gratis (1000 email/bulan) |
| SendGrid / Mailgun | Email production | ~$15/bulan |
| Redis Cloud | Cache & queue | ~$7/bulan (30MB) |
| Sentry | Error monitoring | Gratis (5K error/bulan) |
| Figma | Desain UI | Gratis / ~$12/bulan |
| DigitalOcean / Hetzner | VPS production | ~$24–48/bulan |

**Estimasi Total Biaya Infrastructure per Bulan:** Rp 700.000 – Rp 1.500.000

---

## 8. CHECKLIST PRE-LAUNCH

### Teknis
- [ ] Semua migration berjalan bersih di fresh database
- [ ] Seeder data default (role, permission, menu, admin user) berjalan
- [ ] Seluruh test suite passed (>= 70% coverage)
- [ ] Tidak ada query N+1 yang terdeteksi (Laravel Debugbar clean)
- [ ] File `.env.production` dikonfigurasi dengan benar
- [ ] APP_DEBUG=false di production
- [ ] Storage link dibuat (`php artisan storage:link`)
- [ ] Queue worker berjalan via Supervisor
- [ ] Scheduler berjalan via Cron
- [ ] Redis terkoneksi dan berfungsi
- [ ] Email SMTP tertest berhasil kirim
- [ ] Backup database otomatis terjadwal
- [ ] SSL certificate terpasang dan valid
- [ ] Rate limiting aktif di login endpoint

### Fungsional
- [ ] Login dan logout berhasil
- [ ] Role Super Admin dapat akses semua menu
- [ ] Role Guru hanya melihat menu yang sesuai
- [ ] Input absensi harian berhasil dan tersimpan
- [ ] QR scan absensi berhasil
- [ ] Email notifikasi alpha terkirim ke orang tua
- [ ] Form PPDB publik dapat disubmit tanpa login
- [ ] Upload berkas PPDB berhasil tersimpan
- [ ] Laporan dapat di-export ke PDF dan Excel
- [ ] Import siswa dari Excel berjalan dengan validasi

### Non-Teknis
- [ ] Buku panduan pengguna tersedia (minimal Admin dan Guru)
- [ ] Video tutorial singkat tersedia
- [ ] Nomor WhatsApp/email support tersedia
- [ ] Data siswa awal telah diimport dari sistem lama
- [ ] Akun user untuk seluruh guru telah dibuat
- [ ] Training singkat untuk admin dan guru telah dilakukan
- [ ] UAT sign-off dari stakeholder kunci

---

## 9. KONVENSI KODE & STANDAR

### Naming Convention

```php
// Model: PascalCase singular
class AcademicYear extends Model {}

// Table: snake_case plural
protected $table = 'academic_years';

// Controller: PascalCase + Controller suffix
class AttendanceController extends Controller {}

// Service: PascalCase + Service suffix
class AttendanceService {}

// Method: camelCase, verba deskriptif
public function markAttendance(Request $request) {}
public function generateMonthlyReport(int $classroomId, string $month) {}

// Route names: dot notation, resource-style
Route::resource('students', StudentController::class)->names([
    'index' => 'students.index',
    'store' => 'students.store',
]);

// Permission names: module.action
// e.g.: siswa.create, siswa.read, siswa.update, siswa.delete
//       absensi.create, absensi.read, absensi.update
//       ppdb.verifikasi, laporan.export

// Blade views: snake_case dalam folder modul
// resources/views/attendance/daily-input.blade.php
// resources/views/student/index.blade.php
```

### Git Branching Strategy

```
main           ← Production-ready code only
  └── develop  ← Integration branch
        ├── feature/FR-01-auth-login
        ├── feature/FR-06-attendance-manual
        ├── feature/FR-03-ppdb-form
        ├── fix/bug-qr-token-expired
        └── chore/update-dependencies
```

**Commit Message Convention:**
```
feat(attendance): add QR code scanning functionality
fix(auth): resolve session timeout issue on mobile
test(report): add monthly report generation test
docs(api): update Swagger documentation for attendance endpoints
refactor(rbac): extract permission check to dedicated service
```

---

*Dokumen ini merupakan dokumen hidup yang akan diperbarui seiring perkembangan proyek. Setiap perubahan signifikan harus dikomunikasikan ke seluruh tim dan stakeholder terkait.*

---

**Dibuat oleh:** Tim Pengembangan  
**Review oleh:** Project Manager  
**Disetujui oleh:** Stakeholder / Kepala Sekolah  
**Versi Berikutnya:** 1.1.0 (setelah Sprint 2 selesai)
