Pilot Documentation Plan — W05 Daily Student Attendance¶
Rencana pilot dokumentasi untuk presensi siswa per sesi/jam pelajaran: guru atau wali kelas mencatat kehadiran, penyimpanan menyelesaikan sheet, operator sekolah memonitor atau mengoreksi sesuai kewenangan, lalu siswa/orang tua melihat hasil.
Last verified: 2026-08-08
Mode: server development, static code audit only
Workspace root: /home/scola/odoo
Frontend HEAD: 0275f7061e6e892b1f860eeb825c6f6a21851888 (develop)
Backend HEAD: 44425cc81d8d281ec76e9336c30b3e109a7fc473
Runtime verification: belum dilakukan; tidak ada data runtime yang ditulis dan tidak ada source aplikasi yang diubah
Traceability companion: pilot-attendance-traceability.md
1. Kesimpulan kesiapan¶
Pilot ini belum siap masuk tahap penulisan artikel final, tetapi sudah cukup terpetakan untuk backlog dan workshop keputusan. Jalur utama guru, operator, siswa, dan orang tua tersedia di codebase. Namun dokumentasi final berisiko mengajarkan jaminan yang belum benar-benar ditegakkan.
Enam syarat utama sebelum penulisan final:
BLK-A19— Perbaiki atau buktikan secara runtime bahwa guru standar dapat membuat line pada penyimpanan pertama. Controller meng-elevate pembuatan sheet, tetapi tidak pembuatan line; ACL Scola Teacher sendiri tidak memberi create line.BLK-A20— Tegakkan roster lengkap dan larang student ID di luar batch/session pada endpoint guru maupun admin.BLK-B04— Selaraskan tombol dan route operator dengan role check backend, terutama principal dan wakasek kesiswaan yang tampak dapat mengedit di UI tetapi ditolak controller.BLK-A21— Putuskan dan tegakkan semantik penyelesaian/koreksi: saat ini Simpan langsung menjadidone, tanpa draft terpisah, alasan koreksi, batas waktu, approval, atau audit event khusus.BLK-A22— Putuskan model status Sakit/Dispensasi. Statusexcusedsaat ini dibaca sebagai Izin oleh agregator utama sehingga status tidak round-trip secara kanonis.BLK-A23— Tetapkan policy viewer/retention dan validasi server untuk file bukti; raw proof saat ini tidak memiliki validasi ukuran/tipe backend dan ikut berada dalam payload detail portal.
Evidence utama: ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:4196, ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:4305, ../custom_addons_scola/gcgscola/scola_attendance/security/ir.model.access.csv:4, ../custom_addons_scola/gcgscola/scola_attendance/security/ir.model.access.csv:8, ../custom_addons_scola/gcgscola/scola_core/security/scola_security.xml:88, src/views/AttendanceManagement/Admin/AttendanceSheetList.vue:192.
2. Penegasan scope pilot¶
2.1 In scope¶
- Presensi siswa berdasarkan sesi/jam pelajaran pada
op.session. - Guru atau wali kelas membuka sesi miliknya pada hari sekolah aktif.
- Pengisian status Hadir, Izin, Alpa, dan Telat; Sakit/Dispensasi hanya dibahas sebagai gap klasifikasi yang belum final.
- Penyimpanan pertama dan edit ulang sheet yang sudah tersimpan.
- Monitoring sesi yang belum/sudah diisi oleh operator sekolah.
- Pengisian pengganti atau koreksi melalui workspace admin, hanya setelah kewenangan dan auditnya diputuskan.
- Tampilan pribadi siswa serta tampilan anak yang tertaut pada akun orang tua.
- Relasi langsung ke izin siswa, rekap, rapor, dan promosi sebagai downstream/dependency.
2.2 Out of scope¶
- Employee attendance.
- RFID ingestion.
- Face recognition.
- Geofencing.
- Kedatangan/kepulangan gerbang dan pickup attendance.
- Advanced analytics, principal insight, dan analitik risiko.
Fitur di atas hanya boleh muncul sebagai dependency atau artikel lanjutan. Redirect guru PAUD/TK ke /attendance/daily adalah boundary produk, bukan bagian langkah pilot (src/router/teacherRouteFragments/attendance.js:6, src/views/AttendanceManagement/Faculty/Attendance.vue:275).
2.3 Koreksi terhadap W05 reconnaissance¶
Recon W05 menyebut submit/close/cancel dan kemungkinan notifikasi orang tua (docs/recon/workflow-candidates.md:22). Untuk scope per-sesi yang diverifikasi ulang:
- tidak ada aksi close/cancel terpisah pada UI guru;
saveFacultySessionAttendanceSheetmemanggil satu endpoint save (src/services/attendance/studentAttendance.service.js:435);- endpoint menulis
sheet.state = 'done'pada penyimpanan (../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:4332); - edit ulang mengubah line yang sama lalu tetap
done(src/views/AttendanceManagement/Faculty/AttendanceSheet.vue:667,../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:4307); - tidak ada pemanggilan notification/mail/bus eksplisit pada save per-sesi; notifikasi yang ditemukan di domain attendance berkaitan dengan jalur gerbang, bukan save per-sesi.
Tidak ditemukan commit yang menyentuh route/view/service attendance frontend setelah snapshot recon; commit attendance frontend terakhir pada jalur yang diaudit adalah 61abcb7/dcddf83. Backend attendance terakhir sebelum snapshot adalah a672512 pada 2026-08-04. Audit ini tetap memakai isi file pada HEAD di atas, bukan mengandalkan snapshot recon.
3. Actors dan batas kewenangan kandidat¶
| Actor | Candidate responsibility | Bukti code | Status untuk pilot |
|---|---|---|---|
| Guru | Melihat sesi miliknya hari ini, mengisi, menyimpan, dan mengedit ulang sheet miliknya | route capability students.attendance.edit di src/router/teacherRouteFragments/attendance.js:27; backend role dan ownership check di ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:4056, ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:4160, ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:4196 |
Kandidat utama, tetapi first-save wajib dibuktikan/fixed |
| Wali kelas | Memakai alur guru ketika juga menjadi faculty sesi; laporan wali adalah artikel terkait, bukan workspace input berbeda | homeroom mewarisi teacher capability di ../custom_addons_scola/gcgscola/scola_core/services/auth_capabilities.py:484; backend menerima homeroom di ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:4057 |
Kandidat utama; hubungan wali kelas vs guru mapel perlu dijelaskan |
| Admin / school admin / head admin / admin staff | Memonitor seluruh sesi unit; membuat/memperbarui sheet melalui jalur admin | role check _admin_access_error di ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:146; admin UI di src/views/AttendanceManagement/Admin/AttendanceSheetList.vue:192 dan src/views/AttendanceManagement/Admin/AttendanceSheetNew.vue:369 |
Kandidat operator setelah ownership koreksi disahkan |
| Principal | Monitoring sheet/detail unit | route view di src/router/principalRoutes.js:196; backend read allow di ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:170 |
Read-only kandidat; UI edit drift harus ditutup |
| Wakasek kesiswaan | Monitoring sheet/detail unit | route view di src/router/vicePrincipalRoutes.js:214; backend read allow di ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:170 |
Read-only kandidat; ACL model yang lebih luas tidak boleh dianggap kontrak produk |
| Siswa | Melihat attendance milik profil siswa terkait user | route di src/router/studentRouteFragments/core.js:25; identity lookup dan role check di ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:2942 |
Kandidat reader |
| Orang tua | Memilih anak yang benar-benar tertaut lalu melihat rekap/detail | route di src/router/parentRouteFragments/core.js:35; child resolution di ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:2835, ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:2971 |
Kandidat reader; privasi bukti harus dibereskan |
Catatan allowlist: current _admin_access_error menerima canonical admin, admin_staff, school_admin, head_admin, legacy aliases admin staff, staff, administrator, super admin, serta groups admin terkait (../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:146-166). Legacy aliases tersebut tidak otomatis menjadi actor pilot; supported operator set tetap memerlukan keputusan ATT-D01/ATT-D04.
Catatan: capability frontend bukan security boundary. Prefix API admin hanya digate students.attendance.view, sedangkan mutation authorization terjadi lagi di controller (../custom_addons_scola/gcgscola/scola_platform_support/api_route_access.py:137, ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:146). Panduan tidak boleh menyimpulkan hak edit hanya dari menu atau capability.
4. Entry point dan route map yang sudah dideduplikasi¶
| Surface kanonis | Route | Shared component / alias | Tujuan pilot |
|---|---|---|---|
| Daftar sesi guru | /faculty/attendance |
— | Memilih sesi yang dijadwalkan hari ini |
| Sheet guru | /faculty/attendance/sheet/:id |
legacy redirect /faculty/attendance/attendance-sheet/:id |
Mengisi dan menyimpan attendance |
| Hub operator | /attendance/home |
/admin-staff/students/attendance memakai component yang sama |
Masuk ke alur per-sesi bila per_lesson_enabled |
| Monitoring sheet operator | /attendance/sheets |
/principal/students/attendance/sheets dan /vice-principal/student-affairs/attendance memakai AttendanceSheetList.vue |
Memantau done/pending dan membuka detail |
| Detail sheet | /attendance/session/:sheetId |
alias role-specific principal/VP memakai AttendanceBySession.vue |
Membaca line dan ekspor |
| Create/update operator | /attendance/sheets/create |
/attendance/lines/create redirect; jangan dokumentasikan redirect sebagai halaman terpisah |
Isi pengganti atau muat sheet existing berdasarkan session+date |
| Portal siswa | /student/attendance |
— | Detail harian dan ringkasan mingguan |
| Portal orang tua | /parent/attendance |
— | Pilih anak, rekap bulanan/mingguan, detail hari |
Evidence route: src/router/teacherRouteFragments/attendance.js:25, src/router/attendanceRoutes.js:31, src/router/attendanceRoutes.js:123, src/router/attendanceRoutes.js:151, src/router/principalRoutes.js:206, src/router/vicePrincipalRoutes.js:214, src/router/studentRouteFragments/core.js:25, src/router/parentRouteFragments/core.js:35.
5. Candidate end-to-end flow¶
5.1 Happy path yang didukung struktur kode¶
- Admin akademik menyiapkan unit/company, tahun ajaran, rombel, enrollment siswa, faculty, subject, classroom, dan sesi bertanggal.
- Admin attendance mengaktifkan
per_lesson_enableduntuk company pemilik sesi. - Guru/wali yang menjadi faculty sesi membuka
/faculty/attendance. - API hanya mengambil
op.sessionmilik faculty untuk tanggal lokal sekolah hari ini. - Guru memilih kartu sesi; sistem memuat roster batch, existing lines, dan izin/permit yang relevan.
- Guru meninjau default, mengubah status yang diperlukan, dan mengisi catatan/bukti bila memilih Izin.
- Guru menekan Simpan. Implementasi saat ini membuat/memperbarui sheet dan line, lalu langsung menulis state
done. - Operator membuka
/attendance/sheetsuntuk melihat sheet atau daftar sesi pending, lalu membuka detail. - Jika koreksi diperlukan, operator saat ini harus membuka workspace
/attendance/sheets/create, memilih session dan tanggal yang sama, memuat draft existing, mengubah line, lalu menyimpan ulang. - Siswa/orang tua melakukan fetch pada route portal untuk melihat data terbaru. Tidak ada bukti push notification per-sesi pada save path.
Langkah 6–9 belum boleh menjadi instruksi final sampai default all-present, semantik complete, kewenangan koreksi, dan audit disahkan.
5.2 State transition aktual¶
Tidak ada sheet
-> GET session-sheet: virtual roster, seluruh siswa default Hadir
-> POST session-sheet/save: sheet dibuat draft, line ditulis, lalu sheet langsung done
Sheet done
-> UI menampilkan mode read-only
-> Edit Kehadiran
-> POST session-sheet/save
-> line diperbarui dan sheet tetap done
Combined session menyimpan setiap canonical session di dalam savepoint; status gabungan adalah pending, partial, atau complete berdasarkan jumlah child sheet done (../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:3999, ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:4196). Tidak ada transition canceled/closed pada alur per-sesi ini.
6. Inventory halaman pilot¶
6.1 Guru — daftar sesi¶
Component: src/views/AttendanceManagement/Faculty/Attendance.vue
- Data: tanggal/hari lokal, batch, subject, classroom, jam, unit, combined badge, completion badge, ringkasan.
- Filter: Semua, Belum Diisi, Selesai, dan unit bila lebih dari satu.
- Actions: buka sheet, buka rekap mapel, atau masuk alur gate jika mode terkait aktif.
- Validation/gate:
per_lesson_enabled; bila hanya gate aktif route mengganti ke/attendance/daily. - Exception: profile faculty tidak ditemukan, tidak ada sesi hari ini, mode nonaktif, atau API error.
Evidence: src/views/AttendanceManagement/Faculty/Attendance.vue:69, src/views/AttendanceManagement/Faculty/Attendance.vue:105, src/views/AttendanceManagement/Faculty/Attendance.vue:227, src/views/AttendanceManagement/Faculty/Attendance.vue:269, src/views/AttendanceManagement/Faculty/Attendance.vue:326.
6.2 Guru — sheet per sesi¶
Component: src/views/AttendanceManagement/Faculty/AttendanceSheet.vue
- Read-only context: batch, subject, jam, tanggal hari ini, total siswa, summary.
- Filters: pencarian nama; filter rombel hanya untuk combined session.
- Per-student fields: nama, NSN/NISN display, rombel gabungan, status, remark, proof file, approved-permit indicator.
- Status selection nyata: Hadir, Izin, Alpa, Telat (
src/i18n/attendanceStatus.js:33). - Izin modal: jenis alasan Sakit/Dispensasi/Izin lain, detail alasan, upload image/PDF, dan opsi tanpa bukti.
- Actions: tandai semua hadir/kosongkan, ubah per siswa, simpan, edit ulang, lihat/unduh bukti.
- Default: roster baru diprefill Hadir oleh backend.
- Validation frontend: tidak ada kewajiban memilih exactly one status setelah pengguna mengosongkan; tidak ada validasi size/type file selain
acceptbrowser.
Evidence: src/views/AttendanceManagement/Faculty/AttendanceSheet.vue:45, src/views/AttendanceManagement/Faculty/AttendanceSheet.vue:83, src/views/AttendanceManagement/Faculty/AttendanceSheet.vue:167, src/views/AttendanceManagement/Faculty/AttendanceSheet.vue:190, src/views/AttendanceManagement/Faculty/AttendanceSheet.vue:244, src/views/AttendanceManagement/Faculty/AttendanceSheet.vue:526, src/views/AttendanceManagement/Faculty/AttendanceSheet.vue:592, ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:2034.
6.3 Operator — list/pending/detail¶
Components: AttendanceSheetList.vue, AttendanceBySession.vue
- List filters: pending date, search, attendance date.
- List actions: refresh, create manual, fill/continue pending session, open detail.
- Columns: attendance date, batch, register, session.
- Detail: date, student, four boolean status columns; export PDF/Excel.
- Detail tidak menyediakan tombol koreksi.
- Mismatch saat ini: column mapping memperlakukan
remarksebagai Sakit danlatesebagai Terlambat, tetapistatusOptionsyang dikomentari memetakanlateke Izin. Jangan mendokumentasikan legend detail sebagai klasifikasi yang sudah final.
Evidence: src/views/AttendanceManagement/Admin/AttendanceSheetList.vue:18, src/views/AttendanceManagement/Admin/AttendanceSheetList.vue:92, src/views/AttendanceManagement/Admin/AttendanceSheetList.vue:194, src/views/AttendanceManagement/Admin/AttendanceSheetList.vue:290, src/views/AttendanceManagement/Admin/AttendanceBySession.vue:46, src/views/AttendanceManagement/Admin/AttendanceBySession.vue:217, src/views/AttendanceManagement/Admin/AttendanceBySession.vue:226.
6.4 Operator — create/update substitute¶
Component: AttendanceSheetNew.vue
- Fields: register, session, attendance date, per-student Hadir/Telat/Izin/Alpa checkboxes, remark.
- Substitute mode mengunci tanggal dari query dan memuat metadata session.
- Exactly-one status ditegakkan hanya oleh handler UI saat satu checkbox dicentang; semua dapat dikosongkan.
- Backend mencari existing sheet berdasarkan session+date sehingga save ulang bertindak sebagai update.
- Backend tidak menerima alasan koreksi, approver, version, atau expected prior state.
- Tidak ada direct link dari detail ke workspace koreksi.
Evidence: src/views/AttendanceManagement/Admin/AttendanceSheetNew.vue:14, src/views/AttendanceManagement/Admin/AttendanceSheetNew.vue:31, src/views/AttendanceManagement/Admin/AttendanceSheetNew.vue:57, src/views/AttendanceManagement/Admin/AttendanceSheetNew.vue:103, src/views/AttendanceManagement/Admin/AttendanceSheetNew.vue:293, src/views/AttendanceManagement/Admin/AttendanceSheetNew.vue:332, src/views/AttendanceManagement/Admin/AttendanceSheetNew.vue:369.
6.5 Siswa¶
Component: src/views/AttendanceManagement/Student/Attendance.vue
- Mode: harian atau mingguan.
- Fields/filter: tanggal, tanggal acuan minggu, scope mode bila dual mode.
- Harian: summary dan detail session subject/time/status/remark/bukti.
- Mingguan: grid H/I/S/A/T dan klik hari kembali ke detail harian.
- Hanya profile student yang terkait user backend yang dapat dibaca.
Evidence: src/views/AttendanceManagement/Student/Attendance.vue:91, src/views/AttendanceManagement/Student/Attendance.vue:157, src/views/AttendanceManagement/Student/Attendance.vue:213, src/views/AttendanceManagement/Student/Attendance.vue:291, ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:2942.
6.6 Orang tua¶
Component: src/views/AttendanceManagement/Parent/Attendance.vue
- Fields/filter: anak tertaut, mingguan/bulanan, tanggal acuan/bulan, tahun, scope mode.
- Summary: Hadir, Izin, Sakit, Alpa, Terlambat.
- Grid dapat diklik untuk membuka detail hari dan daftar session.
- Backend membatasi
student_idpada children dari portal identity. - Komponen juga berisi data gate/pickup, tetapi itu di luar artikel pilot.
Evidence: src/views/AttendanceManagement/Parent/Attendance.vue:93, src/views/AttendanceManagement/Parent/Attendance.vue:198, src/views/AttendanceManagement/Parent/Attendance.vue:238, src/views/AttendanceManagement/Parent/Attendance.vue:366, src/views/AttendanceManagement/Parent/Attendance.vue:498, src/views/AttendanceManagement/Parent/Attendance.vue:506, ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:2835.
7. API dependency map¶
| Actor/page | Service | Endpoint | Backend implementation | Purpose |
|---|---|---|---|---|
| Semua surface attendance | src/services/attendance/studentAttendance.service.js:51 |
POST /api/v1/attendance/student/settings |
../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_daily_api.py:8, mode service/company payload |
Menentukan per-lesson/gate/dual-mode |
| Daftar guru | src/services/attendance/studentAttendance.service.js:396 |
POST /api/v1/attendance/faculty/today-sessions |
../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_faculty_api.py:8, mixin ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:4056 |
Sesi faculty untuk tanggal lokal hari ini |
| Sheet guru | src/services/attendance/studentAttendance.service.js:424 |
POST /api/v1/attendance/faculty/session-sheet |
../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_faculty_api.py:12, mixin ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:4160 |
Session context, roster, existing lines, permit |
| Save guru | src/services/attendance/studentAttendance.service.js:435 |
POST /api/v1/attendance/faculty/session-sheet/save |
../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_faculty_api.py:20, mixin ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:4196 |
Create/update line dan set sheet done |
| List operator | src/services/attendance/adminAttendance.service.js:64 |
POST /api/v1/attendance/admin/sheets |
../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_admin_api.py:65, mixin ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:3430 |
Daftar sheet per-lesson unit |
| Pending operator | src/services/attendance/adminAttendance.service.js:48 |
POST /api/v1/attendance/admin/pending-sessions |
../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_admin_api.py:38, mixin ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:3189 |
Sesi unit yang belum done |
| Draft operator | src/services/attendance/adminAttendance.service.js:70 |
POST /api/v1/attendance/admin/sheet/draft |
../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_admin_api.py:46, mixin ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:3282 |
Roster/existing line untuk session+date |
| Save operator | src/services/attendance/adminAttendance.service.js:119 |
POST /api/v1/attendance/admin/sheet/create |
../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_admin_api.py:55, mixin ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:3335 |
Create/update sheet lalu set done |
| Detail operator | src/services/attendance/adminAttendance.service.js:83 |
POST /api/v1/attendance/admin/sheet-lines |
../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_admin_api.py:69, mixin ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:3464 |
Line read-only per sheet |
| Siswa harian | src/services/attendance/studentAttendance.service.js:311 |
POST /api/v1/attendance/student/daily |
../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_portal_api.py:8, mixin ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:2942 |
Detail session milik siswa |
| Siswa mingguan | src/services/attendance/studentAttendance.service.js:368 |
POST /api/v1/attendance/student/period-report |
../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_portal_api.py:12, mixin ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:2957 |
Grid/summary periode |
| Daftar anak | src/services/attendance/studentAttendance.service.js:316 |
POST /api/v1/attendance/parent/children |
../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_portal_api.py:20, mixin ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:2971 |
Anak terkait akun parent |
| Orang tua harian | src/services/attendance/studentAttendance.service.js:321 |
POST /api/v1/attendance/parent/daily |
../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_portal_api.py:24, mixin ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:2989 |
Detail hari anak terpilih |
| Orang tua periode | src/services/attendance/studentAttendance.service.js:353, src/services/attendance/studentAttendance.service.js:381 |
POST /api/v1/attendance/parent/monthly, POST /api/v1/attendance/parent/period-report |
../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_portal_api.py:28, ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_portal_api.py:37; mixin ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:3007, ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:3024 |
Grid dan summary |
8. Prerequisites¶
8.1 Data prerequisite¶
- Active school/company scope dan timezone sekolah.
per_lesson_enabled = truepada company pemilik sesi.- Faculty profile tertaut dengan user guru.
- Session pada tanggal lokal hari ini, assigned ke faculty yang login.
- Session memiliki batch/rombel; subject/classroom/time memperkaya tampilan.
- Siswa berada pada
session.batch_id.student_ids. - Course pada session/batch diperlukan untuk auto-register yang stabil pada jalur operator.
- Parent profile tertaut ke anak; student user tertaut ke student profile.
- Izin/permit full-day yang sudah submitted/reviewed dapat muncul sebagai indikator; hanya approval final seharusnya mengubah default attendance.
Evidence: ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:1912, ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:1961, ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:2034, ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:4056, ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:4160, ../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:3166.
8.2 Access prerequisite¶
- Frontend route guru:
students.attendance.edit. - Backend: role
teacher,homeroom, atauguru, plus ownership session by faculty. - Operator mutation backend:
_admin_access_error; principal/VP hanya read menurut controller. - Portal siswa/orang tua: role check dan identity linkage, bukan ID bebas dari frontend.
- Global attendance rules membatasi register/sheet/line ke allowed company IDs (
../custom_addons_scola/gcgscola/scola_attendance/security/attendance_security.xml:10).
9. Validasi dan business rule yang terlihat¶
| Rule | Enforcement sekarang | Dokumentasi pilot |
|---|---|---|
| Session wajib | Backend menolak session_id kosong |
Boleh dijelaskan setelah runtime check |
| Guru hanya session miliknya | Backend membandingkan session.faculty_id dengan faculty user |
Boleh dijelaskan |
| Mode per-lesson aktif | Backend memeriksa company pemilik session | Boleh dijelaskan |
Existing attendance_sheet_id harus sesuai session |
ID tidak sesuai diabaikan lalu dicari berdasarkan session+today | Jelaskan sebagai idempotent lookup hanya setelah test |
| New roster default Hadir | Backend mengisi semua batch students Hadir | Wajib keputusan bisnis dan warning; jangan disamarkan |
| Exactly-one status | UI setter mengosongkan flag lain, tetapi semua flag dapat menjadi false | Jangan menjanjikan validasi penuh |
| Full roster wajib | Combined session memvalidasi complete roster; regular session tidak | Blocked by defect untuk regular session |
| Student harus anggota batch | Combined session memvalidasi; regular faculty/admin save tidak | Blocked by defect |
| Izin approved prefill | Permit map menggunakan full-day types dan state submitted/approved; override ke excused final hanya untuk approved | Perlu artikel dependency dan business glossary |
| File proof | Browser accept=image/*,.pdf; backend menerima base64 tanpa size/type check |
Jangan ajarkan upload sampai policy/fix |
| Save berarti complete | Backend selalu menulis state=done |
Hanya dokumentasikan setelah owner menyetujui semantik |
| Edit setelah done | UI dan backend memperbolehkan | Perlu window/reason/audit decision |
| Period date | Backend menolak missing/invalid/reversed dates | Boleh dijelaskan pada portal/troubleshooting |
| Parent child scope | Backend memilih hanya child dari portal identity | Boleh dijelaskan setelah negative runtime test |
10. Downstream effect dan notification¶
10.1 Downstream yang terkonfirmasi dari kode¶
op.attendance.linemenjadi data detail portal siswa/orang tua (../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:2754,../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:2855).- Rekap rapor membaca line per term dan menghitung hadir/telat/izin/sakit/alpa (
../custom_addons_scola/gcgscola/scola_report_card/models/student_report.py:188). - Promotion menghitung attendance percentage dari seluruh attendance line dalam tahun ajaran (
../custom_addons_scola/gcgscola/scola_report_card/models/student_promotion.py:276). - Approval permit dapat memperbarui line session/daily yang sudah ada (
../custom_addons_scola/gcgscola/scola_student_activity/models/student_permit.py:437). - Principal/admin report dan rekap subject/homeroom membaca line yang sama; advanced analytics tetap artikel lanjutan.
Risiko: report card/promotion saat ini menghitung line, bukan hari unik. Dalam mode per-session atau dual mode, arti “hari hadir” dan eligibility perlu keputusan bisnis sebelum didokumentasikan sebagai metrik resmi.
10.2 Notification behavior¶
- Save per-sesi tidak memanggil notification service, mail, atau bus secara eksplisit pada controller/model yang diaudit.
- Student/parent melihat perubahan ketika halaman melakukan fetch/reload.
- Notifikasi arrival/departure gerbang bukan bagian pilot.
- Jangan menulis “orang tua langsung menerima notifikasi” sampai runtime automation dan kanal resmi dibuktikan.
11. Exception dan recovery paths¶
| Kondisi | Perilaku code/UI saat ini | Kebutuhan artikel troubleshooting |
|---|---|---|
| Mode per-lesson nonaktif | Guru diarahkan ke daily jika gate aktif; backend mengembalikan validation error | Jelaskan boundary mode, link ke artikel mode attendance |
| Faculty profile tidak ada | API faculty_not_found |
Eskalasi ke admin user/faculty linkage |
| Tidak ada session hari ini | Empty state, bukan pilihan tanggal lain | Cek jadwal/session dan timezone; jangan menyuruh guru “ubah tanggal” |
| Session bukan milik guru | Backend session_not_found |
Cek assignment faculty, jangan minta bypass |
| Roster kosong | Sheet tidak dapat memberi data berguna; admin save button disabled | Cek enrollment ke batch |
| First-save ACL gagal | Potensi AccessError bagi teacher tanpa group OpenEduCat attendance user | BLK-A19; blocker sebelum artikel final; test provisioning baru |
| Combined roster duplicate | Backend menolak dan rollback savepoint | Admin perbaiki membership antarrombel |
| Koneksi gagal saat per-session save | Service per-session tidak memakai offline outbox; UI menampilkan error | Jangan menjanjikan offline save; pertahankan halaman dan retry setelah koneksi pulih |
| Parent tanpa child | Error/empty state | Perbaiki parent-student linkage |
| Status portal belum berubah | Portal perlu fetch ulang; tidak ada push per-sesi yang dibuktikan | Reload, cek sheet done, cek scope Per Jam |
| Koreksi diperlukan | Existing sheet dapat dimuat ulang via admin form atau Edit guru | Owner, alasan, cutoff, dan audit belum ditetapkan |
12. Privacy dan sensitive-data concerns¶
- Nama, NSN/NISN, status kehadiran, alasan ketidakhadiran, dan izin merupakan data siswa.
- Bukti izin dapat berisi data kesehatan. Guru dapat membuka URL evidence permit; student daily payload memuat
proof_file, dan parent daily memakai serializer yang sama sebelum hanya menonaktifkan write flags (../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:2754,../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:2816,../custom_addons_scola/gcgscola/scola_attendance/controllers/attendance_api_mixin.py:2826). - Parent UI tidak merender proof session melalui
AttendanceDayDetailPanel, tetapi payload API tetap dapat mengandung file raw. Data minimization belum ditegakkan. - Upload proof tidak memiliki batas ukuran/type backend pada save per-sesi.
- Admin export PDF/Excel memasukkan nama/status siswa dan dibuat client-side; retention/download warning belum tersedia.
- Company scope global ada untuk line/sheet/register, tetapi endpoint save regular belum memvalidasi bahwa setiap student ID milik batch/session yang sama. Ini harus dianggap integrity/isolation blocker.
Kebijakan yang dibutuhkan: siapa boleh melihat proof/reason, retensi, download, masking NSN, audit akses, ukuran/tipe file, dan apakah proof guru masih diperlukan bila permit resmi sudah tersedia.
13. Unresolved business decisions¶
| ID | Pertanyaan keputusan | Recommended default untuk workshop |
|---|---|---|
| ATT-D01 | Apakah guru mata pelajaran atau hanya wali kelas dapat input per-session? | Guru pemilik session; wali kelas hanya jika menjadi faculty session atau memakai jalur substitute resmi |
| ATT-D02 | Apakah roster baru boleh default semua Hadir? | Tidak; default “Belum ditandai” sampai guru melakukan review eksplisit |
| ATT-D03 | Apakah Simpan sama dengan Complete? | Pisahkan Save Draft dan Complete, atau minimal confirmation sebelum done |
| ATT-D04 | Siapa boleh koreksi setelah complete? | Guru pemilik selama cutoff singkat; setelah cutoff admin/head admin dengan alasan wajib |
| ATT-D05 | Apakah koreksi perlu approval? | Tidak untuk cutoff guru; ya atau audit review untuk admin setelah cutoff |
| ATT-D06 | Apa glossary final Hadir, Telat, Izin, Sakit, Dispensasi, Alpa, Belum ditandai? | Status kanonis berbeda; Sakit/Dispensasi jangan hanya remark Izin |
| ATT-D07 | Bagaimana satu hari diringkas dari banyak session dan dual mode? | Aturan harian eksplisit per sekolah; jangan hitung line sebagai hari tanpa agregasi |
| ATT-D08 | Apakah save per-session mengirim notifikasi? | Default tidak; portal pull/reload. Tambahkan notifikasi hanya setelah channel/quiet-hour policy |
| ATT-D09 | Siapa boleh melihat/upload/download bukti? | Permit owner dan approver terbatas; guru melihat status/reason minimal, bukan raw medical file secara default |
| ATT-D10 | Principal dan wakasek kesiswaan read-only atau editor? | Read-only; correction tetap separation of duties operator |
| ATT-D11 | Bagaimana session pengganti ditugaskan dan diaudit? | Admin/head admin memilih substitute dengan reason dan actor audit |
| ATT-D12 | Apakah edit unlimited diperbolehkan? | Tidak; tetapkan cutoff berdasarkan tanggal/session dan recovery escalation |
| ATT-D13 | Apakah alumni boleh melihat attendance lama karena role map memberi capability? | Tidak untuk pilot; perlu product/privacy decision terpisah |
| ATT-D14 | Apa sumber nomor siswa yang boleh tampil: NSN, NIS, atau NISN? | Pakai label dan field kanonis yang disahkan DPO/product; minimalkan pada portal parent |
| ATT-D15 | Siapa memiliki approval dan koreksi permit bridge yang dapat memprefill attendance? | Workflow permit tetap menjadi source approval; attendance hanya mengonsumsi status/evidence minimum, dengan actor dan linkage diaudit |
| ATT-D16 | Apa recovery resmi bila save per-session timeout/offline? | Jangan menjanjikan offline outbox; pertahankan input, verifikasi hasil server, lalu retry dengan contract idempotent atau eskalasi |
| ATT-D17 | Mode/jenjang dan baseline tanggal apa yang didukung pilot? | Pilot hanya per-session pada jenjang/mode yang route-nya mengizinkan; daftar guru today-only menurut tanggal sekolah; PAUD/gate flow menjadi related article |
Blocker gate pilot memakai ID register final: BLK-A19 first-save teacher, BLK-A20 exact roster/completeness, BLK-B04 principal/VP CTA drift, BLK-A21 completion/correction, BLK-A22 Sakit/Izin, BLK-A23 proof privacy, dan BLK-B05 existing-guide drift.
14. Existing documentation reuse assessment¶
| Existing file | Dapat dipakai | Harus diperbaiki sebelum reuse |
|---|---|---|
docs/domains/absensi/README.md |
Module/model/API map, mode boundary, downstream | Status “Done” bukan bukti runtime tenant; pisahkan gate vs per-session |
docs/domains/absensi/attendance-modes-matrix.md |
per_lesson_enabled, dual-mode scope, route mapping |
Jangan membawa gate/pickup ke pilot body |
docs/domains/absensi/attendance-navigation-audit.md |
Label/menu canonical dan role entry point | Verifikasi menu served runtime; teacher label sekarang “Presensi Mapel” |
docs/user-guide/quick-start/input-absensi-harian.md |
Struktur singkat dan link related | Teacher tidak memilih tanggal/class di list; status Sakit tidak direct; admin field adalah session/register/date; “orang tua melihat” perlu fetch verification |
docs/user-guide/troubleshooting/absensi.md |
Struktur symptom/cause/action | Instruksi guru “ubah tanggal” tidak cocok dengan today-only session page; pisahkan per-session vs gate |
docs/user-guide/per-role/teacher.md dan homeroom.md |
Entry menu dan audience | Ganti istilah umum Absensi menjadi Presensi Mapel untuk alur ini |
docs/user-guide/per-role/student.md dan parent.md |
Route reader dan multi-child selection | Tambahkan scope Per Jam dan privacy-safe detail setelah API hardening |
docs/user-guide/school-admin/kehadiran/hub-kehadiran-dan-rekap.md |
Hub card concept | Jangan menyebut admin dapat edit tanpa role/correction policy |
docs/domains/absensi/IMPLEMENTATION_GUIDE.md |
High-level per-session dependency | Skenario 1.3 overclaims direct Sakit, tombol “Isi Kehadiran”, proof flow, dan auto-bridge; bukan source user copy |
docs/qa/paud-attendance-manual-uat.md |
Negative cases dual-mode dan view lintas role | Scope utamanya gate/PAUD; jadikan future/dependency, bukan pilot script |
tests/e2e/critical/teacher_attendance_flow.spec.ts |
Baseline save/edit assertions | Helper membuat seed melalui raw RPC; tambah fresh-role ACL, roster, tenant, admin correction, dan cross-role propagation |
tests/e2e/critical/parent_attendance_flow.spec.ts |
Baseline parent monthly page | Hanya membuktikan page/API monthly terbuka; belum membuktikan hasil save guru yang sama |
15. Artefak pilot yang akan ditulis setelah Definition of Ready¶
15.1 Workflow guide¶
Working title: “Mencatat dan Menyelesaikan Presensi Siswa per Sesi”
Isi minimal:
- kapan memakai Per Jam dan kapan artikel lain dipakai;
- prerequisites dan ownership;
- pilih session hari ini;
- review seluruh roster, set status, dan complete;
- meaning setiap state/status;
- correction path resmi;
- cara memastikan hasil terlihat operator/siswa/orang tua;
- privacy warning dan escalation.
Acceptance: setiap langkah punya trace ID, tidak ada route alias legacy, dan tidak menyebut cancel/notifikasi yang tidak dibuktikan.
15.2 Role-specific quick guide¶
Empat kartu singkat:
- Guru/wali kelas: input dan review sebelum complete.
- Admin/head admin/admin staff: monitor pending, substitute, correction sesuai cutoff.
- Principal/wakasek: monitor read-only.
- Student/parent: pilih periode/scope dan baca hasil.
Setiap kartu harus menyebut “menu dapat berbeda menurut mode/unit” tanpa menganggap menu sebagai bukti permission.
15.3 Contextual page help¶
| Page | Help payload kandidat |
|---|---|
/faculty/attendance |
Definisi Pending/Sebagian/Selesai, today-only, alasan session tidak tampil |
/faculty/attendance/sheet/:id |
Arti default, status, complete/edit, izin, privacy; blocker sampai semantics final |
/attendance/sheets |
Pending date, siapa yang boleh fill, perbedaan monitor vs edit |
/attendance/sheets/create |
Substitute/correction ownership, existing session+date, mandatory reason setelah fix |
/attendance/session/:sheetId |
Read-only detail, legend status, export warning |
/student/attendance |
Harian/mingguan, scope Per Jam, empty state |
/parent/attendance |
Child selector, monthly/weekly, scope Per Jam, freshness dan escalation |
15.4 Field and action reference¶
Satu reference terstruktur untuk:
- session/date/batch/subject/time/classroom;
- student name dan identifier yang disetujui;
- status dan state glossary;
- remark/reason/proof;
- search, unit, batch, date, period, scope filters;
- Mark All Present, Save Draft/Complete, Edit, Refresh, Fill Session, Export;
- siapa yang dapat menjalankan setiap action dan apa downstream-nya.
15.5 Troubleshooting article¶
Pisahkan symptom berdasarkan actor:
- session tidak muncul;
- roster kosong atau salah;
- mode dialihkan ke gate;
- save pertama AccessError;
- status Sakit/Izin berbeda;
- perubahan belum terlihat portal;
- koreksi ditolak/cutoff;
- wrong child/no child;
- export/proof privacy;
- koneksi terputus — per-session tidak memiliki offline outbox.
15.6 Related-page links¶
- Setup jadwal/session dan enrollment rombel.
- Mode attendance configuration.
- Student permit/leave approval.
- Homeroom/subject attendance report.
- Parent/student attendance view.
- Report card attendance summary.
- Future: gate arrival/departure, RFID, face, pickup, advanced analytics.
15.7 Documentation acceptance test¶
Test ini dirancang sekarang tetapi baru dijalankan setelah defect/decision closure:
- Provision user baru hanya dengan role Scola Teacher; pastikan first-save berhasil tanpa group legacy manual.
- Buat session hari ini dengan dua siswa; pastikan guru lain dan tenant lain tidak dapat membaca/menulis.
- Pastikan roster default sesuai keputusan ATT-D02 dan complete menolak roster incomplete/unmarked.
- Save satu student masing-masing status kanonis, fetch kembali, lalu cocokkan guru, admin detail, student daily/period, parent daily/monthly.
- Verifikasi Sakit dan Dispensasi konsisten di UI, API, rekap, rapor, dan promotion input.
- Verifikasi state draft/complete dan correction cutoff/reason/audit sesuai ATT-D03–D05/D12.
- Verifikasi principal/VP tidak melihat CTA mutation dan endpoint mutation ditolak.
- Verifikasi admin roles yang disetujui dapat mengoreksi hanya company/unit sendiri.
- Kirim missing/duplicate/out-of-batch/cross-company student IDs langsung ke API; semuanya harus ditolak atomik.
- Verifikasi parent hanya dapat memilih child tertaut dan tidak menerima proof/reason melebihi policy.
- Verifikasi tidak ada notifikasi per-session bila ATT-D08 default dipilih; bila notifikasi diaktifkan, uji exactly-once, audience, dan correction behavior.
- Jalankan langkah artikel dari clean browser untuk teacher, homeroom, operator, student, dan parent; setiap visible label/action harus identik dengan artikel.
Evidence test yang dapat diperluas: tests/e2e/critical/teacher_attendance_flow.spec.ts:29, tests/e2e/critical/parent_attendance_flow.spec.ts:8, tests/unit/services/studentAttendance.service.spec.js:220, tests/unit/services/adminAttendance.service.spec.js:208, ../custom_addons_scola/gcgscola/scola_attendance/tests/test_attendance_structure_unit.py:376.
16. Definition of Ready sebelum penulisan dimulai¶
- [ ] ATT-D01 sampai ATT-D17 diputuskan dan dicatat oleh owner terkait.
- [ ]
BLK-A19: first-save guru lulus dengan user fresh-provisioned tanpa group tambahan tak terdokumentasi. - [ ]
BLK-A20: faculty/admin save menolak roster incomplete, duplicate, out-of-batch, dan cross-company secara atomik. - [ ]
BLK-B04: role/capability/menu/controller parity lulus untuk operator, principal, dan VP kesiswaan. - [ ]
BLK-A21: draft/complete/correction/audit state machine telah diterapkan atau limitation resmi disetujui. - [ ]
BLK-A22: status glossary konsisten sampai agregasi portal/rapor/promotion. - [ ]
BLK-A23: proof file memiliki authorization, data minimization, type/size, retention, dan audit policy. - [ ] Cross-role E2E membuktikan satu save guru yang sama tampil benar pada admin, student, dan parent.
- [ ] Runtime tenant baseline mencatat mode, company, timezone, module versions, dan role groups efektif.
- [ ]
BLK-B05: existing quick-start/troubleshooting yang bertentangan ditandai untuk revisi bersamaan; jangan dibiarkan sebagai dua kontrak berbeda. - [ ] Semua future documentation statements memiliki trace status selain
Blocked by defect,Requires runtime verification, atauRequires business confirmationuntuk langkah wajib.
17. Future related articles, bukan bagian pilot¶
- Kedatangan/kepulangan harian manual.
- Offline outbox untuk gate attendance.
- RFID ingestion dan device recovery.
- Face recognition dan liveness.
- Geofence/location policy.
- Pickup/transport attendance.
- Principal insight, attendance risk, dan advanced analytics.
- Employee attendance.
18. Dokumen dan source yang dibaca¶
Recon: seluruh file Markdown di docs/recon/, dengan fokus W05, route inventory, role matrix, page relationships, dan open questions. Existing docs: domain attendance, mode matrix, navigation audit, implementation guide, quick-start, role guides, troubleshooting, admin hub, configuration guide, dan PAUD UAT. Current source: route/menu/capability registry, semua page/service di tabel pilot, attendance controllers/models/security, portal identity, permit bridge, report-card/promotion downstream, serta FE/BE tests yang terkait.