Antrean offline (outbox)
Setiap transaksi (penjualan retail atau pesanan F&B) disimpan ke outbox di perangkat sebelum dikirim. Outbox bertahan setelah aplikasi ditutup (AsyncStorage) dan dikirim ulang otomatis.
flowchart TD
A["Kasir menekan Bayar"] --> B["Buat operationId dan clientUuid<br/>(dibekukan)"]
B --> C["Simpan ke outbox lokal"]
C --> D{"Kirim ke server"}
D -- "synced / replayed / duplicate" --> E["Hapus dari outbox<br/>tampilkan struk"]
D -- "rejected / conflict" --> F["Status gagal<br/>muncul di Riwayat"]
D -- "jaringan putus / error server" --> G["Tetap menunggu<br/>coba lagi tiap 20 detik"]
G --> D
F --> H["Coba lagi atau buang"]
H --> D
Aturan
Section titled “Aturan”operationIddanclientUuiddibuat sekali per transaksi. Server idempoten: mengirim ulang memberireplayed, bukan transaksi ganda.- Keranjang dikosongkan begitu transaksi masuk outbox, bukan menunggu server.
- Token staf saat transaksi dibuat disimpan bersama item. Bila kedaluwarsa (
STAFF_SESSION_INVALID), outbox mencoba sekali lagi dengan sesi staf yang sedang aktif. - Pengiriman otomatis: tiap 20 detik, saat koneksi kembali online, dan lewat tombol Kirim sekarang (tab Lainnya).
- Penolakan permanen (
rejected) tidak diulang otomatis; kasir memilih Coba lagi atau Buang di Riwayat.
packages/pos-core/src/outbox.ts(createOutbox) dan tesnya ditests/outbox.test.ts.- Tiap app membuat instans sendiri di
src/lib/pos.ts. PosGatemenjalankan pengiriman berkala dan menyediakanoutboxItemslewatusePos().