Bug: $alphaDate global null saat push tanpa alpha → violation lama tak pernah
dihapus (false positive); totalAlpha dihitung utk semua siswa dgn tanggal global
→ rawan salah siswa/tanggal. Kini iterasi per (student, date) dari push.
+ test AttendanceSyncViolationFixTest (4 test).
- Tabel school_informations (judul, isi, kategori, tanggal kegiatan, publish)
- Menu admin 'Informasi Sekolah' (CRUD + permission manage-school-info)
- API wali: GET /parent/school-informations (hanya yang dipublikasikan)
- 2 data contoh: Jadwal UTS & Class Meet
- Test suite tetap hijau (39 test)
- Pasang laravel/sanctum, routes/api.php (prefix api/v1, 10 endpoint)
- Migrasi: parent_name di students, parent_students (pivot wali↔anak),
parent_devices (token FCM), permission parents-verify
- Auth wali: registrasi NISN+HP (auto-verify jika HP cocok data siswa,
pending jika tidak) + login token Sanctum
- Endpoint: me, logout, students, link anak, violations, sp-letters,
notifications, register device
- Halaman admin Verifikasi Wali (approve/reject) + menu sidebar
- Sync kesiswaan: tarik data orang tua (student_parents) ke students
- 8 feature test baru (ParentApiTest) — total suite 39 test hijau
Migration: tambah kolom:
- attendances.class_name (varchar 100)
- violations.student_class (varchar 100)
- Backfill data existing dari students.class_name
Controller manual: simpan class_name dari form
Sync E-Jurnal: simpan class_name dari lookup student
ViolationService: ambil class_name dari student saat buat
Model: tambah ke fillable
Ini menjamin data historis tetap akurat meskipun
siswa naik kelas (X→XI→XII) di tahun ajaran baru.
Sebelum: violation update cuma dari alphaCount push saat itu,
push ke-2 overwrite data push ke-1.
Sesudah: hitung total alpha dari DB (Attendance::count),
violation selalu mencerminkan total akumulasi.
Sebelumnya violation hanya di-create/update, tidak pernah
dihapus. Jika guru edit jurnal dari alpha jadi hadir, violation
lama tetap ada.
Sekarang: untuk setiap siswa dalam push, sistem cek:
- alpha > 0: create/update violation
- alpha = 0 & ada violation lama: hapus (soft delete)
- siswa tidak ada di push: violation tidak disentuh
Setiap kali E-Jurnal push ulang (misal edit jurnal), sistem
sekarang cek dulu apakah sudah ada pelanggaran alpha untuk
(student_id + violation_type_id + violation_date) dengan
recorded_by = NULL (system-generated).
- Jika sudah ada: update points + description
- Jika belum: buat baru via ViolationService
Ini mencegah akumulasi pelanggaran duplikat tiap kali guru
mengedit jurnal di E-Jurnal.
Sync controller sekarang pake ViolationService::recordViolation()
biar notifikasi realtime (AppNotification + broadcast event)
dan pengecekan SP threshold tetap jalan untuk data dari E-Jurnal.
ViolationService: recordViolation() & generateSpLetter()
diubah jadi nullable userId supaya bisa dipanggil tanpa user
(0 = system-generated dari sync)
AttendanceSyncController sekarang otomatis bikin catatan
pelanggaran (Violation) untuk siswa yang statusnya alpha,
sama seperti mekanisme input manual di Aplikasi Ketertiban.
- Hitung jumlah jam alpha per siswa
- Cari ViolationType dengan slug 'alpha'
- Buat Violation dengan points proporsional
- Recorded_by = null (system-generated dari sync)