Lewati ke konten

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
  • operationId dan clientUuid dibuat sekali per transaksi. Server idempoten: mengirim ulang memberi replayed, 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 di tests/outbox.test.ts.
  • Tiap app membuat instans sendiri di src/lib/pos.ts.
  • PosGate menjalankan pengiriman berkala dan menyediakan outboxItems lewat usePos().