Scan, foto, dan lookup
Tab Scan (apps/retail/src/app/(tabs)/scan.tsx) memakai expo-camera.
flowchart TD
A["Buka kamera atau ketik manual"] --> B["Barcode terbaca / pencarian"]
A --> P["Ambil foto produk"]
B --> C{"Ada di produk toko?"}
C -- "ya" --> D["Langsung masuk keranjang"]
C -- "tidak" --> E["POST /v1/lookup"]
P --> Q["POST /v1/lookup/photo<br/>foto disimpan, analisis belum ada"]
Q --> E2{"Ada barcode/teks sebagai petunjuk?"}
E2 -- "ya" --> E
E2 -- "tidak" --> N
E --> F{"Ditemukan di dataset?"}
F -- "ya" --> G["Kandidat katalog<br/>tombol Jual produk ini"]
F -- "tidak (404)" --> N["Produk tidak ditemukan"]
G --> H["Isi harga jual"]
N --> I["Tambah sebagai produk toko"]
H --> J["PUT /v1/store-products/:id"]
I --> J
J --> K["Masuk keranjang"]
Kontrak lookup
Section titled “Kontrak lookup”POST /v1/lookup dengan { barcode?, query? }:
| Kasus | Respons |
|---|---|
| GTIN valid ada di katalog | 200 { status: "found", matchedBy: "gtin", products: [...] } |
| Nama/merek/varian/alias cocok | 200 { matchedBy: "name", products: [...] } (maks 10) |
| Tidak ada | 404 NO_PRODUCT_FOUND, pesan no product found, details.reasons |
POST /v1/lookup/photo (multipart image, opsional barcode/query):
- Hanya JPEG, PNG, WebP (dicek dari magic bytes), maks 5 MB.
- Foto disimpan privat di R2 per tenant untuk tim dataset.
- Analisis gambar belum ada. Tanpa petunjuk barcode/teks, jawabannya selalu
NO_PRODUCT_FOUNDdengananalysis: "not_available".
Catatan kamera
Section titled “Catatan kamera”- Di web, kamera dan scan barcode bergantung pada browser; pencarian manual selalu tersedia sebagai cadangan.
- Barcode yang diabaikan: pembacaan yang sama dalam 3 detik (anti-ganda).
- Jenis barcode: EAN-13/8, UPC-A/E, Code 128.
Katalog bersama hanya bisa ditulis tim dataset. Perangkat POS hanya membaca (POST ke /v1/catalog/products mengembalikan 403).