Menambah fitur
flowchart TD
A["Ide fitur"] --> B{"Perlu data baru di server?"}
B -- "ya" --> C["Minta backend: migrasi + endpoint + tes"]
B -- "tidak" --> D
C --> D{"Dipakai retail dan F&B?"}
D -- "ya" --> E["Taruh di packages/pos-core"]
D -- "tidak" --> F["Taruh di apps/retail atau apps/fnb"]
E --> G["Tes vitest bila ada logika"]
F --> G
G --> H["pnpm typecheck"]
H --> I["Uji di web: pnpm dev:retail / dev:fnb"]
I --> J["Perbarui halaman docs fitur + diagram"]
Aturan
Section titled “Aturan”- Total dihitung di server. Klien boleh menghitung untuk tampilan, tetapi kirim
totalMinorhanya sebagai pemeriksaan. - Jangan menampilkan hasil mesin sebagai fakta. Suara, pencocokan menu, dan lookup harus ditinjau dan dikonfirmasi.
- Transaksi lewat outbox. Jangan memanggil
sales/syncatauorders/synclangsung dari layar; gunakanoutbox.submit. - Satu sumber logika bersama. Bila dua POS membutuhkannya, taruh di
pos-core. Hindari menyalinapi.tsbaru. - Aksi sensitif memakai
canManage. Void dan penyesuaian stok disembunyikan dari kasir; server tetap menolak (403). - Tanpa
Alert.alert. PakaiconfirmAction. - Tanpa rahasia di bundle. Hanya
EXPO_PUBLIC_*non-rahasia. - Dokumentasi. Setiap fitur baru menambah/memperbarui satu halaman di folder ini dengan diagram alur.
Menambah tab baru
Section titled “Menambah tab baru”- Buat
src/app/(tabs)/nama.tsx. - Daftarkan di
src/app/(tabs)/_layout.tsx(Tabs.Screen). - Render
<StatusBanner />di bagian atas supaya status koneksi, kasir, shift, dan antrean terlihat. - Ambil konteks dengan
usePos().
Memanggil endpoint baru
Section titled “Memanggil endpoint baru”const rows = await client.request<Row[]>("/v1/sesuatu?limit=50");await client.request("/v1/sesuatu", { body: { ... } }); // POSTawait client.request("/v1/sesuatu/1", { method: "PATCH", body }); // PATCHclient.request otomatis menambahkan token perangkat dan X-Staff-Token, dan melempar ApiError.