Alur Antrian Pasien
Sistem antrian tiga layar: kios (ambil nomor) → loket (panggil) → papan tayang (tampilkan).
Arsitektur
Tahap 1 — Kios ambil nomor
Aturan penomoran
| Aturan | Nilai |
|---|---|
| Dihitung per | poliklinik dan tanggal |
| Reset | Setiap ganti hari, kembali ke 1 |
| Format tampilan | 3 digit dengan nol di depan (007) |
| Status awal | Waiting |
appointment_id | null — antrian walk-in tidak terkait janji temu |
lockForUpdate() di dalam transaksi mengunci baris antrian terakhir saat menghitung nomor berikutnya. Dua pengunjung yang menekan tombol bersamaan mustahil mendapat nomor yang sama.
Validasi
'poly_id' => ['required', 'integer', 'exists:pgsql_crm.polyclinics,poly_id'],
'doctor_id' => ['required', 'integer', 'exists:pgsql_crm.doctors,doctor_id'],
Nama field di pesan error ditampilkan sebagai "Poli" dan "Dokter".
Tahap 2 — Meja loket
Halaman /admin/queue-board (judul "Antrian Loket").
Logika callNext()
callNext() mengambil nomor Waiting terkecil hari itu tanpa menyaring poliklinik. Artinya satu loket bisa memanggil nomor dari poli mana pun. Penomorannya sendiri per-poli, jadi pastikan pembagian loket per poli diatur secara prosedural di lapangan.
Tindakan lain
| Tindakan | Efek |
|---|---|
addCounter(nama) | Buat QueueCounter baru, is_active = true. Nama kosong diabaikan |
toggleCounter(id) | Balik is_active. Loket nonaktif tidak bisa memanggil |
completeCurrent(id) | Antrian aktif → Done + done_at, lalu current_queue_id dikosongkan |
Daftar antrian menunggu di halaman ini menampilkan maksimal 30 nomor, diurutkan dari nomor terkecil, lengkap dengan relasi poliklinik & dokter.
queueDate default hari ini dan bisa diubah untuk melihat tanggal lain.
Tahap 3 — Papan tayang
Halaman layar penuh /dashboard-antrian.
Konversi URL YouTube
| Bentuk masukan | Diubah menjadi |
|---|---|
https://youtu.be/ABC123 | https://youtube.com/embed/ABC123?autoplay=1&mute=1&loop=1&playlist=ABC123 |
https://youtube.com/watch?v=ABC123 | sama seperti di atas |
| bentuk lain / kosong | null — video tidak ditampilkan (bukan error) |
Parameter mute=1 wajib supaya browser mengizinkan autoplay.
Model data
Menu terkait
| Menu | Kegunaan |
|---|---|
Antrian Loket (/admin/queue-board) | Operasional loket |
Dashboard Antrian (/admin/queue-dashboard) | Pintasan; dialihkan ke /dashboard-antrian |
Antrian RS (/admin/hospital-queues) | Resource Filament untuk melihat/mengelola baris antrian secara langsung |
| Pengaturan | Gambar latar, URL YouTube, teks berjalan |
Catatan operasional
| Hal | Perilaku |
|---|---|
| Nomor tidak dipanggil sampai tutup | Tetap Waiting. Hari berikutnya penomoran mulai dari 1 lagi, tapi baris lama tetap ada dengan queue_date kemarin |
| Loket dinonaktifkan saat memegang antrian | Antrian tetap Called dan current_queue_id tetap terisi — selesaikan dulu sebelum menonaktifkan |
Status In-Service dan Skipped | Ada di CHECK constraint database, tapi tidak dipakai alur QueueBoardPage saat ini. Bisa diisi lewat resource Antrian RS |
| Papan tayang tidak menampilkan apa-apa | Tidak ada loket aktif yang memegang antrian |