# 📋 IMPLEMENTATION BACKLOG DETAILED SPECIFICATION

---

# Phase 1: Stabilitas Performa, Refactoring & Safety Optimization

### Summary Overview
- **Tujuan**: Mengoptimalkan kinerja ekspor data absensi ribuan baris di *shared hosting* menggunakan *query chunking*, menghapus class policy redundan, serta menerapkan *backend rate limiter* pada tombol sinkronisasi manual.
- **Modul**: Modul 6 (*Reports & Export*), Modul 5 (*Sync Engine*), Modul 8 (*Academic Calendar Policy Refactor*).
- **User Story**: 
  - *Sebagai Admin TU*, saya ingin mengekspor laporan absensi bulanan ribuan baris tanpa mengalami error *Out of Memory* / Timeout di shared hosting.
  - *Sebagai System Administrator*, saya ingin tombol sinkronisasi manual dilindungi dari klik beruntun berlebihan yang dapat membebani server socket TCP.
- **Acceptance Criteria**:
  1. Ekspor CSV/Excel mengolah data dalam *chunk* 500 baris menggunakan *PHP Output Stream*.
  2. Aksi tombol `syncManual` diikutsertakan *rate-limiter* backend (maksimal 1 kali eksekusi per 30 detik per user).
  3. Class policy `AcademicCalendarPolicy.php` berhasil dikonsolidasikan penuh ke `AcademicYearPolicy.php`.
  4. Seluruh 52 pengujian PHPUnit suite tetap PASS 100%.
- **Dependency**: Modul 5 (*Sync Engine*) & Modul 6 (*Reports & Export*).
- **Estimasi Kompleksitas**: Low
- **Estimasi Jumlah File Baru**: 0 File
- **Estimasi File Diubah**: 4 File
- **Risiko**: Rendah (Sudah diproteksi oleh pengujian otomatis yang ada).
- **Prioritas**: High (P1)

---

### Task Tree Breakdown
```text
Phase 1
├── Task 1.1 Query Chunking & Memory Optimization pada Report Export
├── Task 1.2 Backend Rate Limiter pada Sync Engine
└── Task 1.3 Konsolidasi & Pembersihan Redundant Policy
```

---

#### 🔹 Task 1.1: Query Chunking & Memory Optimization pada Report Export
- **Requirement**: Penerapan `Query::chunk(500)` dan streaming response pada pembentukan file CSV/Excel di shared hosting.
- **Database**: Tidak ada perubahan skema database (`attendance_records`).
- **Model**: `AttendanceRecord`.
- **Repository**: `AttendanceRecordRepository`.
- **Service**: `ReportExportService`.
- **Policy**: `AttendanceRecordPolicy`.
- **Livewire Component**: `Reports\ReportIndex`.
- **Route**: GET `/reports`.
- **Migration**: Tidak ada.
- **Seeder**: Tidak ada.
- **Factory**: Tidak ada.
- **Test**: `tests/Unit/ReportExportServiceTest.php`.
- **Dokumentasi**: Diperbarui pada `walkthrough.md`.

#### 🔹 Task 1.2: Backend Rate Limiter pada Sync Engine
- **Requirement**: Proteksi pembatasan frekuensi eksekusi penarikan data socket TCP per user (1x per 30 detik).
- **Database**: Memanfaatkan tabel `cache` Laravel.
- **Model**: `FingerprintMachine`.
- **Repository**: `FingerprintMachineRepository`.
- **Service**: `SyncService`.
- **Policy**: `FingerprintMachinePolicy`.
- **Livewire Component**: `Sync\SyncIndex` & `Dashboard`.
- **Route**: GET `/sync` & GET `/dashboard`.
- **Migration**: Tidak ada.
- **Seeder**: Tidak ada.
- **Factory**: Tidak ada.
- **Test**: `tests/Feature/SyncRateLimiterTest.php`.
- **Dokumentasi**: Diperbarui pada `walkthrough.md`.

#### 🔹 Task 1.3: Konsolidasi & Pembersihan Redundant Policy
- **Requirement**: Menggabungkan aturan otorisasi `AcademicCalendarPolicy` ke dalam `AcademicYearPolicy`.
- **Database**: Tidak ada.
- **Model**: `AcademicYear`, `SchoolHoliday`, `AcademicEvent`.
- **Repository**: `AcademicCalendarRepository`.
- **Service**: `AcademicCalendarService`.
- **Policy**: `AcademicYearPolicy` (Menghapus file `AcademicCalendarPolicy.php`).
- **Livewire Component**: `Academic\AcademicCalendarIndex`.
- **Route**: GET `/academic-calendar`.
- **Migration**: Tidak ada.
- **Seeder**: Tidak ada.
- **Factory**: Tidak ada.
- **Test**: `tests/Feature/AcademicCalendarTest.php`.
- **Dokumentasi**: Diperbarui pada `walkthrough.md`.

---

# Phase 2: Integrasi WhatsApp Gateway Aktif (Notifikasi Otomatis Ortu)

### Summary Overview
- **Tujuan**: Menghubungkan `WhatsAppNotificationChannelStub` dengan API HTTP Client vendor WA Gateway (Fonnte/Wablas) untuk pengiriman pesanan notifikasi otomatis ke HP Orang Tua Siswa.
- **Modul**: Modul 10 (*Notification Center Multi-Channel*) & Modul 9 (*Leave Approval Workflow*).
- **User Story**: 
  - *Sebagai Orang Tua Siswa*, saya ingin menerima pesan WhatsApp otomatis saat anak saya ditandai Alpha/Terlambat atau saat permohonan izin disetujui sekolah.
  - *Sebagai Admin TU*, saya ingin pesan WA terkirim otomatis di belakang layar tanpa perlu mengetik manual.
- **Acceptance Criteria**:
  1. API Key Vendor WA Gateway terkonfigurasi secara terenkripsi di file `.env`.
  2. Saat `LeaveStatusUpdatedEvent` dipicu, listener mengirimkan payload HTTP POST ke API Vendor WA dengan batas *timeout* 5 detik.
  3. Kegagalan API Vendor WA tidak membuat error pada transaksi utama absensi (tercatat di log).
- **Dependency**: Phase 1 (*Infrastruktur Event & Listener Modul 9 & 10*).
- **Estimasi Kompleksitas**: Medium
- **Estimasi Jumlah File Baru**: 1 File
- **Estimasi File Diubah**: 4 File
- **Risiko**: Sedang (Ketergantungan pada koneksi jaringan internet API vendor eksternal).
- **Prioritas**: Medium (P2)

---

### Task Tree Breakdown
```text
Phase 2
├── Task 2.1 Implementasi API Client & Config WhatsApp Gateway Vendor
└── Task 2.2 Pemicuan Auto Notifikasi WA pada Event Disetujui Izin / Status Alpha
```

---

#### 🔹 Task 2.1: Implementasi API Client & Config WhatsApp Gateway Vendor
- **Requirement**: Integrasi HTTP Client Laravel dengan endpoint API Fonnte/Wablas.
- **Database**: Tabel `notifications`.
- **Model**: `Notification`.
- **Repository**: Tidak ada.
- **Service**: `NotificationService`.
- **Policy**: Tidak ada.
- **Livewire Component**: `Notifications\HeaderNotificationDropdown`.
- **Route**: Tidak ada.
- **Migration**: Tidak ada.
- **Seeder**: Tidak ada.
- **Factory**: Tidak ada.
- **Test**: `tests/Unit/WhatsAppNotificationChannelTest.php`.
- **Dokumentasi**: Diperbarui pada `walkthrough.md`.

#### 🔹 Task 2.2: Pemicuan Auto Notifikasi WA pada Event Disetujui Izin / Status Alpha
- **Requirement**: Menghubungkan `LeaveStatusUpdatedEvent` dengan `SendLeaveStatusNotificationListener` untuk menyusun format pesan WA ramah orang tua.
- **Database**: Tabel `leave_applications` & `users`.
- **Model**: `LeaveApplication`, `User`.
- **Repository**: `LeaveRepository`.
- **Service**: `LeaveService`.
- **Policy**: `LeaveApplicationPolicy`.
- **Livewire Component**: `Leave\LeaveApplicationIndex`.
- **Route**: GET `/leave-applications`.
- **Migration**: Tidak ada.
- **Seeder**: Tidak ada.
- **Factory**: Tidak ada.
- **Test**: `tests/Feature/LeaveNotificationIntegrationTest.php`.
- **Dokumentasi**: Diperbarui pada `walkthrough.md`.

---

# Phase 3: PWA & Mobile Web App Experience (Mobile Installability)

### Summary Overview
- **Tujuan**: Menjadikan aplikasi dapat di-install secara langsung sebagai Progressive Web App (PWA) di HP Guru, Siswa, dan Staf TU tanpa melalui Google PlayStore.
- **Modul**: Asset Layer (*Service Worker Cache & PWA Manifest*) & Frontend Layout.
- **User Story**: 
  - *Sebagai Guru / Siswa*, saya ingin memasang ikon aplikasi Absensi di layar utama HP saya agar mudah dibuka seperti aplikasi native.
- **Acceptance Criteria**:
  1. File `manifest.json` terkonfigurasi lengkap dengan nama app, tema warna slate/sky, dan ikon berbagai resolusi.
  2. `sw.js` (Service Worker) terdaftar dan melakukan caching pada aset static CSS/JS.
  3. Browser menampilkan prompt *"Add to Home Screen"* saat diakses via HP.
- **Dependency**: Phase 1 & Phase 2 (*Responsive UI & Domain HTTPS/SSL*).
- **Estimasi Kompleksitas**: Medium
- **Estimasi Jumlah File Baru**: 2 File
- **Estimasi File Diubah**: 2 File
- **Risiko**: Rendah (Potensi isu cache versi diatasi via versi dinamis `v1.0.x`).
- **Prioritas**: Medium (P2)

---

### Task Tree Breakdown
```text
Phase 3
├── Task 3.1 PWA Web App Manifest & App Icons Configuration
└── Task 3.2 Service Worker Cache Management & Register Script
```

---

#### 🔹 Task 3.1: PWA Web App Manifest & App Icons Configuration
- **Requirement**: Pembuatan metadata PWA manifest untuk Android/iOS.
- **Database**: Tidak ada.
- **Model**: Tidak ada.
- **Repository**: Tidak ada.
- **Service**: Tidak ada.
- **Policy**: Tidak ada.
- **Livewire Component**: Component layouts `components.layouts.app`.
- **Route**: GET `/manifest.json`.
- **Migration**: Tidak ada.
- **Seeder**: Tidak ada.
- **Factory**: Tidak ada.
- **Test**: `tests/Feature/PwaManifestTest.php`.
- **Dokumentasi**: Diperbarui pada `walkthrough.md`.

#### 🔹 Task 3.2: Service Worker Cache Management & Register Script
- **Requirement**: Skrip `sw.js` untuk mendukung caching offline aset static.
- **Database**: Tidak ada.
- **Model**: Tidak ada.
- **Repository**: Tidak ada.
- **Service**: Tidak ada.
- **Policy**: Tidak ada.
- **Livewire Component**: Component layouts `components.layouts.app`.
- **Route**: GET `/sw.js`.
- **Migration**: Tidak ada.
- **Seeder**: Tidak ada.
- **Factory**: Tidak ada.
- **Test**: `tests/Feature/ServiceWorkerTest.php`.
- **Dokumentasi**: Diperbarui pada `walkthrough.md`.

---

# Phase 4: Rekapitulasi Tunjangan Kehadiran Guru & Payroll Integration

### Summary Overview
- **Tujuan**: Membangun modul kalkulasi otomatis jam mengajar dan kehadiran efektif Guru untuk penentuan besaran tunjangan kehadiran bulanan berbasis presensi biometrik.
- **Modul**: Modul Tunjangan Kehadiran Guru (*Payroll Module Baru*), Modul 6 (*Reports*), Modul 3 (*Personnel*).
- **User Story**: 
  - *Sebagai Kepala Sekolah / Bendahara TU*, saya ingin melihat rekapitulasi total jam kehadiran efektif Guru dalam sebulan dan nominal tunjangan kehadiran yang siap dicetak.
- **Acceptance Criteria**:
  1. Tabel `teacher_payrolls` menyimpan akumulasi hari hadir, total jam kerja efektif, dan nominal tunjangan per bulan.
  2. Perhitungan otomatis mengalikan jumlah hari hadir verifikasi fingerprint dengan rate tunjangan per hari.
  3. Menyediakan ekspor Slip Tunjangan Kehadiran dalam format PDF/Excel Ber-Kop Surat.
- **Dependency**: Phase 1, Phase 2, & Phase 3 (*Data Presensi Terverifikasi Modul 5 & 6*).
- **Estimasi Kompleksitas**: High
- **Estimasi Jumlah File Baru**: 8 File
- **Estimasi File Diubah**: 2 File
- **Risiko**: Sedang (Kompleksitas insentif jam kerja jika ada jam mengajar ganti).
- **Prioritas**: Low (P3)

---

### Task Tree Breakdown
```text
Phase 4
├── Task 4.1 Skema Database & Model Tunjangan Kehadiran Guru
├── Task 4.2 Service Logika Perhitungan Tunjangan Kehadiran & Jam Efektif
└── Task 4.3 Halaman Livewire GUI & Ekspor Slip Tunjangan Kehadiran PDF/Excel
```

---

#### 🔹 Task 4.1: Skema Database & Model Tunjangan Kehadiran Guru
- **Requirement**: Pembuatan tabel `teacher_payrolls` dan relasi Eloquent ke model `User`.
- **Database**: Tabel `teacher_payrolls`.
- **Model**: `TeacherPayroll`.
- **Repository**: `PayrollRepositoryInterface` / `PayrollRepository`.
- **Service**: `PayrollService`.
- **Policy**: `PayrollPolicy`.
- **Livewire Component**: `Payroll\PayrollIndex`.
- **Route**: GET `/payroll`.
- **Migration**: `2026_08_01_000020_create_teacher_payrolls_table.php`.
- **Seeder**: `PayrollSeeder.php`.
- **Factory**: `TeacherPayrollFactory.php`.
- **Test**: `tests/Unit/TeacherPayrollModelTest.php`.
- **Dokumentasi**: Diperbarui pada `walkthrough.md`.

#### 🔹 Task 4.2: Service Logika Perhitungan Tunjangan Kehadiran & Jam Efektif
- **Requirement**: Perhitungan akumulasi kehadiran terverifikasi fingerprint dikali tarif tunjangan per hari.
- **Database**: Tabel `attendance_records` & `teacher_payrolls`.
- **Model**: `AttendanceRecord`, `TeacherPayroll`.
- **Repository**: `AttendanceRecordRepository`, `PayrollRepository`.
- **Service**: `PayrollService`.
- **Policy**: `PayrollPolicy`.
- **Livewire Component**: `Payroll\PayrollIndex`.
- **Route**: GET `/payroll`.
- **Migration**: Tidak ada.
- **Seeder**: Tidak ada.
- **Factory**: Tidak ada.
- **Test**: `tests/Unit/PayrollServiceTest.php`.
- **Dokumentasi**: Diperbarui pada `walkthrough.md`.

#### 🔹 Task 4.3: Halaman Livewire GUI & Ekspor Slip Tunjangan Kehadiran PDF/Excel
- **Requirement**: Antarmuka web kelola tunjangan kehadiran & tombol cetak Slip Tunjangan PDF Ber-Kop Surat SMKN 1 Gunung Agung.
- **Database**: Tabel `teacher_payrolls`.
- **Model**: `TeacherPayroll`.
- **Repository**: `PayrollRepository`.
- **Service**: `PayrollExportService`.
- **Policy**: `PayrollPolicy`.
- **Livewire Component**: `Payroll\PayrollIndex`.
- **Route**: GET `/payroll`, GET `/payroll/print-pdf`.
- **Migration**: Tidak ada.
- **Seeder**: Tidak ada.
- **Factory**: Tidak ada.
- **Test**: `tests/Feature/PayrollUiAndPdfTest.php`.
- **Dokumentasi**: Diperbarui pada `walkthrough.md`.
