Purchase Order (Pesanan Pembelian)
| Code | PUR-PO |
| Module | Purchasing |
| Type | Transaction document |
| Status | Implemented |
| Priority | P0 — MVP |
| Process | Procure-to-Pay, langkah 1 |
| API | [URL Postman] |
1. Overview
Purchase Order (PO) adalah dokumen pemesanan barang dari sebuah toko ke supplier, dan menjadi acuan untuk Penerimaan Barang (Goods Receipt) serta Penagihan (Bill). Staf membuat PO berisi supplier, kontak supplier, alamat pengiriman toko, termin pembayaran, dan daftar produk beserta qty, harga, diskon, dan pajak. PO ditetapkan penanggung jawabnya (PIC); hanya PIC yang bisa mengajukan, membatalkan, dan menutup PO. PO bisa dicetak sebagai PDF kapan saja.
Hasil yang diharapkan: setiap toko tahu apa yang sedang dipesan dan belum datang, siapa yang bertanggung jawab atas pesanan itu, dan barang yang datang bisa dicocokkan dengan pesanan.
2. Problem
Pembelian di retail kecil dan menengah biasanya berjalan tanpa dokumen pesanan formal. Pesanan disampaikan lewat chat atau telepon, dan pencocokan barang, harga, serta tagihan dilakukan dari ingatan atau catatan pribadi staf. Akibatnya:
- Tidak ada satu tempat untuk melihat apa yang sedang ditunggu dari supplier, per toko.
- Tidak jelas siapa yang bertanggung jawab atas sebuah pesanan.
- Saat barang datang, staf tidak tahu jumlah dan harga yang disepakati; kurang kirim atau kenaikan harga baru ketahuan saat tagihan datang.
- Owner tidak bisa memperkirakan pengeluaran dan jatuh tempo pembayaran karena komitmen pembelian tidak tercatat.
3. Goals & Non-goals
Goals
- PO cepat dibuat sehingga staf mau memakainya. Indikator: staf membuat PO lewat wizard tanpa spreadsheet terpisah.
- Setiap PO punya penanggung jawab yang jelas. Indikator: aksi Ajukan, Batalkan, dan Tutup hanya bisa dilakukan PIC.
- PO menjadi acuan penerimaan barang dan tagihan. Indikator: mayoritas Goods Receipt dan Bill merujuk ke PO.
- Status penerimaan terlihat. Indikator: status PO berubah otomatis mengikuti Goods Receipt yang diajukan.
Non-goals
- Approval bertingkat (cukup PIC yang mengajukan)
- Kirim PO ke supplier via email dari sistem (cukup cetak / unduh PDF)
- Revisi PO setelah Diajukan (batalkan dan buat baru)
- Duplikat PO
- RFQ / perbandingan penawaran supplier, blanket PO, multi-currency
- Lampiran file pada PO
4. User Scenarios
| Role | Scenario |
|---|---|
| Staf Purchasing | Membuat PO restock mingguan ke satu supplier untuk tokonya, menetapkan dirinya sebagai PIC, lalu mengajukan dan mencetak PDF untuk dikirim via WhatsApp |
| Kepala Toko | Menetapkan PIC pada PO Draf yang dibuat staf lain agar PO bisa diajukan |
| Staf Gudang | Barang datang; membuat Penerimaan Barang dari PO yang sudah Diajukan |
| Staf Purchasing | Supplier hanya mengirim sebagian; melihat status PO Diterima Sebagian dan sisa qty di modul Item Pembelian |
| Owner | Melihat semua PO lintas toko, menyaring berdasarkan status dan supplier, dan memantau jatuh tempo pembayaran |
| PIC | Membatalkan PO yang tidak jadi dipesan, atau menutup PO yang sudah diterima seluruhnya |
5. User Flow
Penjelasan tiap langkah pada diagram:
-
Isi wizard — Dari daftar PO, staf klik Tambah Baru. Wizard terdiri dari 3 langkah:
- Umum: toko terisi otomatis dari toko aktif (read-only); alamat pengiriman terisi otomatis dari alamat pengiriman default toko; tanggal pesanan default hari ini; staf mengisi tanggal estimasi diterima, penanggung jawab (opsional), supplier, kontak supplier, tipe pembayaran, dan catatan. Tanggal jatuh tempo dihitung otomatis dari tipe pembayaran.
- Produk: staf menambah baris lewat dialog: cari produk berdasarkan nama atau barcode (satu pilihan per kemasan/UoM), isi qty, harga (default harga pokok kemasan; harga beli terakhir ditampilkan sebagai acuan), diskon persen dan nominal (bisa lebih dari satu), dan pajak. Total baris dan grand total dihitung langsung.
- Tinjauan: ringkasan seluruh isian sebelum disimpan.
Pratinjau PDF tersedia di setiap langkah.
-
Data valid? — Validasi per langkah saat klik Selanjutnya, dan validasi BE saat Simpan. Error BE ditampilkan di langkah Tinjauan dan pada field terkait.
-
Draf — PO tersimpan dengan status Draf, dan staf diarahkan ke daftar PO. Draf bisa diubah (header dan baris), ditetapkan PIC-nya, atau dihapus.
-
Diajukan — PIC klik Ajukan Pesanan dan mengonfirmasi. PO tidak dapat diubah lagi; tercatat siapa dan kapan mengajukan. PO kini bisa dirujuk oleh Goods Receipt dan Bill.
-
Goods Receipt — Saat barang datang, staf membuat Penerimaan Barang yang merujuk PO ini. Proses penerimaan dijelaskan di PRD Goods Receipt.
-
Semua qty diterima? — Saat GR diajukan, BE membandingkan qty diterima dengan qty pesan tiap baris.
-
Diterima Sebagian — Masih ada sisa qty; GR berikutnya kembali ke langkah 5. Sisa qty per baris terlihat di modul Item Pembelian.
-
Diterima — Semua baris terpenuhi. PO masih bisa dirujuk GR dan Bill.
-
Selesai — PIC klik Tutup Pesanan dan mengonfirmasi. PO ditandai selesai dan tidak dapat diubah lagi.
-
Dibatalkan — PIC klik Batalkan Pesanan pada PO Diajukan dan wajib mengisi alasan.
Alternative paths
Jalur alternatif adalah kejadian di luar alur normal di atas, misalnya pengguna berubah pikiran, supplier tidak memenuhi pesanan, atau data master berubah. Setiap jalur ini harus punya perilaku yang jelas agar FE dan BE tidak menebak:
- Perubahan setelah Diajukan — tidak bisa. Batalkan (selama belum ada GR) lalu buat PO baru.
- PO belum punya PIC — tombol Ajukan nonaktif untuk semua pengguna. Tetapkan PIC dulu lewat Edit Draf atau aksi tetapkan PIC di daftar.
- Pengguna bukan PIC — tombol Ajukan, Batalkan, dan Tutup tampil tetapi nonaktif.
- PO Draf tidak jadi dipakai — hapus (satuan atau massal). Draf tidak dibatalkan, tetapi dihapus.
- Supplier tidak memenuhi sisa pesanan — saat ini PO tetap berstatus Diterima Sebagian; belum ada aksi tutup atau batal pada status ini (lihat EC-05).
- Toko tidak aktif — PO hanya bisa dilihat dan dicetak; semua aksi ubah disembunyikan.
6. User Stories
Prioritas: P0 wajib untuk rilis, P1 penting, P2 kalau sempat.
US-01 — Membuat PO (P0)
Sebagai staf purchasing, saya ingin membuat PO berisi supplier, alamat pengiriman, termin, dan daftar produk, agar pesanan tercatat sebelum barang datang.
| ID | Kriteria penerimaan |
|---|---|
| AC-01.1 | Saat pengguna dengan izin create membuka Tambah Baru di toko aktif, wizard Umum → Produk → Tinjauan tampil dengan toko aktif terisi (read-only) dan tanggal pesanan hari ini. |
| AC-01.2 | Alamat pengiriman terisi otomatis dengan alamat pengiriman default toko; jika tidak ada, alamat pertama toko. |
| AC-01.3 | Saat supplier diganti, kontak dikosongkan dan pilihan kontak diambil dari kontak supplier terpilih. Kontak nonaktif sampai supplier dipilih. |
| AC-01.4 | Saat tipe pembayaran, tanggal pesanan, atau tanggal estimasi berubah, tanggal jatuh tempo dihitung ulang sesuai BR-06. Pada tipe Custom, tanggal jatuh tempo wajib diisi manual. |
| AC-01.5 | Tanggal estimasi diterima tidak bisa dipilih sebelum tanggal pesanan. |
| AC-01.6 | Saat produk dipilih, UoM terisi dari kemasan terpilih, harga default dari harga pokok kemasan, dan harga beli terakhir ditampilkan sebagai acuan. |
| AC-01.7 | Saat qty, harga, diskon, atau pajak berubah, total baris dan grand total diperbarui tanpa reload, dengan perhitungan sesuai BR-04 dan BR-05. |
| AC-01.8 | Saat Selanjutnya diklik dan field wajib di langkah itu kosong, pengguna tidak bisa pindah langkah dan error tampil di field terkait. |
| AC-01.9 | Saat Simpan berhasil, PO tersimpan berstatus Draf, toast sukses tampil, dan pengguna diarahkan ke daftar PO. |
| AC-01.10 | Saat BE menolak penyimpanan, pesan error tampil di langkah Tinjauan dan pada field terkait. |
| AC-01.11 | Saat pengguna meninggalkan wizard dengan isian yang belum disimpan, muncul konfirmasi perubahan belum disimpan. |
US-02 — Mengubah PO Draf (P0)
Sebagai staf purchasing, saya ingin mengubah PO yang masih Draf, agar kesalahan bisa diperbaiki sebelum diajukan.
| ID | Kriteria penerimaan |
|---|---|
| AC-02.1 | Tombol Ubah Data hanya tampil pada PO Draf untuk pengguna dengan izin update di toko aktif. |
| AC-02.2 | Tab Umum disimpan sekaligus; baris di tab Produk ditambah, diubah, dan dihapus satu per satu dan langsung tersimpan. |
| AC-02.3 | Saat URL edit dibuka pada PO yang bukan Draf, halaman kembali ke tampilan detail read-only. |
| AC-02.4 | Tab yang sedang dibuka tetap sama saat berpindah dari detail ke edit. |
US-03 — Menetapkan penanggung jawab (P0)
Sebagai kepala toko, saya ingin menetapkan PIC pada PO, agar jelas siapa yang berwenang mengajukan, membatalkan, dan menutup PO.
| ID | Kriteria penerimaan |
|---|---|
| AC-03.1 | PIC bisa dipilih lebih dari satu dari daftar karyawan toko, saat membuat PO, saat mengubah Draf, atau lewat tombol tambah di kolom Penanggung Jawab pada daftar. |
| AC-03.2 | Tombol tambah PIC di daftar hanya tampil pada PO Draf untuk pengguna dengan izin assign di toko aktif. |
US-04 — Mengajukan PO (P0)
Sebagai PIC, saya ingin mengajukan PO, agar PO berlaku dan isinya tidak berubah lagi.
| ID | Kriteria penerimaan |
|---|---|
| AC-04.1 | Tombol Ajukan Pesanan tampil pada PO Draf untuk pengguna dengan izin submit, dan hanya aktif jika pengguna adalah PIC PO tersebut. |
| AC-04.2 | Setelah konfirmasi, status menjadi Diajukan, serta tercatat siapa dan kapan mengajukan. |
| AC-04.3 | Pada PO Diajukan, tombol Ubah Data dan aksi baris tidak tampil. |
US-05 — Membatalkan PO (P0)
Sebagai PIC, saya ingin membatalkan PO yang tidak jadi, agar tidak dianggap pesanan yang ditunggu.
| ID | Kriteria penerimaan |
|---|---|
| AC-05.1 | Tombol Batalkan Pesanan tampil pada PO Diajukan untuk pengguna dengan izin cancel, dan hanya aktif jika pengguna adalah PIC. |
| AC-05.2 | Dialog pembatalan mewajibkan alasan; tombol konfirmasi nonaktif selama alasan kosong. |
| AC-05.3 | Setelah dibatalkan, status menjadi Dibatalkan; alasan, siapa, dan kapan tersimpan. Stepper status menampilkan jalur Draf → Diajukan → Dibatalkan. |
US-06 — Melihat progres penerimaan (P0)
Sebagai staf purchasing, saya ingin status PO berubah mengikuti penerimaan barang, agar tahu apa yang masih ditunggu.
| ID | Kriteria penerimaan |
|---|---|
| AC-06.1 | Saat GR yang merujuk PO diajukan untuk sebagian qty, status PO menjadi Diterima Sebagian. |
| AC-06.2 | Saat seluruh baris terpenuhi, status PO menjadi Diterima. |
| AC-06.3 | Qty dipesan, diterima, dan sisa per baris tampil di modul Item Pembelian, dan bisa difilter per PO. |
US-07 — Menutup PO (P0)
Sebagai PIC, saya ingin menutup PO yang sudah diterima seluruhnya, agar PO ditandai selesai.
| ID | Kriteria penerimaan |
|---|---|
| AC-07.1 | Tombol Tutup Pesanan tampil pada PO Diterima untuk pengguna dengan izin close, dan hanya aktif jika pengguna adalah PIC. |
| AC-07.2 | Setelah konfirmasi, status menjadi Selesai, serta tercatat siapa dan kapan menutup. |
US-08 — Daftar dan pencarian PO (P0)
Sebagai owner, saya ingin melihat dan menyaring PO, agar cepat menemukan pesanan yang belum datang.
| ID | Kriteria penerimaan |
|---|---|
| AC-08.1 | Default menampilkan PO toko aktif; filter lanjutan: toko, supplier, rentang tanggal, dan status; pencarian dengan kata kunci. |
| AC-08.2 | Kolom: nomor, toko, tanggal pesanan, tanggal estimasi, jatuh tempo, penanggung jawab, supplier, total bruto, total diskon, total neto, total pajak, grand total, dibuat oleh, dan status. |
| AC-08.3 | Urutan default tanggal pesanan terbaru di atas, dengan paginasi. Kolom yang bisa diurutkan: tanggal pesanan, nomor, tanggal estimasi, jatuh tempo, dan grand total. |
| AC-08.4 | Baris bisa diperluas untuk melihat daftar produk PO tanpa membuka detail. |
| AC-08.5 | Aksi baris: Cetak, Lihat, Ubah (hanya Draf), Hapus (hanya Draf), sesuai izin. |
US-09 — Menghapus PO Draf (P0)
Sebagai staf purchasing, saya ingin menghapus Draf yang tidak jadi dipakai, agar daftar tetap bersih.
| ID | Kriteria penerimaan |
|---|---|
| AC-09.1 | Aksi Hapus hanya tersedia pada PO Draf untuk pengguna dengan izin delete di toko aktif, setelah konfirmasi. |
| AC-09.2 | Hapus massal tersedia dari baris yang dipilih di daftar. |
US-10 — Mencetak PO (P1)
Sebagai staf purchasing, saya ingin mencetak atau mengunduh PO sebagai PDF, agar bisa dikirim ke supplier.
| ID | Kriteria penerimaan |
|---|---|
| AC-10.1 | Pratinjau PDF tersedia dari wizard buat PO, halaman detail/edit, dan aksi Cetak di daftar, pada status apa pun. |
| AC-10.2 | Saat mengedit Draf, pratinjau PDF memakai isian form terbaru yang belum disimpan. |
| AC-10.3 | Sebelum PO disimpan, nomor PO di PDF tampil kosong (”-”). |
US-11 — Riwayat aktivitas (P1)
Sebagai owner, saya ingin melihat log aktivitas PO, agar tahu siapa mengubah apa dan kapan.
| ID | Kriteria penerimaan |
|---|---|
| AC-11.1 | Log aktivitas tersedia per PO (di detail) dan untuk seluruh PO (di daftar). |
7. Document Structure
Header
| Field | Required | Default | Notes |
|---|---|---|---|
| Nomor PO | Otomatis | Dibuat BE | Kosong di pratinjau sebelum disimpan |
| Toko | Ya | Toko aktif | Read-only |
| Alamat pengiriman | Ya | Alamat pengiriman default toko | Dari alamat toko |
| Tanggal pesanan | Ya | Hari ini | |
| Tanggal estimasi diterima | Ya | — | Tidak boleh sebelum tanggal pesanan |
| Penanggung jawab (PIC) | Tidak | — | Multi-pilih dari karyawan toko; wajib sebelum Ajukan (BR-02) |
| Supplier | Ya | — | Dari master Supplier |
| Kontak | Ya | — | Dari kontak supplier terpilih; kosong saat supplier diganti |
| Tipe pembayaran | Ya | — | CBD, COD, EOM, Net 14/30/60/90, Custom |
| Tanggal jatuh tempo | Wajib jika Custom | Dihitung dari tipe pembayaran | Lihat BR-06 |
| Catatan | Tidak | — | Tampil di PDF |
| Status | Otomatis | Draf | Lihat bagian 8 |
Lines
| Field | Required | Default | Notes |
|---|---|---|---|
| Urutan | Otomatis | Urutan ditambahkan | |
| Produk + kemasan | Ya | — | Dari inventaris produk toko; satu pilihan per kemasan; cari nama atau barcode |
| UoM | Otomatis | UoM kemasan terpilih | |
| Qty | Ya | 1 | Minimal 0,01 |
| Harga satuan | Ya | Harga pokok kemasan | Minimal 1; harga beli terakhir ditampilkan sebagai acuan |
| Diskon persen | Tidak | 0 | Bisa lebih dari satu; bertingkat (BR-04) |
| Diskon nominal | Tidak | 0 | Bisa lebih dari satu; dipotong setelah diskon persen |
| Pajak | Tidak | Persen, 0 | Persen atau nominal |
| Total bruto | Otomatis | — | qty × harga |
| Total diskon | Otomatis | — | Akumulasi diskon |
| Total neto | Otomatis | — | Bruto − diskon |
| Total pajak | Otomatis | — | |
| Total baris | Otomatis | — | Neto + pajak |
Totals: Total Bruto · Total Diskon · Total Neto · Total Pajak · Grand Total (penjumlahan semua baris), plus jejak dibuat / diajukan / dibatalkan (dengan alasan) / diterima pertama / ditutup oleh siapa dan kapan.
8. Status Lifecycle
| Status | Label UI | Meaning | Editable | Next status |
|---|---|---|---|---|
draft | Draf | Sedang disusun, belum berlaku | Semua field dan baris | Diajukan, atau dihapus |
submitted | Diajukan | Berlaku, menunggu barang | Tidak | Diterima Sebagian, Diterima, Dibatalkan |
partially_received | Diterima Sebagian | Sebagian barang sudah diterima | Tidak | Diterima |
received | Diterima | Semua barang sudah diterima | Tidak | Selesai |
closed | Selesai | Ditutup oleh PIC | Tidak | — |
cancelled | Dibatalkan | Dibatalkan sebelum ada penerimaan | Tidak | — |
9. Permissions & Actions
Permissions
Akses berbasis permission (bukan role tetap). Semua aksi ubah juga mensyaratkan toko aktif; pada toko tidak aktif, PO hanya bisa dilihat dan dicetak.
| Action | Permission | Syarat tambahan |
|---|---|---|
| Lihat daftar | purchase:purchase-order:list:any atau :list:store | — |
| Lihat detail | purchase:purchase-order:view:any atau :view:store | — |
| Buat PO | purchase:purchase-order:create:store | Toko aktif |
| Ubah Draf / tambah baris | purchase:purchase-order:update:store (+ create:store untuk tambah baris) | Toko aktif |
| Hapus Draf / hapus baris | purchase:purchase-order:delete:store | Toko aktif |
| Tetapkan PIC (dari daftar) | purchase:purchase-order:assign:store | Toko aktif |
| Ajukan | purchase:purchase-order:submit:store | Toko aktif, pengguna adalah PIC |
| Batalkan | purchase:purchase-order:cancel:store | Toko aktif, pengguna adalah PIC |
| Tutup | purchase:purchase-order:close:store | Toko aktif, pengguna adalah PIC |
FE menyembunyikan aksi yang tidak diizinkan dan menonaktifkan aksi jika pengguna bukan PIC; BE tetap menolaknya. Keduanya harus konsisten.
Actions by status (✓ tersedia)
| Action | Draf | Diajukan | Diterima Sebagian | Diterima | Selesai | Dibatalkan |
|---|---|---|---|---|---|---|
| Ubah header dan baris | ✓ | — | — | — | — | — |
| Tetapkan PIC | ✓ | — | — | — | — | — |
| Hapus | ✓ | — | — | — | — | — |
| Ajukan | ✓ | — | — | — | — | — |
| Batalkan | — | ✓ | — | — | — | — |
| Tutup | — | — | — | ✓ | — | — |
| Dirujuk Goods Receipt / Bill | — | ✓ | ✓ | ✓ | — | — |
| Cetak / pratinjau PDF | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Lihat log aktivitas | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
10. Business Rules
Aturan bisnis adalah ketentuan yang berlaku di semua layar dan semua aksi pada PO, siapa pun yang melakukannya. FE memakainya sebagai validasi di form, BE memakainya sebagai sumber kebenaran; jika keduanya berbeda, perilaku BE yang dianggap benar dan FE menyesuaikan.
- BR-01 PO milik satu toko dan dibuat pada toko aktif pengguna. Aksi ubah hanya bisa dilakukan saat toko aktif.
- BR-02 Ajukan, Batalkan, dan Tutup hanya boleh dilakukan oleh karyawan yang ditetapkan sebagai PIC PO tersebut, dan memiliki permission aksi terkait. Pembuat PO saja tidak cukup.
- BR-03 Hanya PO Draf yang bisa diubah, ditetapkan PIC-nya, dan dihapus. Setelah Diajukan, isi PO terkunci permanen.
- BR-04 Diskon baris dihitung bertingkat: semua diskon persen diterapkan berurutan terhadap sisa nilai, lalu semua diskon nominal dikurangkan.
- BR-05 Pajak baris dihitung dari nilai setelah diskon (persen), atau berupa nominal tetap. Total baris = neto + pajak; total PO = penjumlahan total baris.
- BR-06 Tanggal jatuh tempo: CBD/COD = tanggal estimasi diterima; EOM = akhir bulan tanggal pesanan; Net N = tanggal pesanan + N hari; Custom = diisi manual (wajib).
- BR-07 Tanggal estimasi diterima tidak boleh sebelum tanggal pesanan.
- BR-08 Qty baris minimal 0,01; harga satuan minimal 1.
- BR-09 Batalkan hanya dari status Diajukan dan wajib menyertakan alasan.
- BR-10 Status Diterima Sebagian dan Diterima ditetapkan otomatis oleh BE berdasarkan GR yang diajukan; tidak bisa diubah manual.
- BR-11 Tutup hanya dari status Diterima.
- BR-12 Goods Receipt dan Bill hanya bisa merujuk PO berstatus Diajukan, Diterima Sebagian, atau Diterima.
- BR-13 Semua perubahan dan transisi status dicatat di log aktivitas: aksi, pengguna, dan waktu.
11. Edge Cases
Edge case adalah kondisi yang jarang terjadi tetapi pasti muncul di operasional nyata, biasanya karena data berubah setelah PO dibuat atau karena dua hal terjadi bersamaan. Perilaku yang diharapkan ditetapkan di sini agar tidak diputuskan sendiri-sendiri saat implementasi.
| ID | Case | Expected behavior |
|---|---|---|
| EC-01 | PO Draf belum punya PIC | Tombol Ajukan nonaktif untuk semua pengguna sampai PIC ditetapkan |
| EC-02 | Pengguna bukan PIC membuka PO | Tombol aksi status tampil tetapi nonaktif |
| EC-03 | URL edit dibuka pada PO non-Draf | Tampil read-only dan diarahkan ke halaman detail |
| EC-04 | Toko aktif berstatus tidak aktif | Halaman tambah/ubah menampilkan halaman toko tidak aktif; di daftar dan detail semua aksi ubah disembunyikan |
| EC-05 | Supplier tidak akan mengirim sisa barang (PO Diterima Sebagian) | Belum ada aksi; PO tetap Diterima Sebagian karena Tutup hanya dari Diterima dan Batalkan hanya dari Diajukan |
| EC-06 | Barang diterima melebihi qty pesan | Diizinkan lewat GR; baris ditandai over-received di modul Item Pembelian (toleransi diatur di PRD Goods Receipt) |
| EC-07 | Supplier diganti setelah kontak dipilih | Kontak dikosongkan dan harus dipilih ulang |
| EC-08 | Tanggal pesanan diubah menjadi setelah tanggal estimasi | Pemilih tanggal estimasi hanya membatasi pilihan baru; BE harus menolak data yang melanggar BR-07 |
| EC-09 | Tipe pembayaran diganti dari Custom ke tipe lain | Tanggal jatuh tempo dihitung ulang otomatis dan field menjadi nonaktif |
| EC-10 | Pengguna tidak ditugaskan ke toko mana pun | Halaman PO menampilkan halaman toko belum ditetapkan |
| EC-11 | Produk yang sama dengan kemasan berbeda | Diperbolehkan; tiap kemasan adalah baris terpisah |
12. API Contract
Daftar endpoint per aksi. Detail request dan response ada di Postman (lihat metadata API).
| Action | Method | Endpoint | Ref |
|---|---|---|---|
| Daftar PO (filter, cari, paginasi) | GET | /api/purchase-orders/paginate | US-08 |
| Daftar PO ringkas (cursor, untuk combobox) | GET | /api/purchase-orders/cursor | BR-12 |
| Daftar PO per toko (untuk GR / Bill) | GET | /api/stores/:id/purchase-orders/cursor | BR-12 |
| Detail PO | GET | /api/purchase-orders/:id | US-02 |
| Buat PO (header + baris) | POST | /api/purchase-orders | US-01 |
| Ubah header PO Draf | PUT | /api/purchase-orders/:id | US-02 |
| Hapus PO Draf | DELETE | /api/purchase-orders/:id | US-09 |
| Hapus PO Draf massal | DELETE | /api/purchase-orders/bulk | US-09 |
| Daftar baris PO | GET | /api/purchase-orders/:id/items | US-02 |
| Detail baris PO | GET | /api/purchase-orders/:id/items/:item_id | US-02 |
| Tambah baris | POST | /api/purchase-orders/:id/items | US-02 |
| Ubah baris | PUT | /api/purchase-orders/:id/items/:item_id | US-02 |
| Hapus baris | DELETE | /api/purchase-orders/:id/items/:item_id | US-02 |
| Tetapkan PIC | PATCH | /api/purchase-orders/:id/assign | US-03 |
| Ajukan | PATCH | /api/purchase-orders/:id/submit | US-04 |
| Batalkan | PATCH | /api/purchase-orders/:id/cancel | US-05 |
| Tutup | PATCH | /api/purchase-orders/:id/close | US-07 |
| Log aktivitas semua PO | GET | /api/purchase-orders/activity-logs/cursor | US-11 |
| Log aktivitas satu PO | GET | /api/purchase-orders/:id/activity-logs/cursor | US-11 |
Lookup yang dipakai form PO
| Action | Method | Endpoint | Ref |
|---|---|---|---|
| Alamat pengiriman toko | GET | /api/stores/:id/addresses | AC-01.2 |
| Karyawan toko (PIC) | GET | /api/stores/:id/employees/cursor | US-03 |
| Inventaris produk toko (cari nama / barcode) | GET | /api/stores/:id/product-inventories/cursor | AC-01.6 |
| Supplier | GET | /api/suppliers/cursor | AC-01.3 |
| Kontak supplier | GET | /api/suppliers/:id/contacts | AC-01.3 |
13. Dependencies
PRD terkait
- Goods Receipt — penerimaan barang dari PO, yang mengubah status PO (BR-10) dan toleransi over-receive (EC-06).
- Bill — tagihan yang merujuk PO dan GR (BR-12).
- Item Pembelian (Purchase Order Lines) — tampilan qty dipesan, diterima, dan sisa per baris PO (AC-06.3).
Master data
- Toko — toko aktif, status aktif, alamat pengiriman, dan karyawan (PIC).
- Supplier — data supplier dan kontaknya.
- Produk & Inventaris Produk — kemasan/UoM, barcode, harga pokok, dan harga beli terakhir per toko.
Efek ke modul lain
- PO tidak mengubah stok; stok bertambah saat GR diajukan.
- PO yang Diajukan, Diterima Sebagian, atau Diterima muncul sebagai pilihan di form Goods Receipt dan Bill.
- Setiap perubahan tercatat di log aktivitas (BR-13).