title: “POS Order Queue” description: “Live fulfillment queue SNISHOP ERP — Kanban board real-time, kitchen ticket printing, browser push notification, dan multi-channel order tracking.”
POS Order Queue
Halaman POS Order Queue adalah live fulfillment board yang menampilkan semua pesanan aktif dalam format Kanban 3 kolom. Halaman ini dirancang untuk tim dapur/kitchen dan staff fulfillment agar bisa melihat dan memproses pesanan secara real-time dari semua channel penjualan.
Arsitektur Komponen
Kanban Board — 3 Kolom
OrderCard — Informasi per Order
Setiap OrderCard menampilkan:Channel Badge Colors
Order Type Badges
Data Fetching Strategy
POSOrderQueue menggunakan 4 sumber data secara bersamaan:
Optimasi: Polling hanya aktif ketika tab browser visible (menggunakan
document.visibilityState). Ketika tab di-background, polling berhenti untuk menghemat bandwidth.
New Order Detection
Sistem mendeteksi order baru dan memberikan notifikasi: Implementasi:knownOrderIdsRefmenyimpan Set dari order IDs yang sudah dilihat- Setiap fetch baru, bandingkan dengan ref
- Order ID yang tidak ada di ref = order baru
- Trigger browser notification + sound
- Update ref setelah notifikasi
Kitchen Ticket Printing
Cetak tiket dapur untuk setiap order menggunakan Bluetooth thermal printer: Format Tiket:- Bluetooth thermal printer (58mm / 80mm)
- Auto-print option di settings
- Manual print dari OrderDetailModal
isPrintingSlipstate untuk prevent double-print
Browser Push Notification
Ketika order baru masuk, sistem menampilkan notifikasi browser: Notification Content:- Title: “Pesanan Baru!”
- Body: “Order #TRX-xxx dari [Channel] - [N] items”
- Icon: App logo
- Sound: Default notification sound
- Meminta izin Notification API saat pertama kali
- User bisa disable di browser settings
- Fallback ke sound alert jika notification ditolak
Filter & Search
Filter Controls
Filter Behavior
- Semua filter bisa dikombinasikan
- Filter persist selama sesi halaman
- Reset filter: klik “Clear All”
- Result count ditampilkan di header
Order Detail Modal
Klik order card untuk membuka detail lengkap: Tab 1: Order Info- Transaction number & date
- Channel & order type badges
- Customer info (name, phone, address)
- Notes from customer
- Full item list dengan quantity dan price
- Item notes (contoh: “tidak pakai bawang”)
- Subtotal per item
- Payment method & status
- Total amount
- Split payment breakdown (jika ada)
- Start Processing / Mark Completed
- Print Kitchen Ticket
- Print Receipt
- Cancel Order
- Send WhatsApp
Server Functions
transitionPOSOrderStatus Workflow
Demo Mode
POSOrderQueue mendukung demo mode untuk presentasi: Demo Data:DEMO_ORDERS: 6 sample orders dengan berbagai channel dan statusDEMO_COMPANY: Dummy company context- Auto-rotate orders untuk simulasi real-time
- Otomatis ketika
isDemoMode= true - Tidak ada data real yang dimodifikasi
- Semua aksi (process, complete) bekerja di memory saja
Performance Optimization
Cross-Module Integration
Best Practices
Untuk Kitchen Staff
- Pantau timer — order yang sudah > 15 menit perlu prioritas
- Print kitchen ticket untuk setiap order baru
- Update status tepat waktu — jangan biarkan order stuck di pending
- Cek notes — ada instruksi khusus dari customer
- Komunikasi dengan kasir jika ada item yang habis
Untuk Manager
- Monitor queue dari dashboard untuk melihat bottleneck
- Set target time — pending < 5 menit, processing < 15 menit
- Review completed orders untuk quality check
- Analisis peak hours dari POS Reports
- Adjust staffing berdasarkan order volume per jam
Untuk Developer
- Selalu gunakan
listPOSOrderQueueuntuk fetch data (bukan direct entity filter) - Listen ke
snishop_order_queueuntuk real-time updates - Handle error state dengan graceful UI
- Optimize polling — hanya ketika tab visible
- Test demo mode untuk presentasi tanpa data real
Entity Relationship Diagram — Order Queue
Berikut adalah ER Diagram yang menggambarkan relasi antar-entitas yang terlibat langsung dalam alur Order Queue di SNISHOP ERP. Diagram ini membantu developer dan stakeholder memahami bagaimana data pesanan mengalir dari berbagai channel penjualan ke dapur dan fulfillment.Penjelasan Relasi (Bahasa Indonesia)
- CompanyPOSTransaction → CompanyPOSProduct: Setiap transaksi POS menyimpan array
items[]yang merujuk keproduct_iddariCompanyPOSProduct. Ini adalah relasi many-to-many melalui embedded document. - CompanyPOSTransaction → CompanyPOSInventory: Setiap transaksi yang berhasil otomatis menulis log
CompanyPOSInventorydengantype = 'out'untuk mengurangi stok. - CompanyPOSTransaction → QuinnOrder: Order dari website Quinn di-mirror ke
CompanyPOSTransactionmelalui fieldpos_transaction_id. Ini memungkinkan laporan terpadu dari semua channel. - CompanyPOSProduct → CompanyPOSCategory: Setiap produk POS dikelompokkan dalam satu kategori untuk filtering dan reporting.
- QuinnOrder → CompanyPOSProduct: Item pada QuinnOrder merujuk ke SKU produk yang sama, memastikan konsistensi inventory.
Entity Schema Tables — Order Queue
Tabel berikut mendefinisikan seluruh field penting pada entitas yang terlibat dalam Order Queue, beserta tipe data, constraint, dan deskripsi bisnisnya.CompanyPOSTransaction — Skema Field Utama
Enum: order_status — 8 Nilai Status Order Queue
Field order_status pada CompanyPOSTransaction adalah sumber kebenaran untuk posisi order di Kanban board. Berikut 8 nilai yang didukung:
Enum: payment_method — Metode Pembayaran
Enum: payment_status — Status Pembayaran
Items Sub-Schema (Embedded dalam CompanyPOSTransaction)
QuinnOrder — Skema Field (Channel Website)
State Diagram — Order Status Lifecycle (Kanban Queue)
Diagram berikut menggambarkan seluruh siklus hidup status order di dalam POS Order Queue. Setiap transisi hanya boleh dilakukan oleh role tertentu (lihat RBAC table di bawah).Penjelasan Transisi Status (Bahasa Indonesia)
Sequence Diagram — Alur Order Placement → Kitchen → Fulfillment
Alur 1: Order dari Kasir Offline (POS)
Alur 2: Order dari Channel Online (QuinnOrder → CompanyPOSTransaction)
Alur 3: Order Cancellation & Inventory Rollback
RBAC — Role-Based Access Control untuk Order Status Transition
Tabel berikut mendefinisikan siapa yang boleh melakukan transisi status order di dalam POS Order Queue. Permission ini ditegakkan di level Server FunctiontransitionPOSOrderStatus dan juga divalidasi di sisi UI.
Catatan RBAC (Bahasa Indonesia)
- Kasir hanya bisa mengelola order di tahap awal (pending, confirmed) dan menyelesaikan order (served → completed). Kasir tidak bisa membatalkan order yang sudah masuk dapur.
- Kitchen Staff memiliki kendali penuh atas alur dapur: confirmed → preparing → ready. Mereka juga bisa membatalkan order jika item habis atau ada kendala masak.
- Server / Fulfillment hanya bisa melakukan transisi ready → served. Mereka tidak bisa memulai atau membatalkan order.
- Manager memiliki akses hampir penuh — bisa melakukan semua transisi kecuali void (kesalahan administratif).
- Admin dan Owner memiliki akses penuh ke semua transisi, termasuk void (penghapusan administratif) yang memerlukan audit trail.
- Void hanya bisa dilakukan oleh Admin atau Owner karena bersifat irreversible dari sisi audit — order yang di-void tidak bisa dikembalikan.
RLS (Row-Level Security)
Seluruh entitas order menggunakan RLS policy yang sama:active_company_id mereka, atau data yang mereka buat sendiri, atau semua data jika role = admin.
BroadcastChannel Sync — snishop_order_queue
Gambaran Umum
BroadcastChannel API adalah mekanisme real-time cross-tab communication dalam browser yang sama. SNISHOP ERP menggunakan channel bernama snishop_order_queue untuk menyinkronkan perubahan order antar-tab browser yang terbuka secara simultan — misalnya, satu tab menampilkan Kanban board di dapur, tab lain di kasir, dan tab ketiga di manajer.
Payload Message
Setiap pesan yang dikirim melaluisnishop_order_queue memiliki struktur berikut:
Event Types
Implementasi Teknis
Fallback & Lapisan Real-Time
BroadcastChannel hanya bekerja antar-tab di browser yang sama. Untuk sinkronisasi antar-device/antar-user, SNISHOP ERP menggunakan lapisan real-time tambahan:Best Practices untuk Developer
- Selalu broadcast setelah mutation — setiap kali
transitionPOSOrderStatusdipanggil dan berhasil, kirim pesan ke BroadcastChannel. - Jangan broadcast sebelum DB confirmed — tunggu response sukses dari server sebelum broadcast, agar tab lain tidak mendapat data yang belum committed.
- Debounce refetch — jika banyak pesan diterima dalam waktu singkat (misal 5 order masuk bersamaan), debounce refetch agar tidak terlalu banyak API call.
- Close channel on unmount — panggil
bc.close()saat komponen unmount untuk mencegah memory leak. - Handle stale data — jika order di tab A sudah completed tapi tab B masih menampilkan sebagai pending, WebSocket subscribe akan mengoreksi dalam < 500ms.
Ringkasan Arsitektur Order Queue
Penjelasan Arsitektur (Bahasa Indonesia)
Seluruh order dari semua channel penjualan (Offline POS, Website Quinn, GrabFood, Marketplace, WhatsApp) bermuara ke satu entitasCompanyPOSTransaction. Field order_status dengan 8 nilai (pending, confirmed, preparing, ready, served, completed, cancelled, voided) menjadi sumber kebenaran untuk posisi order di Kanban board.
POSOrderQueue (862 baris) adalah komponen React yang menampilkan Kanban board 3 kolom. Data di-fetch melalui 4 mekanisme secara bersamaan: Server Function untuk initial load, BroadcastChannel untuk sinkronisasi antar-tab (< 100ms), WebSocket untuk server push antar-device (< 500ms), dan polling 60 detik sebagai fallback terakhir.
Setiap kali order baru masuk, sistem mendeteksi melalui knownOrderIdsRef dan memicu Browser Push Notification serta Sound Alert agar dapur tidak melewatkan pesanan. Kitchen ticket dicetak otomatis via Bluetooth thermal printer (58mm/80mm) untuk setiap order baru.
Transisi status order dikontrol oleh RBAC yang ketat — kasir mengelola tahap awal, dapur mengelola tahap memasak, server mengelola tahap penghidangan, dan hanya Admin/Owner yang bisa melakukan void (penghapusan administratif). Setiap transisi dicatat dalam audit trail dan di-broadcast ke semua client yang terhubung.