- Per group: card terpisah dengan gradient header + icon
- Role columns: badge dengan icon (crown untuk admin)
- Checkbox: toggle button blue modern dengan ikon check
- Hover: gradient biru tipis di baris + icon group berubah warna
- Save section: gradient card dengan shadow
- Transisi mulus semua interaksi
- Tombol key (oranye) di samping edit user
- Klik → SweetAlert2 modal: input password baru + konfirmasi
- Validasi: min 6 karakter, harus cocok
- Admin tidak bisa reset password sendiri (lewat profil)
- PermissionController: tambah 'other' ke daftar role
- UserController validasi: in:admin,bk,wali_kelas,staff,other
- User model: helper isOther()
- Users view: filter dropdown + modal tambah user + label
- Role 'other' bisa diatur hak aksesnya di menu Hak Akses Role
Saat user pilih Jurusan dan/atau Tingkat Kelas, dropdown
Kelas otomatis terfilter hanya menampilkan kelas yang cocok.
Menggunakan JS client-side dengan data options dari backend.
- Token Database Kesiswaan ditampilkan sebagai text (bisa copy)
- Tambah tombol 'Test Koneksi' yang ping endpoint
/api/integration/students dan tampilkan status
- Status indikator: abu=belum, hijau=terhubung, merah=gagal
Setelah sinkronasi, siswa yang tidak muncul di data
sumber (Database Kesiswaan) akan otomatis dinonaktifkan
(is_active=false) — mencakup siswa lulus & pindah.
Ini memastikan data siswa selalu sinkron dengan tahun
ajaran baru tanpa perlu manual cleanup.
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.
- Ganti tema Airbnb dengan CSS kustom total
- Glassmorphism: background putih transparan, blur, shadow 3D
- Selected day: gradient blue 135deg + shadow glow
- Hover: scale 105% + background slate
- Border radius 16px, ukuran 300px
- Font lebih modern, spacing lebih lapang
- Transisi mulus 120ms
- Flatpickr (CDN) dengan tema Airbnb — bersih & modern
- Lokalisasi Bahasa Indonesia
- altInput: tampil dd/mm/yyyy, simpan yyyy-mm-dd
- Animasi mulus + shadow premium
- Berlaku otomatis ke semua <input type='date'> di seluruh app
- Style kustom: border-radius 12px, shadow 3D
- Filter card: gradient putih-abu, hover shadow, icon di label
- Tombol Lanjutkan: gradient blue, shadow lebih dalam
- Info bar: gradient with icon box + badge kelas biru
- Tabel: sticky student column dengan avatar rounded-xl
gradient hover di baris & hover avatar berubah warna
- Tombol status: ukuran naik w-10 h-10 rounded-xl
border lebih tebal, hover scale 110%, active scale 95%
- Bulk set: compact bg box, tombol hover scale
- Bottom: card terpisah untuk legend + submit
dengan gradient putih-abu border
- Info box: gradient emerald-teal dengan icon box shadow
- Ukuran font konsisten, spacing lebih lapang
Dropdown kelas sekarang menampilkan:
- ⬜ Nama Kelas → belum ada data presensi
- ✅ Nama Kelas (5/36) → sudah terisi (X siswa terdata dari total)
- Legend kecil di bawah dropdown sebagai panduan
Sebelum: badge kecil merah/hijau di pojok, susah diklik.
Sesudah: seluruh kotak tanggal berwarna (merah=ada alpha,
hijau=semua hadir), bisa diklik langsung untuk input presensi.
- Info jumlah siswa & alpha di dalam kotak
- Legend yang lebih jelas
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.
Menambahkan opsi 'Presensi' pada form reset aplikasi:
- Hapus seluruh data attendances (dari sync E-Jurnal & manual)
- Tampilkan jumlah data presensi di card
- Dapat dipilih terpisah dari pelanggaran
Sama seperti fix di sync controller:
- Cek existing violation (student_id + type + date + recorded_by)
- Ada alpha → update atau create
- Tidak alpha → hapus violation lama
- Berlaku untuk alpha dan terlambat
- Mencegah duplikat tiap kali admin submit ulang form
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)
- Add 3 jenis rekap presensi (harian/mingguan/bulanan) per kelas
- Weekly recap: tabel H,S,I,A per hari + kolom TOTAL
- Alpha proporsional: A = jam_alpha / total_jam
- Pemisah border antar hari dan kolom TOTAL
- Export Excel rekap mingguan (.xlsx)
- Fix max_input_vars PHP limit (1000→5000)
- Fix Carbon date object issue di groupBy
- Add permissions & role_permissions tables with migration
- Add PermissionMiddleware for route-level access control
- Add CheckRole middleware for role-based fallback
- Add PermissionController with UI (Settings > Hak Akses Role)
- Add @canPermission Blade directive for view-level checks
- Convert all routes to use dynamic permission middleware
- Add canPermission() method to User model
- All access rights configurable via admin UI
- Calendar shows per-date student count badge (green=all hadir, red=ada alpha)
- Click badge to go to attendance input for that date
- Prev/next month navigation with API fetch
- Controller passes initial month data inline (no flash on load)
- Migration: add is_system column to violation_types, mark alpha & terlambat
- DestroyType guard: system types cannot be deleted
- UpdateType guard: slug tetap walau nama diubah untuk system types
- UI: delete button hidden, badge lock untuk system types
- Seeder: ViolationTypeDefaultsSeeder untuk fresh deploy
- AttendanceController: lookup by slug (alpha/terlambat) instead of fuzzy match
- Alpha auto-violation: poin proporsional per jam (round((points/10)*count), min 1)
- Terlambat auto-violation: poin fix sesuai jenis (2 poin)
- Also handles both A (alpha) and T (terlambat) statuses for auto-violations
- Multi-pilih pelanggaran dalam satu form input
- Export Excel dengan 19 kolom (termasuk data penanganan)
- Filter handling_status di index pelanggaran
- Handling info di riwayat pelanggaran siswa
- Fix format handled_at casting
- Perbaikan UI form input (5 bagian terstruktur, severity indicator)