W05-C — Pickup Lobby Queue + Waiting Room TV
Decision date: 2026-08-30
Approver: requesting user (explicit plan approval W05-C)
Status: IMMUTABLE W05-C IMPLEMENTATION CONTRACT
Scope: Catat penjemput tiba → tampilkan di TV ruang tunggu → checkout kepulangan di lobby
Amends: T4-DEC-006-007-attendance-v1-matrix.md
Does not: parent self-check-in, RFID/face auto-queue, dropped_off sopir di TV, push notif, multi-token layar, masking nama
Amendment 2026-09-01: Waiting room kiosk is authenticated-only (pickup_lobby_kiosk role). Public board API deprecated. Kiosk UI groups by rombel and shows max 2-word student names; tap-to-release uses pickup-queue/release.
Canonical flow
Siswa sudah check-in (W05-B)
→ petugas lobby catat penjemput tiba (per siswa ATAU bulk saudara) di /attendance/pickup-lobby
→ queue state=waiting → kiosk ruang tunggu menampilkan nama (2 kata) per rombel
→ petugas kiosk tap nama → release + check_out
→ queue state=released → hilang dari kiosk
Decisions
| # |
Contract |
| 1 |
Track = W05-C Pickup Lobby Queue, extend scola_attendance (bukan modul baru). |
| 2 |
Model SSOT = scola.student.pickup.queue dengan state waiting → released | cancelled. |
| 3 |
Max 1 entri waiting per (student_id, attendance_date). |
| 4 |
Granularity: default per siswa; bulk saudara via shared pickup_group_id + matching registry penjemput (nama+hubungan). |
| 5 |
Kiosk display = max 2 kata nama dikelompokkan per rombel; data dari pickup-queue/list (waiting). |
| 6 |
Checkout release memanggil student.attendance.mode.service.check_out (policy fast/standard/strict tetap berlaku). |
| 7 |
Checkout dari /attendance/daily auto-release queue waiting (hook). |
| 8 |
Feature gate company: student_attendance_pickup_lobby_enabled (default false) + departure gate enabled. |
| 9 |
Staff capability = students.attendance.update (sama W05-B daily); kiosk role = pickup_lobby_kiosk. |
| 10 |
Public board API deprecated; kiosk route auth-only, tidak expose NISN/foto/HP/roster penuh. |
| 11 |
Scope V1 = picked_up saja; dropped_off tetap /pickup/attendance. |
| 12 |
Controller baru attendance_pickup_lobby_api.py (≤12 routes); jangan tambah ke attendance_daily_api.py (ceiling 16). |
State machine
| Action |
From |
To |
Actor |
| arrive / arrive-bulk |
(none) |
waiting |
lobby staff |
| cancel |
waiting |
cancelled |
lobby staff + reason ≥3 |
| release |
waiting |
released |
lobby staff or kiosk officer (wraps check_out) |
| sync on check_out |
waiting |
released |
any entitled check_out path |
Staff API
| Route |
Auth |
Capability |
POST /api/v1/attendance/pickup-queue/list |
user |
students.attendance.update |
POST /api/v1/attendance/pickup-queue/arrive |
user |
students.attendance.update |
POST /api/v1/attendance/pickup-queue/arrive-bulk |
user |
students.attendance.update |
POST /api/v1/attendance/pickup-queue/cancel |
user |
students.attendance.update |
POST /api/v1/attendance/pickup-queue/release |
user |
students.attendance.update |
Deprecated public API
| Route |
Auth |
Notes |
POST /api/v1/attendance/public/pickup-waiting-board |
public |
Deprecated — returns authentication_required; use authenticated kiosk + pickup-queue/list |
FE surfaces
| Path |
Auth |
Status |
/attendance/pickup-lobby |
capability update |
CORE_SUPPORTED (unchanged) |
/attendance/public/pickup-waiting |
pickup_lobby_kiosk only |
CORE_SUPPORTED (chromeless kiosk) |
Certification
- RT-W05-LOBBY-POS-01: arrive → board shows name → release → board clears
- RT-W05-LOBBY-STA-01: cancel waiting; dual waiting denied
- RT-W05-LOBBY-REC-01: daily check_out auto-releases queue
- RT-W05-LOBBY-UIA-01: lobby staff UI smoke + TV poll
Non-claims
Parent self-check-in, RFID/face auto-queue, dropped_off on TV, push notification, per-screen display tokens, name masking config, "baru dipanggil" section (V1.1).