Skip to main content

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

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:
  • knownOrderIdsRef menyimpan 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:
Implementasi:
  • Bluetooth thermal printer (58mm / 80mm)
  • Auto-print option di settings
  • Manual print dari OrderDetailModal
  • isPrintingSlip state 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
Permission:
  • Meminta izin Notification API saat pertama kali
  • User bisa disable di browser settings
  • Fallback ke sound alert jika notification ditolak

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
Tab 2: Items
  • Full item list dengan quantity dan price
  • Item notes (contoh: “tidak pakai bawang”)
  • Subtotal per item
Tab 3: Payment
  • Payment method & status
  • Total amount
  • Split payment breakdown (jika ada)
Tab 4: Actions
  • 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 status
  • DEMO_COMPANY: Dummy company context
  • Auto-rotate orders untuk simulasi real-time
Activation:
  • 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

  1. Pantau timer — order yang sudah > 15 menit perlu prioritas
  2. Print kitchen ticket untuk setiap order baru
  3. Update status tepat waktu — jangan biarkan order stuck di pending
  4. Cek notes — ada instruksi khusus dari customer
  5. Komunikasi dengan kasir jika ada item yang habis

Untuk Manager

  1. Monitor queue dari dashboard untuk melihat bottleneck
  2. Set target time — pending < 5 menit, processing < 15 menit
  3. Review completed orders untuk quality check
  4. Analisis peak hours dari POS Reports
  5. Adjust staffing berdasarkan order volume per jam

Untuk Developer

  1. Selalu gunakan listPOSOrderQueue untuk fetch data (bukan direct entity filter)
  2. Listen ke snishop_order_queue untuk real-time updates
  3. Handle error state dengan graceful UI
  4. Optimize polling — hanya ketika tab visible
  5. 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)

  1. CompanyPOSTransaction → CompanyPOSProduct: Setiap transaksi POS menyimpan array items[] yang merujuk ke product_id dari CompanyPOSProduct. Ini adalah relasi many-to-many melalui embedded document.
  2. CompanyPOSTransaction → CompanyPOSInventory: Setiap transaksi yang berhasil otomatis menulis log CompanyPOSInventory dengan type = 'out' untuk mengurangi stok.
  3. CompanyPOSTransaction → QuinnOrder: Order dari website Quinn di-mirror ke CompanyPOSTransaction melalui field pos_transaction_id. Ini memungkinkan laporan terpadu dari semua channel.
  4. CompanyPOSProduct → CompanyPOSCategory: Setiap produk POS dikelompokkan dalam satu kategori untuk filtering dan reporting.
  5. 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 Function transitionPOSOrderStatus dan juga divalidasi di sisi UI.

Catatan RBAC (Bahasa Indonesia)

  1. Kasir hanya bisa mengelola order di tahap awal (pending, confirmed) dan menyelesaikan order (served → completed). Kasir tidak bisa membatalkan order yang sudah masuk dapur.
  2. Kitchen Staff memiliki kendali penuh atas alur dapur: confirmed → preparing → ready. Mereka juga bisa membatalkan order jika item habis atau ada kendala masak.
  3. Server / Fulfillment hanya bisa melakukan transisi ready → served. Mereka tidak bisa memulai atau membatalkan order.
  4. Manager memiliki akses hampir penuh — bisa melakukan semua transisi kecuali void (kesalahan administratif).
  5. Admin dan Owner memiliki akses penuh ke semua transisi, termasuk void (penghapusan administratif) yang memerlukan audit trail.
  6. 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:
Artinya: user hanya bisa membaca, membuat, mengupdate, dan menghapus data yang属于 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 melalui snishop_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

  1. Selalu broadcast setelah mutation — setiap kali transitionPOSOrderStatus dipanggil dan berhasil, kirim pesan ke BroadcastChannel.
  2. Jangan broadcast sebelum DB confirmed — tunggu response sukses dari server sebelum broadcast, agar tab lain tidak mendapat data yang belum committed.
  3. Debounce refetch — jika banyak pesan diterima dalam waktu singkat (misal 5 order masuk bersamaan), debounce refetch agar tidak terlalu banyak API call.
  4. Close channel on unmount — panggil bc.close() saat komponen unmount untuk mencegah memory leak.
  5. 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 entitas CompanyPOSTransaction. 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.