Goods Receipt (Penerimaan Barang)
| Code | PUR-GR |
| Module | Purchasing |
| Type | Transaction document |
| Status | Implemented |
| Priority | P0 — MVP |
| Process | Procure-to-Pay, langkah 2 |
| API | [URL Postman] |
1. Overview
Goods Receipt (GR) adalah dokumen yang mencatat barang yang benar-benar diterima sebuah toko dari supplier. GR bisa dibuat dari Purchase Order (PO) yang sudah diajukan, atau tanpa PO untuk barang yang datang tanpa pesanan formal. Staf mencatat waktu penerimaan, alamat penerimaan, identitas pengirim, bukti penerimaan, dan per produk: qty dikirim, qty ditolak, serta qty diterima. GR ditetapkan penanggung jawabnya (PIC); hanya PIC yang bisa mengajukan dan membatalkan GR. GR yang sudah diajukan memperbarui status PO dan menjadi sumber baris tagihan (Bill). GR bisa dicetak sebagai PDF kapan saja.
Hasil yang diharapkan: setiap barang yang masuk ke toko tercatat sesuai jumlah yang sebenarnya diterima, selisih dengan pesanan terlihat, dan supplier hanya ditagihkan untuk barang yang layak diterima.
2. Problem
Di banyak toko retail, penerimaan barang hanya diperiksa sekilas, lalu surat jalan supplier disimpan tanpa dicatat di sistem. Akibatnya:
- Barang yang kurang kirim, rusak, atau salah kirim tidak tercatat, sehingga baru ketahuan saat stock opname atau saat tagihan dibayar.
- Tidak ada hubungan yang jelas antara pesanan, barang yang datang, dan tagihan; staf harus mencocokkannya secara manual.
- Tidak jelas siapa yang menerima barang dan kapan, sehingga selisih sulit ditelusuri.
- Toko membayar sesuai jumlah yang dikirim supplier, bukan jumlah yang benar-benar diterima.
3. Goals & Non-goals
Goals
- Penerimaan barang cepat dicatat saat barang datang. Indikator: GR dari PO terisi otomatis dari baris PO, staf cukup menyesuaikan qty.
- Barang yang ditolak tercatat terpisah dari barang yang diterima. Indikator: setiap baris punya qty dikirim, qty ditolak, dan qty diterima.
- Status PO mengikuti penerimaan. Indikator: status PO berubah menjadi Diterima Sebagian atau Diterima saat GR diajukan.
- GR menjadi sumber tagihan. Indikator: Bill dibuat dari GR yang diajukan, dengan qty mengikuti qty diterima.
Non-goals
- Quality control bertingkat atau inspeksi per batch (cukup qty ditolak)
- Pencatatan nomor batch, tanggal kedaluwarsa, atau serial number
- Retur barang ke supplier
- Penerimaan dari sumber selain supplier, misalnya transfer antar toko atau retur pelanggan (struktur data sudah menyiapkan
origin_type, tetapi belum dipakai) - Batas toleransi over-receive (lihat BR-11)
- Revisi GR setelah Diajukan (batalkan dan buat baru)
4. User Scenarios
| Role | Scenario |
|---|---|
| Staf Gudang | Truk supplier datang membawa pesanan; membuat GR dari PO, memeriksa barang, mencatat qty ditolak untuk barang yang rusak, lalu mengajukan GR |
| Staf Gudang | Supplier mengirim barang yang dipesan lewat telepon tanpa PO; membuat GR tanpa PO dengan memilih supplier secara manual |
| Kepala Toko | Menetapkan PIC pada GR Draf yang dibuat staf lain agar GR bisa diajukan |
| Staf Purchasing | Supplier hanya mengirim sebagian; setelah GR pertama diajukan, PO menjadi Diterima Sebagian, lalu GR berikutnya dibuat saat sisa barang datang |
| PIC | GR yang sudah diajukan ternyata salah catat; membatalkan GR dengan alasan, lalu membuat GR baru |
| Staf Finance | Membuat tagihan dari GR yang sudah diajukan (lihat PRD Bill) |
5. User Flow
Penjelasan tiap langkah pada diagram:
-
Isi wizard — Dari daftar GR, staf klik Tambah Baru. Wizard terdiri dari 3 langkah:
-
Umum: toko terisi otomatis dari toko aktif (read-only); alamat penerimaan terisi otomatis dari alamat pengiriman default toko. Switch Buat dari Pesanan Pembelian aktif secara default:
- Jika aktif, staf memilih PO (hanya PO toko aktif berstatus Diajukan, Diterima Sebagian, atau Diterima), dan supplier terisi otomatis dari PO (read-only).
- Jika nonaktif, pilihan PO dinonaktifkan dan staf memilih supplier secara manual.
Tanggal estimasi diterima tampil sebagai informasi (dari PO; tanpa PO berisi hari ini). Tanggal & waktu penerimaan default saat ini, dan penanggung jawab default pengguna yang sedang login. Staf juga bisa mengisi penanggung jawab pengirim, nomor polisi kendaraan pengirim, bukti penerimaan (gambar atau dokumen, bisa lebih dari satu), dan catatan.
-
Produk: jika GR dibuat dari PO, daftar produk terisi otomatis dari semua baris PO dengan qty dikirim sama dengan qty pesan. Staf menyesuaikan qty, serta menambah, mengubah, atau menghapus baris lewat dialog: cari produk berdasarkan nama atau barcode (satu pilihan per kemasan/UoM), isi qty dikirim dan qty ditolak. Qty diterima dihitung otomatis.
-
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 — GR tersimpan dengan status Draf, dan staf diarahkan ke daftar GR. Draf bisa diubah (header dan baris), ditetapkan PIC-nya, atau dihapus. Stok belum berubah.
-
Diajukan — PIC klik Ajukan Penerimaan dan mengonfirmasi. GR tidak dapat diubah lagi; tercatat siapa dan kapan mengajukan. Stok toko bertambah sebesar qty diterima, dan GR kini bisa dirujuk oleh Bill.
-
Status PO diperbarui — Jika GR merujuk PO, BE membandingkan akumulasi qty diterima dari semua GR yang diajukan dengan qty pesan tiap baris, lalu mengubah status PO menjadi Diterima Sebagian atau Diterima (lihat PRD Purchase Order).
-
Bill — Staf membuat tagihan yang merujuk GR ini. Proses penagihan dijelaskan di PRD Bill.
-
Selesai — Saat Bill dibuat dari GR ini, BE mengubah status GR menjadi Selesai. GR tidak bisa dipilih lagi untuk Bill lain dan tidak bisa dibatalkan.
-
Dibatalkan — PIC klik Batalkan Penerimaan pada GR Diajukan dan wajib mengisi alasan.
Alternative paths
Jalur alternatif adalah kejadian di luar alur normal di atas, misalnya pengguna berubah pikiran, barang yang datang tidak sesuai, atau data berubah. Setiap jalur ini harus punya perilaku yang jelas agar FE dan BE tidak menebak:
- Perubahan setelah Diajukan — tidak bisa. Batalkan (selama belum dibuat Bill) lalu buat GR baru.
- GR 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 dan Batalkan tampil tetapi nonaktif.
- Barang datang tanpa PO — nonaktifkan switch Buat dari Pesanan Pembelian, lalu pilih supplier secara manual.
- Barang rusak atau tidak sesuai — isi qty ditolak; hanya qty diterima yang menambah stok dan ditagihkan di Bill.
- GR Draf tidak jadi dipakai — hapus (satuan atau massal). Draf tidak dibatalkan, tetapi dihapus.
- Toko tidak aktif — GR 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 GR dari PO (P0)
Sebagai staf gudang, saya ingin membuat penerimaan barang dari PO, agar barang yang datang langsung dicocokkan dengan pesanan.
| 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), tanggal & waktu penerimaan saat ini, dan penanggung jawab berisi pengguna yang login (jika terdaftar sebagai karyawan). |
| AC-01.2 | Alamat penerimaan terisi otomatis dengan alamat pengiriman default toko; jika tidak ada, alamat pertama toko. |
| AC-01.3 | Switch Buat dari Pesanan Pembelian aktif secara default. Pilihan PO hanya berisi PO toko aktif berstatus Diajukan, Diterima Sebagian, atau Diterima, dengan label nomor PO dan keterangan tanggal pesanan. |
| AC-01.4 | Saat PO dipilih, supplier terisi otomatis dari PO (read-only) dan tanggal estimasi diterima tampil dari PO. |
| AC-01.5 | Saat PO dipilih dan daftar produk masih kosong, daftar produk terisi otomatis dari semua baris PO: produk dan kemasan, qty pesan, qty dikirim sama dengan qty pesan, dan qty ditolak 0. Baris yang sudah ada tidak ditimpa. |
| AC-01.6 | Saat switch diubah, pilihan PO dan supplier dikosongkan. |
| AC-01.7 | Saat Selanjutnya diklik dan field wajib di langkah itu kosong, pengguna tidak bisa pindah langkah dan error tampil di field terkait. |
| AC-01.8 | Saat Simpan berhasil, GR tersimpan berstatus Draf, toast sukses tampil, dan pengguna diarahkan ke daftar GR. |
| AC-01.9 | Saat BE menolak penyimpanan, pesan error tampil di langkah Tinjauan dan pada field terkait. |
| AC-01.10 | Saat pengguna meninggalkan wizard dengan isian yang belum disimpan, muncul konfirmasi perubahan belum disimpan. |
US-02 — Membuat GR tanpa PO (P0)
Sebagai staf gudang, saya ingin mencatat barang yang datang tanpa PO, agar semua barang masuk tetap tercatat.
| ID | Kriteria penerimaan |
|---|---|
| AC-02.1 | Saat switch Buat dari Pesanan Pembelian dinonaktifkan, pilihan PO nonaktif dan supplier wajib dipilih dari master Supplier. Supplier nonaktif tampil tetapi tidak bisa dipilih. |
| AC-02.2 | Produk ditambahkan manual lewat dialog; baris tidak tertaut ke PO dan qty pesan kosong. |
| AC-02.3 | Tanggal estimasi diterima menampilkan tanggal hari ini sebagai informasi (tidak disimpan). |
US-03 — Mencatat qty per produk (P0)
Sebagai staf gudang, saya ingin mencatat qty dikirim dan qty ditolak per produk, agar hanya barang yang layak yang dianggap diterima.
| ID | Kriteria penerimaan |
|---|---|
| AC-03.1 | Dialog produk menyediakan pencarian berdasarkan nama atau barcode (pilihan mode pencarian). Setiap kemasan produk tampil sebagai pilihan terpisah dengan label [UoM] nama produk dan keterangan [SKU] Barcode: .... Produk nonaktif tampil tetapi tidak bisa dipilih. |
| AC-03.2 | Saat produk dipilih, UoM terisi dari kemasan terpilih. Jika produk tersebut ada di PO yang dipilih, baris ditautkan ke baris PO dan qty pesan tampil (read-only). |
| AC-03.3 | Qty dikirim wajib diisi, minimal 0,01, dengan default 1. Qty ditolak minimal 0, dengan default 0. |
| AC-03.4 | Qty diterima dihitung otomatis sebagai qty dikirim dikurangi qty ditolak, tidak pernah negatif, dan read-only. |
| AC-03.5 | Tombol simpan pada dialog nonaktif sampai ada perubahan isian. |
US-04 — Mengubah GR Draf (P0)
Sebagai staf gudang, saya ingin mengubah GR yang masih Draf, agar kesalahan bisa diperbaiki sebelum diajukan.
| ID | Kriteria penerimaan |
|---|---|
| AC-04.1 | Tombol Ubah Data hanya tampil pada GR Draf untuk pengguna dengan izin update di toko aktif. |
| AC-04.2 | Tab Umum disimpan sekaligus: alamat penerimaan, sumber penerimaan dan PO, tanggal & waktu penerimaan, penanggung jawab, penanggung jawab pengirim, nomor polisi kendaraan, bukti penerimaan, dan catatan. Toko dan supplier tampil read-only. |
| AC-04.3 | Saat switch Buat dari Pesanan Pembelian dinonaktifkan dan disimpan, tautan GR ke PO dilepas. |
| AC-04.4 | Baris di tab Produk ditambah, diubah, dan dihapus satu per satu, dan langsung tersimpan. |
| AC-04.5 | Saat URL edit dibuka pada GR yang bukan Draf, halaman kembali ke tampilan detail read-only. |
| AC-04.6 | Tab yang sedang dibuka tetap sama saat berpindah dari detail ke edit. |
US-05 — Menetapkan penanggung jawab (P0)
Sebagai kepala toko, saya ingin menetapkan PIC pada GR, agar jelas siapa yang berwenang mengajukan dan membatalkan GR.
| ID | Kriteria penerimaan |
|---|---|
| AC-05.1 | PIC bisa dipilih lebih dari satu dari daftar karyawan toko, saat membuat GR, saat mengubah Draf, atau lewat tombol tambah di kolom Penanggung Jawab pada daftar. |
| AC-05.2 | Tombol tambah PIC di daftar hanya tampil pada GR Draf untuk pengguna dengan izin assign di toko aktif. Dialog tetapkan PIC mewajibkan minimal satu karyawan. |
US-06 — Mengajukan GR (P0)
Sebagai PIC, saya ingin mengajukan GR, agar penerimaan barang berlaku, stok bertambah, dan status PO diperbarui.
| ID | Kriteria penerimaan |
|---|---|
| AC-06.1 | Tombol Ajukan Penerimaan tampil pada GR Draf untuk pengguna dengan izin submit, dan hanya aktif jika pengguna adalah PIC GR tersebut. |
| AC-06.2 | Setelah konfirmasi, status menjadi Diajukan, serta tercatat siapa dan kapan mengajukan. |
| AC-06.3 | Jika GR merujuk PO, status PO diperbarui otomatis sesuai BR-10. |
| AC-06.4 | Pada GR Diajukan, tombol Ubah Data dan aksi baris tidak tampil. |
US-07 — Membatalkan GR (P0)
Sebagai PIC, saya ingin membatalkan GR yang salah catat, agar penerimaan tersebut tidak dihitung.
| ID | Kriteria penerimaan |
|---|---|
| AC-07.1 | Tombol Batalkan Penerimaan tampil pada GR Diajukan untuk pengguna dengan izin cancel, dan hanya aktif jika pengguna adalah PIC. |
| AC-07.2 | Dialog pembatalan mewajibkan alasan; tombol konfirmasi nonaktif selama alasan kosong. |
| AC-07.3 | Setelah dibatalkan, status menjadi Dibatalkan; alasan, siapa, dan kapan tersimpan. Stepper status menampilkan jalur Draf → Diajukan → Dibatalkan. |
US-08 — Daftar dan pencarian GR (P0)
Sebagai owner, saya ingin melihat dan menyaring GR, agar cepat menemukan penerimaan barang tertentu.
| ID | Kriteria penerimaan |
|---|---|
| AC-08.1 | Default menampilkan GR toko aktif; filter lanjutan: toko, rentang tanggal penerimaan, supplier, dan status; pencarian dengan kata kunci. |
| AC-08.2 | Kolom: nomor penerimaan, toko, nomor PO, tanggal pesanan, tanggal & waktu penerimaan, penanggung jawab, supplier, dibuat oleh, dan status. |
| AC-08.3 | Urutan default tanggal & waktu penerimaan terbaru di atas, dengan paginasi. Kolom yang bisa diurutkan: nomor penerimaan dan tanggal & waktu penerimaan. |
| AC-08.4 | Baris bisa diperluas untuk melihat daftar produk GR tanpa membuka detail. |
| AC-08.5 | Aksi baris: Cetak, Lihat, Ubah (hanya Draf), Hapus (hanya Draf), sesuai izin. |
US-09 — Menghapus GR Draf (P0)
Sebagai staf gudang, saya ingin menghapus Draf yang tidak jadi dipakai, agar daftar tetap bersih.
| ID | Kriteria penerimaan |
|---|---|
| AC-09.1 | Aksi Hapus hanya tersedia pada GR 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 GR (P1)
Sebagai staf gudang, saya ingin mencetak GR sebagai PDF, agar bisa ditandatangani sebagai bukti serah terima barang.
| ID | Kriteria penerimaan |
|---|---|
| AC-10.1 | Pratinjau PDF tersedia dari wizard buat GR, halaman detail/edit, dan aksi Cetak di daftar, pada status apa pun. |
| AC-10.2 | Saat mengedit Draf, pratinjau PDF memakai isian tab Umum terbaru yang belum disimpan. |
| AC-10.3 | Sebelum GR disimpan, nomor GR di PDF tampil kosong (”-”). |
| AC-10.4 | PDF GR berstatus Draf dan Dibatalkan diberi watermark status. |
| AC-10.5 | PDF memuat kolom tanda tangan penanggung jawab (PIC pertama). |
US-11 — Riwayat aktivitas (P1)
Sebagai owner, saya ingin melihat log aktivitas GR, agar tahu siapa mengubah apa dan kapan.
| ID | Kriteria penerimaan |
|---|---|
| AC-11.1 | Log aktivitas tersedia per GR (di detail) dan untuk seluruh GR (di daftar). |
7. Document Structure
Header
| Field | Required | Default | Notes |
|---|---|---|---|
| Nomor GR | Otomatis | Dibuat BE | Kosong di pratinjau sebelum disimpan |
| Toko | Ya | Toko aktif | Read-only; tidak bisa diubah setelah dibuat |
| Alamat penerimaan | Ya | Alamat pengiriman default toko | Dari alamat toko |
| Sumber penerimaan | Ya | Dari PO | Switch di UI, tidak disimpan; menentukan PO atau supplier yang wajib diisi |
| Pesanan pembelian (PO) | Wajib jika dari PO | — | PO toko aktif berstatus Diajukan, Diterima Sebagian, atau Diterima (BR-04) |
| Supplier | Wajib jika tanpa PO | Supplier PO | Tidak bisa diubah setelah dibuat (BR-06) |
| Tanggal estimasi diterima | — | Dari PO, atau hari ini | Informasi saja, tidak disimpan |
| Tanggal & waktu penerimaan | Ya | Saat ini | |
| Penanggung jawab (PIC) | Tidak | Pengguna yang login | Multi-pilih dari karyawan toko; wajib sebelum Ajukan (BR-02) |
| Penanggung jawab pengirim | Tidak | — | Nama sopir atau kurir supplier |
| Nomor polisi kendaraan pengirim | Tidak | — | |
| Bukti penerimaan | Tidak | — | Gambar atau dokumen, bisa lebih dari satu (mis. foto surat jalan) |
| Catatan | Tidak | — | Tampil di PDF |
| Status | Otomatis | Draf | Lihat bagian 8 |
Lines
| Field | Required | Default | Notes |
|---|---|---|---|
| Urutan | Otomatis | Urutan ditambahkan | |
| Produk + kemasan | Ya | Dari baris PO (jika dari PO) | Dari inventaris produk toko; satu pilihan per kemasan; cari nama atau barcode |
| Baris PO | Otomatis | Baris PO dengan produk yang sama | Kosong jika tanpa PO atau produk tidak ada di PO (BR-08) |
| UoM | Otomatis | UoM kemasan terpilih | |
| Qty pesan | Otomatis | Qty baris PO | Read-only; kosong jika tidak tertaut PO |
| Qty dikirim | Ya | Qty pesan (dari PO), atau 1 | Minimal 0,01 |
| Qty ditolak | Tidak | 0 | Minimal 0 |
| Qty diterima | Otomatis | — | Qty dikirim − qty ditolak, minimal 0 (BR-07) |
Totals: GR tidak memuat harga; nilai uang dicatat di Bill. Jejak yang disimpan: dibuat / diajukan / dibatalkan (dengan alasan) oleh siapa dan kapan, serta Bill yang merujuk GR ini.
8. Status Lifecycle
| Status | Label UI | Meaning | Editable | Next status |
|---|---|---|---|---|
draft | Draf | Sedang disusun, belum berlaku; stok belum berubah | Semua field dan baris, kecuali toko dan supplier | Diajukan, atau dihapus |
submitted | Diajukan | Berlaku; stok bertambah dan bisa dirujuk Bill | Tidak | Selesai, Dibatalkan |
closed | Selesai | Sudah dirujuk Bill | Tidak | — |
cancelled | Dibatalkan | Dibatalkan sebelum dirujuk Bill | Tidak | — |
9. Permissions & Actions
Permissions
Akses berbasis permission (bukan role tetap). Semua aksi ubah juga mensyaratkan toko aktif; pada toko tidak aktif, GR hanya bisa dilihat dan dicetak.
| Action | Permission | Syarat tambahan |
|---|---|---|
| Lihat daftar | purchase:goods-receipt:list:any atau :list:store | — |
| Lihat detail | purchase:goods-receipt:view:any atau :view:store | — |
| Buat GR | purchase:goods-receipt:create:store | Toko aktif |
| Ubah Draf / tambah baris | purchase:goods-receipt:update:store (+ create:store untuk tambah baris) | Toko aktif |
| Hapus Draf / hapus baris | purchase:goods-receipt:delete:store | Toko aktif |
| Tetapkan PIC (dari daftar) | purchase:goods-receipt:assign:store | Toko aktif |
| Ajukan | purchase:goods-receipt:submit:store | Toko aktif, pengguna adalah PIC |
| Batalkan | purchase:goods-receipt:cancel: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 | Selesai | Dibatalkan |
|---|---|---|---|---|
| Ubah header dan baris | ✓ | — | — | — |
| Tetapkan PIC | ✓ | — | — | — |
| Hapus | ✓ | — | — | — |
| Ajukan | ✓ | — | — | — |
| Batalkan | — | ✓ | — | — |
| Dirujuk Bill | — | ✓ | — | — |
| Cetak / pratinjau PDF | ✓ | ✓ | ✓ | ✓ |
| Lihat log aktivitas | ✓ | ✓ | ✓ | ✓ |
10. Business Rules
Aturan bisnis adalah ketentuan yang berlaku di semua layar dan semua aksi pada GR, 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 GR milik satu toko dan dibuat pada toko aktif pengguna. Aksi ubah hanya bisa dilakukan saat toko aktif.
- BR-02 Ajukan dan Batalkan hanya boleh dilakukan oleh karyawan yang ditetapkan sebagai PIC GR tersebut, dan memiliki permission aksi terkait. Pembuat GR saja tidak cukup.
- BR-03 Hanya GR Draf yang bisa diubah, ditetapkan PIC-nya, dan dihapus. Setelah Diajukan, isi GR terkunci permanen.
- BR-04 GR dari PO hanya bisa merujuk PO toko yang sama dengan status Diajukan, Diterima Sebagian, atau Diterima. Toko dan supplier GR mengikuti PO, sehingga
store_iddansupplier_idtidak dikirim FE. - BR-05 GR tanpa PO wajib memilih supplier yang aktif.
- BR-06 Toko dan supplier tidak bisa diubah setelah GR dibuat. Tautan ke PO masih bisa diganti atau dilepas selama Draf.
- BR-07 Qty dikirim minimal 0,01 dan qty ditolak minimal 0. Qty diterima = qty dikirim − qty ditolak, dan tidak pernah negatif.
- BR-08 Baris yang produknya ada di PO ditautkan ke baris PO tersebut, dan qty pesan diambil dari baris PO. Produk yang tidak ada di PO tetap boleh ditambahkan tanpa tautan.
- BR-09 Stok toko bertambah saat GR diajukan, sebesar qty diterima. GR Draf tidak mengubah stok.
- BR-10 Saat GR yang merujuk PO diajukan, BE memperbarui status PO berdasarkan akumulasi qty diterima dari semua GR yang diajukan: sebagian terpenuhi menjadi Diterima Sebagian, seluruh baris terpenuhi menjadi Diterima.
- BR-11 Qty dikirim tidak dibatasi oleh qty pesan atau sisa qty. Kelebihan penerimaan diizinkan dan terlihat di modul Item Pembelian; belum ada batas toleransi.
- BR-12 Batalkan hanya dari status Diajukan dan wajib menyertakan alasan. GR yang sudah Selesai tidak bisa dibatalkan.
- BR-13 Hanya GR berstatus Diajukan yang bisa dipilih di Bill. Satu GR hanya bisa dirujuk oleh satu Bill, dan statusnya menjadi Selesai saat Bill dibuat.
- BR-14 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 GR dibuat atau karena dua hal terjadi bersamaan. Perilaku yang diharapkan ditetapkan di sini agar tidak diputuskan sendiri-sendiri saat implementasi. Baris bertanda Perlu konfirmasi BE belum terlihat perilakunya dari FE dan perlu disepakati.
| ID | Case | Expected behavior |
|---|---|---|
| EC-01 | GR Draf belum punya PIC | Tombol Ajukan nonaktif untuk semua pengguna sampai PIC ditetapkan |
| EC-02 | Pengguna bukan PIC membuka GR | Tombol Ajukan dan Batalkan tampil tetapi nonaktif |
| EC-03 | URL edit dibuka pada GR 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 | Pengguna tidak ditugaskan ke toko mana pun | Halaman GR menampilkan halaman toko belum ditetapkan |
| EC-06 | GR kedua untuk PO Diterima Sebagian | Daftar produk terisi dengan qty dikirim sebesar qty pesan penuh, bukan sisa qty; staf menyesuaikan sesuai barang yang datang. Sisa qty per baris bisa dilihat di modul Item Pembelian |
| EC-07 | Barang diterima melebihi qty pesan | Diizinkan (BR-11); baris PO ditandai over-received di modul Item Pembelian |
| EC-08 | Qty ditolak lebih besar dari qty dikirim | FE menampilkan qty diterima 0. Perlu konfirmasi BE: data seperti ini sebaiknya ditolak |
| EC-09 | Produk yang tidak ada di PO ditambahkan ke GR dari PO | Diizinkan; baris tidak tertaut ke PO dan qty pesan kosong |
| EC-10 | Produk yang sama dengan kemasan berbeda | Tiap kemasan adalah baris terpisah. Tautan ke baris PO dicocokkan berdasarkan produk, sehingga kemasan lain dari produk yang sama ikut tertaut ke baris PO pertama dengan produk tersebut |
| EC-11 | Switch sumber penerimaan diubah saat membuat GR | PO dan supplier dikosongkan; baris produk yang sudah ada tidak ikut dihapus |
| EC-12 | Tautan PO diganti saat mengubah Draf | Baris produk yang sudah ada tidak ikut diganti. Baris baru yang ditambahkan dari tab Produk tidak otomatis ditautkan ke baris PO; staf perlu memeriksa ulang daftar produk |
| EC-13 | GR disimpan sebagai Draf tanpa baris produk | Diizinkan saat simpan Draf. Perlu konfirmasi BE: Ajukan sebaiknya ditolak jika GR belum punya baris |
| EC-14 | GR Diajukan dibatalkan | Perlu konfirmasi BE: penambahan stok dibalik dan status PO dihitung ulang tanpa GR ini |
| EC-15 | Bill Draf yang merujuk GR dihapus | Perlu konfirmasi BE: GR kembali berstatus Diajukan agar bisa ditagihkan lagi |
12. API Contract
Daftar endpoint per aksi. Detail request dan response ada di Postman (lihat metadata API).
| Action | Method | Endpoint | Ref |
|---|---|---|---|
| Daftar GR (filter, cari, paginasi) | GET | /api/goods-receipts/paginate | US-08 |
| Daftar GR ringkas (cursor) | GET | /api/goods-receipts/cursor | — |
| Daftar GR per toko (untuk Bill) | GET | /api/stores/:id/goods-receipts/cursor | BR-13 |
| Detail GR | GET | /api/goods-receipts/:id | US-04 |
| Buat GR (header + baris) | POST | /api/goods-receipts | US-01, US-02 |
| Ubah header GR Draf | PUT | /api/goods-receipts/:id | US-04 |
| Hapus GR Draf | DELETE | /api/goods-receipts/:id | US-09 |
| Hapus GR Draf massal | DELETE | /api/goods-receipts/bulk | US-09 |
| Daftar baris GR | GET | /api/goods-receipts/:id/items | US-04 |
| Detail baris GR | GET | /api/goods-receipts/:id/items/:item_id | US-04 |
| Tambah baris | POST | /api/goods-receipts/:id/items | US-04 |
| Ubah baris | PUT | /api/goods-receipts/:id/items/:item_id | US-04 |
| Hapus baris | DELETE | /api/goods-receipts/:id/items/:item_id | US-04 |
| Tetapkan PIC | PATCH | /api/goods-receipts/:id/assign | US-05 |
| Ajukan | PATCH | /api/goods-receipts/:id/submit | US-06 |
| Batalkan | PATCH | /api/goods-receipts/:id/cancel | US-07 |
| Log aktivitas semua GR | GET | /api/goods-receipts/activity-logs/cursor | US-11 |
| Log aktivitas satu GR | GET | /api/goods-receipts/:id/activity-logs/cursor | US-11 |
Lookup yang dipakai form GR
| Action | Method | Endpoint | Ref |
|---|---|---|---|
| Alamat toko (alamat penerimaan) | GET | /api/stores/:id/addresses | AC-01.2 |
| PO per toko (filter status) | GET | /api/stores/:id/purchase-orders/cursor | AC-01.3 |
| Supplier (tanpa PO) | GET | /api/suppliers/cursor | AC-02.1 |
| Karyawan toko (PIC) | GET | /api/stores/:id/employees/cursor | US-05 |
| Inventaris produk toko (cari nama / barcode) | GET | /api/stores/:id/product-inventories/cursor | AC-03.1 |
13. Dependencies
PRD terkait
- Purchase Order — PO yang dirujuk GR; status PO berubah saat GR diajukan (BR-10).
- Bill — tagihan yang dibuat dari GR Diajukan; GR menjadi Selesai saat dirujuk (BR-13).
- Item Pembelian (Purchase Order Lines) — qty dipesan, diterima, sisa, dan over-received per baris PO (EC-06, EC-07).
Master data
- Toko — toko aktif, status aktif, alamat, dan karyawan (PIC).
- Supplier — supplier untuk GR tanpa PO, beserta status aktifnya.
- Produk & Inventaris Produk — kemasan/UoM, barcode, dan status aktif per toko.
Efek ke modul lain
- Inventory — stok toko bertambah sebesar qty diterima saat GR diajukan (BR-09).
- Purchase Order — status Diterima Sebagian / Diterima ditetapkan dari GR yang diajukan (BR-10).
- Bill — hanya GR Diajukan yang muncul sebagai pilihan di form Bill (BR-13).
- Setiap perubahan tercatat di log aktivitas (BR-14).