Lewati ke isi

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 waitingreleased | 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).