Lewati ke konten

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"]
  1. Total dihitung di server. Klien boleh menghitung untuk tampilan, tetapi kirim totalMinor hanya sebagai pemeriksaan.
  2. Jangan menampilkan hasil mesin sebagai fakta. Suara, pencocokan menu, dan lookup harus ditinjau dan dikonfirmasi.
  3. Transaksi lewat outbox. Jangan memanggil sales/sync atau orders/sync langsung dari layar; gunakan outbox.submit.
  4. Satu sumber logika bersama. Bila dua POS membutuhkannya, taruh di pos-core. Hindari menyalin api.ts baru.
  5. Aksi sensitif memakai canManage. Void dan penyesuaian stok disembunyikan dari kasir; server tetap menolak (403).
  6. Tanpa Alert.alert. Pakai confirmAction.
  7. Tanpa rahasia di bundle. Hanya EXPO_PUBLIC_* non-rahasia.
  8. Dokumentasi. Setiap fitur baru menambah/memperbarui satu halaman di folder ini dengan diagram alur.
  1. Buat src/app/(tabs)/nama.tsx.
  2. Daftarkan di src/app/(tabs)/_layout.tsx (Tabs.Screen).
  3. Render <StatusBanner /> di bagian atas supaya status koneksi, kasir, shift, dan antrean terlihat.
  4. Ambil konteks dengan usePos().
const rows = await client.request<Row[]>("/v1/sesuatu?limit=50");
await client.request("/v1/sesuatu", { body: { ... } }); // POST
await client.request("/v1/sesuatu/1", { method: "PATCH", body }); // PATCH

client.request otomatis menambahkan token perangkat dan X-Staff-Token, dan melempar ApiError.