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 order
Section titled “Tipe order”| 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-itemsmemberi menu aktif besertamenuVersion. Cache:smash.fnb.menu.v1.- Daftar menu ditampilkan per bagian (
section); itemsold_outditandai Habis dan tidak bisa dipilih. - Bila versi menu berubah saat transaksi, server mencatat
recorded_with_review(perlu ditinjau) dan POS menyegarkan menu.
Modifier
Section titled “Modifier”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.