Lewati ke konten

Pesanan dan tipe order (F&B)

Tab Kasir (apps/fnb/src/app/(tabs)/order.tsx).

flowchart TD
  A["Buka Kasir"] --> B["Pilih tipe order<br/>Dine-in / Takeaway / Pickup"]
  B --> C{"Dine-in dan outlet punya meja?"}
  C -- "ya" --> D["Pilih nomor meja"]
  C -- "tidak" --> E
  D --> E{"Cara menambah item"}
  E -- "ketuk menu" --> F["AddSheet"]
  E -- "ketik nama + Tambah" --> G["POST /v1/matches/menu"]
  E -- "mikrofon" --> V["Pesan dengan suara"]
  G --> H{"Hasil"}
  H -- "satu kandidat" --> F
  H -- "banyak (clarify)" --> I["Kasir memilih<br/>tidak pernah auto-pilih"]
  H -- "tidak ada" --> J["Menu tidak ditemukan"]
  I --> F
  F --> K["Pilih modifier wajib + catatan + qty"]
  K --> L["Masuk keranjang"]
  V --> L
  L --> M["Bayar / kirim pesanan"]
Tipe Field tambahan Aturan server
dine_in tableId Bila outlet punya meja aktif, meja wajib (TABLE_REQUIRED)
takeaway customerName (opsional) Tanpa meja
pickup customerName, scheduledFor (self-order) Tanpa meja

Outlet tanpa meja terdaftar tetap bisa memakai dine-in tanpa nomor meja.

  • GET /v1/menu-items memberi menu aktif beserta menuVersion. Cache: smash.fnb.menu.v1.
  • Daftar menu ditampilkan per bagian (section); item sold_out ditandai Habis dan tidak bisa dipilih.
  • Bila versi menu berubah saat transaksi, server mencatat recorded_with_review (perlu ditinjau) dan POS menyegarkan menu.

modifier_groups_json dari owner bisa bervariasi nama field; normalizeModifierGroups (src/lib/api.ts) menormalkannya. AddSheet memaksa pilihan sesuai minSelect/maxSelect. Harga opsi (priceDeltaMinor) ditambahkan ke harga satuan dan dibekukan di snapshot baris.

order.tsx, src/components/add-sheet.tsx, src/lib/order-cart.ts (store global + checkout()), src/lib/menu.ts.