# Absensi kelas oleh sekretaris

Implementasi lokal, 5 Oktober 2026. Melanjutkan penugasan pengurus kelas yang dipakai bendahara.

## Cara menggunakan

1. Wali kelas membuka **Wali Kelas → Pengurus Kelas**, menunjuk siswa pada jabatan **Sekretaris**, lalu menyimpan. Beberapa sekretaris dapat ditunjuk tanpa mengubah role siswa.
2. Akun siswa sekretaris mendapat menu **Absensi Kelas** setelah halaman dimuat ulang. Menu ini hanya memberi akses absensi harian dan rekap bulanan kelas yang sedang menjadi tanggung jawabnya.
3. Sekretaris mengisi H/S/I/A dan catatan seluruh siswa aktif untuk **hari ini**, memeriksa isian, lalu **Simpan Absensi**. Penyimpanan pertama mengunci seluruh tanggal itu bagi semua sekretaris kelas.
4. Setelah disimpan, perubahan status maupun catatan harus melalui **Ajukan koreksi absensi**. Pilih siswa, status/catatan yang diajukan, lalu isi **alasan wajib**. Contoh: “Informasi sakit baru diterima setelah sebelumnya dicatat alpa.”
5. Wali kelas membuka **Wali Kelas → Absensi Harian**. Bagian **Permintaan koreksi kelas** memuat semua permintaan yang menunggu pada periode tersebut, termasuk tanggal lain. Periksa siswa, tanggal, status/catatan lama, usulan, dan alasan, lalu **Setujui koreksi** atau **Tolak**. Catatan keputusan dapat ditambahkan.
6. Persetujuan langsung menerapkan usulan tersebut. Penolakan mempertahankan absensi sebelumnya. Sekretaris dapat melihat keputusan pada halaman yang sama.

## Batas dan riwayat

- Absensi harian yang sudah dicatat wali kelas maupun data yang berasal dari absensi mapel juga terkunci bagi sekretaris. Sekretaris tidak dapat menganggap data otomatis sebagai isian baru untuk menimpa status guru tanpa persetujuan.
- Tanggal lampau yang belum pernah diisi hanya dapat diajukan dengan alasan; data baru dibuat setelah disetujui. Pengajuan tanggal masa depan ditolak.
- Satu siswa/tanggal hanya mempunyai satu permintaan yang menunggu. Koreksi tidak membuka akses edit bebas, termasuk setelah disetujui.
- Jika absensi berubah selama permintaan menunggu, server menolak persetujuan agar tidak menimpa data terbaru. Tolak permintaan itu, lalu ajukan ulang berdasarkan absensi terbaru.
- Riwayat menyimpan status/catatan sebelumnya dan sesudahnya, pelaku, waktu, alasan sekretaris, pemohon, dan keputusan wali kelas. Riwayat tanggal yang dipilih tersedia pada **Riwayat pencatatan**. Riwayat sebelum fitur ini dipasang tidak direkonstruksi.
- Wali kelas tetap dapat memperbarui absensi kelasnya langsung; pencatatan itu juga masuk riwayat. Admin tetap memiliki kewenangan supervisi.
- Sinkronisasi absensi mapel tetap berjalan untuk data otomatis, tetapi tidak menimpa absensi harian manual atau koreksi yang telah disetujui. Status terlambat pada absensi mapel tetap dipertahankan.
- Pergantian sekretaris, akun dinonaktifkan, siswa tidak aktif, perpindahan kelas, atau penugasan berakhir mencabut akses. Akses diperiksa di server berdasarkan kelas, enrollment aktif, dan tahun ajaran berjalan.
- Sekretaris tidak mendapatkan dashboard wali kelas, biodata/kontak siswa, catatan pelanggaran, pembinaan, pengaturan pengurus, atau akses keuangan melalui penugasan sekretaris. Rekap hanya untuk tahun ajaran berjalan; ekspor resmi tetap melalui wali kelas.
- Permintaan terkait periode arsip tidak dapat disetujui. Tanggal harus berada pada periode akademik aktif dan hari sekolah.
- Penyimpanan, pengajuan, keputusan, pergantian pengurus, dan sinkronisasi absensi harian menggunakan kunci baris kelas agar pencatatan bersamaan tidak melewati penguncian.

## Migrasi dan validasi

Migrasi baru: `2026_10_05_000001_create_homeroom_attendance_corrections.php`. Menambah tabel pengajuan koreksi dan riwayat tanpa mengganti data absensi yang sudah ada. Database lokal sudah dimigrasikan. Jalankan migrasi Laravel setelah memperbarui source dan build pada lingkungan tujuan. Deployment produksi belum dilakukan, dan pemeriksaan browser belum dapat dilakukan karena koneksi alat browser ditolak.

Tes otomatis mencakup akses sekretaris dan rekap, pembatasan data siswa, penolakan siswa/bendahara biasa dan kelas lain, penyimpanan pertama lengkap/atomik, penguncian status/catatan, alasan wajib, persetujuan/penolakan, permintaan ganda, tanggal lampau/masa depan, permintaan kedaluwarsa, pergantian periode/pengurus, dan perlindungan absensi manual terhadap sinkronisasi mapel.

Validasi lokal: 86 tes fitur dan regresi terkait lulus (822 assertions), termasuk 21 tes khusus sekretaris. TypeScript, build Vite, Pint, dan `git diff --check` lulus. Build masih memuat peringatan existing mengenai ukuran bundle dan referensi gambar branding.
