Skip to Content

Bill (Penagihan)

CodePUR-BIL
ModulePurchasing
TypeTransaction document
StatusImplemented
PriorityP0 — MVP
ProcessProcure-to-Pay, langkah 3
API[URL Postman]

1. Overview

Bill adalah dokumen tagihan supplier yang dicatat toko berdasarkan barang yang sudah diterima melalui Goods Receipt (GR). Satu Bill berlaku untuk satu supplier dan bisa menggabungkan beberapa GR, baik yang berasal dari Purchase Order (PO) maupun yang dibuat tanpa PO. Baris Bill dibentuk otomatis dari baris GR dengan qty sama dengan qty diterima; staf hanya menyesuaikan harga, diskon, dan pajak per baris, serta diskon dan pajak general untuk seluruh tagihan. Bill ditetapkan penanggung jawabnya (PIC); hanya PIC yang bisa mengajukan Bill. Setelah diajukan, pembayaran ke supplier dicatat di Bill, sekaligus atau bertahap, sampai lunas.

Hasil yang diharapkan: owner tahu berapa utang ke setiap supplier, kapan jatuh temponya, dan berapa yang sudah maupun belum dibayar, sementara toko hanya membayar barang yang benar-benar diterima.

2. Problem

Tagihan supplier di retail kecil dan menengah biasanya dibayar berdasarkan nota supplier tanpa dicocokkan dengan barang yang diterima. Akibatnya:

  • Toko ikut membayar barang yang kurang kirim atau ditolak saat penerimaan.
  • Harga di nota yang berbeda dari harga yang disepakati di PO tidak terdeteksi.
  • Total utang ke supplier dan jatuh temponya tidak terpantau, sehingga pembayaran terlambat atau justru dibayar dua kali.
  • Pembayaran bertahap tidak tercatat rapi, sehingga sisa tagihan harus dihitung ulang secara manual.

3. Goals & Non-goals

Goals

  • Tagihan hanya untuk barang yang diterima. Indikator: setiap baris Bill berasal dari baris GR, dengan qty sama dengan qty diterima dan tidak bisa diubah.
  • Tagihan cepat dibuat. Indikator: harga, diskon, dan pajak baris terisi otomatis dari PO jika GR berasal dari PO.
  • Satu tagihan bisa mencakup beberapa pengiriman. Indikator: satu Bill bisa merujuk beberapa GR dari supplier yang sama.
  • Sisa utang selalu terpantau. Indikator: total tagihan, total sudah dibayar, dan total belum dibayar tampil di daftar dan detail, dan status berubah otomatis mengikuti pembayaran.

Non-goals

  • Pembatalan atau revisi Bill setelah Diajukan (belum ada alur batal; lihat EC-13)
  • Cetak / unduh PDF Bill
  • Menambah baris di luar GR, menghapus baris, atau mengubah qty
  • Pembayaran di muka (down payment) sebelum Bill dibuat
  • Nota debit / kredit dan retur ke supplier
  • Multi-currency
  • Jurnal akuntansi otomatis ke modul Finance

4. User Scenarios

RoleScenario
Staf FinanceSupplier mengirim nota bulanan; membuat satu Bill yang menggabungkan semua GR bulan itu dari supplier tersebut, termasuk GR tanpa PO
Staf FinanceHarga di nota supplier berbeda dari harga PO; menyesuaikan harga baris sebelum mengajukan Bill
Staf FinanceSupplier memberi potongan untuk seluruh tagihan; mengisi diskon general
Kepala TokoMenetapkan PIC pada Bill Draf yang dibuat staf lain agar Bill bisa diajukan
OwnerMembayar sebagian tagihan lebih dulu karena arus kas, lalu melunasi sisanya pada minggu berikutnya
OwnerMemantau tagihan yang belum lunas dan mendekati jatuh tempo, per supplier dan per PIC

5. User Flow

Penjelasan tiap langkah pada diagram:

  1. Isi wizard — Dari daftar Bill, staf klik Tambah Baru. Wizard terdiri dari 3 langkah:
    • Umum:
      • Toko terisi otomatis dari toko aktif (read-only).
      • Staf memilih satu atau lebih Pesanan Pembelian (PO toko aktif berstatus Diajukan, Diterima Sebagian, atau Diterima), dan/atau opsi Tanpa Pesanan Pembelian. Pilihan ini hanya menyaring GR yang bisa dipilih.
      • Setelah itu staf memilih satu atau lebih Penerimaan Barang: GR toko aktif berstatus Diajukan yang merujuk PO terpilih, ditambah GR tanpa PO jika opsi Tanpa Pesanan Pembelian dipilih.
      • Supplier terisi otomatis dan terkunci dari PO pertama yang dipilih (atau dari GR pertama jika tidak ada PO). PO dan GR milik supplier lain tetap tampil tetapi tidak bisa dipilih.
      • Alamat penagihan diambil dari alamat supplier, dengan default alamat penagihan default supplier atau alamat pertamanya.
      • Tanggal penagihan default hari ini. Staf memilih tipe pembayaran, lalu tanggal jatuh tempo dihitung otomatis (BR-13); pada tipe Custom, tanggal jatuh tempo diisi manual.
      • Penanggung jawab default pengguna yang sedang login. Staf juga bisa melampirkan bukti penagihan (mis. foto nota supplier) dan mengisi catatan.
    • Produk: baris dibentuk otomatis 1:1 dari semua baris GR yang dipilih, dan dibentuk ulang setiap kali pilihan GR berubah. Setiap baris menampilkan nomor GR, produk, qty (sama dengan qty diterima, read-only), dan UoM. Jika baris GR tertaut ke baris PO, harga, diskon, dan pajak terisi dari baris PO. Staf mengubah harga, diskon, dan pajak per baris lewat dialog Ubah Produk, serta diskon dan pajak untuk seluruh tagihan lewat Atur Diskon/Pajak General. Kartu perhitungan menampilkan total harga kotor, diskon item, diskon general, total harga bersih, pajak item, pajak general, dan grand total.
    • Tinjauan: ringkasan seluruh isian sebelum disimpan.
  2. Data valid? — Validasi per langkah saat klik Selanjutnya, dan validasi BE saat Simpan. Error BE ditampilkan di langkah Tinjauan dan pada field terkait.
  3. Draf — Bill tersimpan dengan status Draf, dan staf diarahkan ke daftar Bill. GR yang dirujuk berstatus Selesai sehingga tidak bisa dipilih lagi untuk Bill lain. Draf bisa diubah (informasi umum, harga/diskon/pajak baris, serta diskon/pajak general), ditetapkan PIC-nya, atau dihapus.
  4. Diajukan — PIC klik Ajukan Penagihan dan mengonfirmasi. Isi Bill tidak dapat diubah lagi; tercatat siapa dan kapan mengajukan. Tab Pembayaran kini aktif.
  5. Catat pembayaran — Di tab Pembayaran, pengguna klik Tambah Pembayaran dan mengisi metode pembayaran, tanggal & waktu pembayaran (default saat ini), jumlah, penanggung jawab pembayaran (default pengguna yang login), bukti pembayaran, dan catatan. Ringkasan di atas daftar menampilkan total tagihan, total sudah dibayar, dan total belum dibayar.
  6. Sisa tagihan = 0? — Setelah pembayaran disimpan atau dihapus, BE menghitung ulang total sudah dibayar dan sisa tagihan.
  7. Dibayar Sebagian — Masih ada sisa tagihan; pembayaran berikutnya kembali ke langkah 5.
  8. Lunas — Sisa tagihan nol. Pembayaran tidak bisa ditambah atau dihapus lagi.

Alternative paths

Jalur alternatif adalah kejadian di luar alur normal di atas, misalnya pengguna berubah pikiran, nota supplier berbeda dari pesanan, atau salah catat pembayaran. Setiap jalur ini harus punya perilaku yang jelas agar FE dan BE tidak menebak:

  • Perubahan setelah Diajukan — tidak bisa, dan belum ada alur batal (lihat EC-13).
  • Bill 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 tampil tetapi nonaktif.
  • GR dari supplier berbeda — tidak bisa digabung dalam satu Bill; buat Bill terpisah per supplier.
  • Harga di nota berbeda dari PO — ubah harga baris selama Bill masih Draf.
  • Salah catat pembayaran — hapus pembayaran tersebut selama Bill belum Lunas, lalu catat ulang.
  • Bill Draf tidak jadi dipakai — hapus (satuan atau massal).
  • Toko tidak aktif — Bill hanya bisa dilihat; semua aksi ubah dan pembayaran disembunyikan.

6. User Stories

Prioritas: P0 wajib untuk rilis, P1 penting, P2 kalau sempat.

US-01 — Membuat Bill dari GR (P0)

Sebagai staf finance, saya ingin membuat tagihan dari satu atau beberapa GR, agar tagihan supplier sesuai dengan barang yang diterima.

IDKriteria penerimaan
AC-01.1Saat pengguna dengan izin create membuka Tambah Baru di toko aktif, wizard Umum → Produk → Tinjauan tampil dengan toko aktif terisi (read-only), tanggal penagihan hari ini, dan penanggung jawab berisi pengguna yang login (jika terdaftar sebagai karyawan).
AC-01.2Pilihan Pesanan Pembelian bisa lebih dari satu. Opsi Tanpa Pesanan Pembelian selalu tampil paling atas, diikuti PO toko aktif berstatus Diajukan, Diterima Sebagian, atau Diterima, dengan label nomor PO dan keterangan tanggal pesanan.
AC-01.3Pilihan Penerimaan Barang nonaktif sampai minimal satu Pesanan Pembelian (atau opsi Tanpa Pesanan Pembelian) dipilih. Pilihannya hanya GR toko aktif berstatus Diajukan yang merujuk PO terpilih, ditambah GR tanpa PO jika opsi Tanpa Pesanan Pembelian dipilih. Label berisi nomor GR dan keterangan nomor PO (atau tanggal GR jika tanpa PO).
AC-01.4Supplier terisi otomatis dari PO pertama yang dipilih, atau dari GR pertama jika tidak ada PO yang dipilih, dan tidak bisa diubah manual. PO dan GR milik supplier lain tetap tampil tetapi tidak bisa dipilih.
AC-01.5Alamat penagihan nonaktif sampai supplier diketahui. Pilihannya adalah alamat supplier, dengan default alamat penagihan default supplier; jika tidak ada, alamat pertama supplier.
AC-01.6Saat tipe pembayaran atau tanggal penagihan berubah, tanggal jatuh tempo dihitung ulang sesuai BR-13. Pada tipe Custom, tanggal jatuh tempo wajib diisi manual.
AC-01.7Setiap kali pilihan GR berubah, daftar produk dibentuk ulang dari semua baris GR yang dipilih.
AC-01.8Saat Selanjutnya diklik di langkah Umum dan belum ada baris produk, pengguna tidak bisa pindah langkah dan error tampil di field Penerimaan Barang.
AC-01.9Saat Simpan berhasil, Bill tersimpan berstatus Draf, toast sukses tampil, dan pengguna diarahkan ke daftar Bill.
AC-01.10Saat BE menolak penyimpanan, pesan error tampil di langkah Tinjauan dan pada field terkait.
AC-01.11Saat pengguna meninggalkan wizard dengan isian yang belum disimpan, muncul konfirmasi perubahan belum disimpan.

US-02 — Menyesuaikan harga, diskon, dan pajak (P0)

Sebagai staf finance, saya ingin menyesuaikan harga, diskon, dan pajak sesuai nota supplier, agar total tagihan sama dengan yang harus dibayar.

IDKriteria penerimaan
AC-02.1Jika baris GR tertaut ke baris PO, harga, diskon persen, diskon nominal, dan pajak terisi dari baris PO, dan harga PO ditampilkan sebagai Harga Beli Terakhir (read-only). Jika tidak tertaut PO, harga kosong (0) dan wajib diisi.
AC-02.2Dialog Ubah Produk menampilkan qty dan UoM (read-only), lalu harga (minimal 1), diskon persen dan diskon nominal (masing-masing bisa lebih dari satu baris, dengan catatan opsional), serta pajak dalam persen atau nominal.
AC-02.3Dialog Atur Diskon/Pajak General mengatur diskon persen, diskon nominal, dan pajak untuk seluruh tagihan.
AC-02.4Saat harga, diskon, atau pajak berubah, total baris dan kartu perhitungan diperbarui tanpa reload, dengan perhitungan sesuai BR-09 dan BR-10.
AC-02.5Baris tidak bisa ditambah atau dihapus, dan qty tidak bisa diubah. Untuk mengubah isi baris, ubah pilihan GR di langkah Umum.

US-03 — Mengubah Bill Draf (P0)

Sebagai staf finance, saya ingin mengubah Bill yang masih Draf, agar kesalahan bisa diperbaiki sebelum diajukan.

IDKriteria penerimaan
AC-03.1Tombol Ubah Data hanya tampil pada Bill Draf untuk pengguna dengan izin update di toko aktif.
AC-03.2Tab Umum disimpan sekaligus: alamat penagihan, tanggal penagihan, tipe pembayaran dan tanggal jatuh tempo, penanggung jawab, bukti penagihan, dan catatan. Toko, pesanan pembelian, penerimaan barang, dan supplier tampil read-only.
AC-03.3Di tab Produk, harga, diskon, dan pajak per baris disimpan langsung per baris; diskon dan pajak general disimpan langsung lewat dialognya. Keduanya hanya tersedia selama Bill berstatus Draf.
AC-03.4Saat URL edit dibuka pada Bill yang bukan Draf, halaman kembali ke tampilan detail read-only.
AC-03.5Tab yang sedang dibuka tetap sama saat berpindah dari detail ke edit.

US-04 — Menetapkan penanggung jawab (P0)

Sebagai kepala toko, saya ingin menetapkan PIC pada Bill, agar jelas siapa yang berwenang mengajukan tagihan.

IDKriteria penerimaan
AC-04.1PIC bisa dipilih lebih dari satu dari daftar karyawan toko, saat membuat Bill, saat mengubah Draf, atau lewat tombol tambah di kolom Penanggung Jawab pada daftar.
AC-04.2Tombol tambah PIC di daftar hanya tampil pada Bill Draf untuk pengguna dengan izin assign di toko aktif.

US-05 — Mengajukan Bill (P0)

Sebagai PIC, saya ingin mengajukan Bill, agar tagihan berlaku dan pembayaran bisa dicatat.

IDKriteria penerimaan
AC-05.1Tombol Ajukan Penagihan tampil pada Bill Draf untuk pengguna dengan izin submit, dan hanya aktif jika pengguna adalah PIC Bill tersebut.
AC-05.2Setelah konfirmasi, status menjadi Diajukan, serta tercatat siapa dan kapan mengajukan.
AC-05.3Pada Bill Diajukan, tombol Ubah Data, ubah baris, dan ubah diskon/pajak general tidak tampil.

US-06 — Mencatat pembayaran (P0)

Sebagai owner, saya ingin mencatat pembayaran ke supplier, sekaligus atau bertahap, agar sisa utang selalu diketahui.

IDKriteria penerimaan
AC-06.1Tab Pembayaran nonaktif selama Bill berstatus Draf.
AC-06.2Tab Pembayaran menampilkan ringkasan total tagihan, total sudah dibayar, dan total belum dibayar, diikuti daftar pembayaran (Pembayaran 1, 2, dan seterusnya) beserta detail dan pratinjau lampirannya.
AC-06.3Tombol Tambah Pembayaran tampil untuk pengguna dengan izin update di toko aktif, selama Bill belum Lunas.
AC-06.4Form pembayaran mewajibkan metode pembayaran (Tunai, Transfer Bank, Giro, Kartu Kredit, Lainnya), tanggal & waktu pembayaran (default saat ini), jumlah (minimal 1), dan minimal satu penanggung jawab (default pengguna yang login). Bukti pembayaran dan catatan opsional.
AC-06.5Setelah pembayaran disimpan, ringkasan dan status Bill diperbarui sesuai BR-15.

US-07 — Menghapus pembayaran (P0)

Sebagai owner, saya ingin menghapus pembayaran yang salah catat, agar sisa tagihan kembali benar.

IDKriteria penerimaan
AC-07.1Aksi hapus pembayaran tampil untuk pengguna dengan izin update di toko aktif, selama Bill belum Lunas, setelah konfirmasi.
AC-07.2Setelah pembayaran dihapus, ringkasan dan status Bill dihitung ulang.

US-08 — Daftar dan pencarian Bill (P0)

Sebagai owner, saya ingin melihat dan menyaring Bill, agar cepat menemukan tagihan yang belum lunas.

IDKriteria penerimaan
AC-08.1Default menampilkan Bill toko aktif; filter lanjutan: toko, rentang tanggal penagihan, supplier, status, dan penanggung jawab; pencarian dengan kata kunci.
AC-08.2Kolom: nomor tagihan, toko, supplier, tanggal penagihan, tanggal jatuh tempo, total tagihan, total sudah dibayar, total belum dibayar, penanggung jawab, dibuat oleh, dan status.
AC-08.3Urutan default tanggal penagihan terbaru di atas, dengan paginasi. Kolom yang bisa diurutkan: nomor tagihan, tanggal penagihan, dan tanggal jatuh tempo.
AC-08.4Baris bisa diperluas untuk melihat daftar produk Bill tanpa membuka detail.
AC-08.5Aksi baris: Lihat, Ubah (hanya Draf), Hapus (hanya Draf), sesuai izin.

US-09 — Menghapus Bill Draf (P0)

Sebagai staf finance, saya ingin menghapus Draf yang tidak jadi dipakai, agar daftar tetap bersih.

IDKriteria penerimaan
AC-09.1Aksi Hapus hanya tersedia pada Bill Draf untuk pengguna dengan izin delete di toko aktif, setelah konfirmasi.
AC-09.2Hapus massal tersedia dari baris yang dipilih di daftar.

US-10 — Riwayat aktivitas (P1)

Sebagai owner, saya ingin melihat log aktivitas Bill, agar tahu siapa mengubah apa dan kapan.

IDKriteria penerimaan
AC-10.1Log aktivitas tersedia per Bill (di detail) dan untuk seluruh Bill (di daftar).

7. Document Structure

Header

FieldRequiredDefaultNotes
Nomor tagihanOtomatisDibuat BE
TokoYaToko aktifRead-only
Pesanan pembelianTidakMulti-pilih, termasuk opsi Tanpa Pesanan Pembelian; hanya penyaring GR dan tidak dikirim ke BE (BR-06)
Penerimaan barangYaMulti-pilih; GR Diajukan dari supplier yang sama (BR-04, BR-05)
SupplierYaDari PO atau GR pertamaRead-only; tidak bisa diubah setelah dibuat
Alamat penagihanYaAlamat penagihan default supplierDari alamat supplier (BR-12)
Tanggal penagihanYaHari ini
Tipe pembayaranYaCBD, COD, EOM, Net 14/30/60/90, Custom
Tanggal jatuh tempoWajib jika CustomDihitung dari tipe pembayaranLihat BR-13
Penanggung jawab (PIC)TidakPengguna yang loginMulti-pilih dari karyawan toko; wajib sebelum Ajukan (BR-02)
Bukti penagihanTidakGambar atau dokumen, bisa lebih dari satu (mis. foto nota supplier)
CatatanTidak
Diskon generalTidak0Persen dan nominal, masing-masing bisa lebih dari satu, dengan catatan opsional (BR-10)
Pajak generalTidakTanpa pajakPersen atau nominal (BR-10)
StatusOtomatisDrafLihat bagian 8

Lines

FieldRequiredDefaultNotes
Nomor GROtomatisDari GRBaris dibentuk 1:1 dari baris GR (BR-07)
Produk + kemasanOtomatisDari baris GRRead-only
QtyOtomatisQty diterima baris GRRead-only
UoMOtomatisUoM kemasan baris GRRead-only
Harga beli terakhirOtomatisHarga baris POInformasi saja; kosong jika GR tanpa PO
Harga satuanYaHarga baris PO, atau 0Minimal 1
Diskon persenTidakDari baris PO, atau 0Bisa lebih dari satu; bertingkat (BR-09); catatan opsional
Diskon nominalTidakDari baris PO, atau 0Bisa lebih dari satu; dipotong setelah diskon persen
PajakTidakDari baris PO, atau tanpa pajakPersen atau nominal
Total harga kotorOtomatisqty × harga
Total diskonOtomatisAkumulasi diskon baris
Total harga bersihOtomatisBruto − diskon
Total pajakOtomatis
Total barisOtomatisNeto + pajak

Payments

FieldRequiredDefaultNotes
Metode pembayaranYaTunai, Transfer Bank, Giro, Kartu Kredit, Lainnya
Tanggal & waktu pembayaranYaSaat ini
Jumlah pembayaranYa0Minimal 1
Penanggung jawabYaPengguna yang loginMulti-pilih dari karyawan toko
Bukti pembayaranTidakGambar atau dokumen
CatatanTidak

Totals: Total Harga Kotor · Total Diskon Item · Total Diskon General · Total Harga Bersih · Total Pajak Item · Total Pajak General · Grand Total, plus Total Sudah Dibayar dan Total Belum Dibayar. API mengembalikan tax_total sebagai gabungan pajak item dan pajak general, sehingga pajak general = tax_total − tax_item. Jejak yang disimpan: dibuat / diajukan oleh siapa dan kapan.

8. Status Lifecycle

StatusLabel UIMeaningEditableNext status
draftDrafSedang disusun, belum berlakuInformasi umum, harga/diskon/pajak baris, diskon/pajak generalDiajukan, atau dihapus
submittedDiajukanBerlaku, belum ada pembayaranHanya tambah pembayaranDibayar Sebagian, Lunas
partially_paidDibayar SebagianSudah dibayar sebagianHanya tambah / hapus pembayaranLunas
paidLunasSeluruh tagihan sudah dibayarTidak

9. Permissions & Actions

Permissions

Akses berbasis permission (bukan role tetap). Semua aksi ubah juga mensyaratkan toko aktif; pada toko tidak aktif, Bill hanya bisa dilihat.

ActionPermissionSyarat tambahan
Lihat daftarpurchase:bill:list:any atau :list:store
Lihat detailpurchase:bill:view:any atau :view:store
Buat Billpurchase:bill:create:storeToko aktif
Ubah Draf (umum, baris, diskon/pajak general)purchase:bill:update:storeToko aktif
Tambah / hapus pembayaranpurchase:bill:update:storeToko aktif, Bill Diajukan atau Dibayar Sebagian
Hapus Drafpurchase:bill:delete:storeToko aktif
Tetapkan PIC (dari daftar)purchase:bill:assign:storeToko aktif
Ajukanpurchase:bill:submit:storeToko aktif, pengguna adalah PIC

Belum ada permission khusus untuk pembayaran; pembayaran memakai permission update. FE menyembunyikan aksi yang tidak diizinkan dan menonaktifkan aksi jika pengguna bukan PIC; BE tetap menolaknya. Keduanya harus konsisten.

Actions by status (✓ tersedia)

ActionDrafDiajukanDibayar SebagianLunas
Ubah informasi umum
Ubah harga, diskon, pajak baris
Ubah diskon / pajak general
Tetapkan PIC
Hapus
Ajukan
Tambah pembayaran
Hapus pembayaran
Lihat log aktivitas

10. Business Rules

Aturan bisnis adalah ketentuan yang berlaku di semua layar dan semua aksi pada Bill, 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 Bill milik satu toko dan dibuat pada toko aktif pengguna. Aksi ubah hanya bisa dilakukan saat toko aktif.
  • BR-02 Ajukan hanya boleh dilakukan oleh karyawan yang ditetapkan sebagai PIC Bill tersebut, dan memiliki permission submit. Pembuat Bill saja tidak cukup.
  • BR-03 Hanya Bill Draf yang bisa diubah, ditetapkan PIC-nya, dan dihapus. Setelah Diajukan, isi Bill terkunci; yang masih bisa dilakukan hanya menambah dan menghapus pembayaran.
  • BR-04 Satu Bill hanya untuk satu supplier. Semua GR yang dipilih harus berasal dari supplier yang sama, dan supplier tidak bisa diubah setelah Bill dibuat.
  • BR-05 Hanya GR toko aktif berstatus Diajukan yang bisa dipilih. Satu GR hanya bisa dirujuk oleh satu Bill; saat Bill dibuat, GR yang dirujuk berstatus Selesai.
  • BR-06 Pilihan Pesanan Pembelian hanya menyaring GR: PO toko aktif berstatus Diajukan, Diterima Sebagian, atau Diterima, ditambah opsi Tanpa Pesanan Pembelian untuk GR yang tidak merujuk PO. Keduanya bisa dikombinasikan dalam satu Bill. Daftar PO pada Bill diturunkan dari GR yang dirujuk.
  • BR-07 Baris Bill dibentuk 1:1 dari baris GR yang dipilih. Qty sama dengan qty diterima dan tidak bisa diubah; baris tidak bisa ditambah atau dihapus secara manual.
  • BR-08 Harga, diskon, dan pajak baris default diambil dari baris PO jika baris GR tertaut ke PO. Harga baris minimal 1.
  • BR-09 Perhitungan baris: bruto = qty × harga; semua diskon persen diterapkan berurutan terhadap sisa nilai, lalu semua diskon nominal dikurangkan; pajak dihitung dari nilai setelah diskon (persen) atau berupa nominal tetap; total baris = neto + pajak.
  • BR-10 Perhitungan Bill: diskon general diterapkan dengan cara yang sama (persen berurutan, lalu nominal) terhadap jumlah neto semua baris. Pajak general dihitung dari neto setelah diskon general (persen) atau berupa nominal tetap. Grand total = neto setelah diskon general + total pajak baris + pajak general.
  • BR-11 Diskon bernilai 0 tidak disimpan.
  • BR-12 Alamat penagihan adalah alamat milik supplier, bukan alamat toko. BE menolak alamat yang bukan milik supplier.
  • BR-13 Tanggal jatuh tempo dihitung dari tanggal penagihan: CBD/COD = tanggal penagihan; EOM = akhir bulan tanggal penagihan; Net N = tanggal penagihan + N hari; Custom = diisi manual (wajib). Tanggal jatuh tempo hanya dikirim FE untuk tipe Custom; tipe lainnya dihitung BE.
  • BR-14 Pembayaran hanya bisa dicatat pada Bill berstatus Diajukan atau Dibayar Sebagian. Metode, tanggal & waktu, jumlah (minimal 1), dan minimal satu penanggung jawab wajib diisi.
  • BR-15 Status Dibayar Sebagian dan Lunas ditetapkan otomatis oleh BE: total sudah dibayar lebih dari 0 dan masih ada sisa menjadi Dibayar Sebagian; sisa tagihan 0 menjadi Lunas. Status ini tidak bisa diubah manual.
  • BR-16 Bill Lunas terkunci; pembayaran tidak bisa ditambah atau dihapus.
  • BR-17 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 Bill 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.

IDCaseExpected behavior
EC-01Bill Draf belum punya PICTombol Ajukan nonaktif untuk semua pengguna sampai PIC ditetapkan
EC-02Pengguna bukan PIC membuka BillTombol Ajukan tampil tetapi nonaktif
EC-03URL edit dibuka pada Bill non-DrafTampil read-only dan diarahkan ke halaman detail
EC-04Toko aktif berstatus tidak aktifHalaman tambah/ubah menampilkan halaman toko tidak aktif; di daftar dan detail semua aksi ubah disembunyikan
EC-05Pengguna tidak ditugaskan ke toko mana punHalaman Bill menampilkan halaman toko belum ditetapkan
EC-06PO atau GR milik supplier lain dipilih setelah supplier terkunciPilihan tampil tetapi nonaktif, sehingga tidak bisa dipilih
EC-07Semua pilihan PO dan GR dikosongkanKunci supplier dilepas; supplier dan alamat penagihan dikosongkan
EC-08PO pertama dihapus dari pilihanSupplier dikunci ulang dari PO tersisa yang pertama, atau dari GR pertama jika tidak ada PO
EC-09Pilihan GR diubah setelah harga baris disesuaikanSemua baris dibentuk ulang dari GR yang dipilih; penyesuaian harga, diskon, dan pajak sebelumnya hilang dan harus diisi ulang
EC-10GR tanpa PO dipilihHarga baris kosong (0) dan wajib diisi minimal 1 sebelum disimpan
EC-11Supplier belum punya alamatAlamat penagihan kosong dan Bill tidak bisa disimpan; alamat perlu ditambahkan dulu di master Supplier
EC-12Jumlah pembayaran melebihi sisa tagihanFE belum membatasi jumlah terhadap sisa tagihan. Perlu konfirmasi BE: pembayaran seperti ini sebaiknya ditolak
EC-13Tagihan salah setelah DiajukanBelum ada aksi; Bill Diajukan tidak bisa dibatalkan atau direvisi. Perlu diputuskan: alur batal (misalnya selama belum ada pembayaran) atau dokumen koreksi
EC-14Semua pembayaran dihapus dari Bill Dibayar SebagianPerlu konfirmasi BE: status kembali menjadi Diajukan
EC-15Bill Draf dihapusPerlu konfirmasi BE: GR yang dirujuk kembali berstatus Diajukan agar bisa dipilih di Bill lain
EC-16Tipe pembayaran diganti dari Custom ke tipe lainTanggal jatuh tempo dihitung ulang otomatis dan field menjadi nonaktif

12. API Contract

Daftar endpoint per aksi. Detail request dan response ada di Postman (lihat metadata API).

ActionMethodEndpointRef
Daftar Bill (filter, cari, paginasi)GET/api/bills/paginateUS-08
Daftar Bill ringkas (cursor)GET/api/bills/cursor
Detail BillGET/api/bills/:idUS-03
Buat Bill (header + baris)POST/api/billsUS-01
Ubah Bill Draf (umum, diskon/pajak general)PUT/api/bills/:idUS-03
Hapus Bill DrafDELETE/api/bills/:idUS-09
Hapus Bill Draf massalDELETE/api/bills/bulkUS-09
Daftar baris BillGET/api/bills/:id/itemsUS-03
Detail baris BillGET/api/bills/:id/items/:item_idUS-02
Ubah harga / diskon / pajak barisPUT/api/bills/:id/items/:item_idUS-02
Tetapkan PICPATCH/api/bills/:id/assignUS-04
AjukanPATCH/api/bills/:id/submitUS-05
Daftar pembayaranGET/api/bills/:id/disbursementsUS-06
Tambah pembayaranPOST/api/bills/:id/disbursementsUS-06
Hapus pembayaranDELETE/api/bills/:id/disbursements/:disbursement_idUS-07
Log aktivitas semua BillGET/api/bills/activity-logs/cursorUS-10
Log aktivitas satu BillGET/api/bills/:id/activity-logs/cursorUS-10

Lookup yang dipakai form Bill

ActionMethodEndpointRef
PO per toko (filter status)GET/api/stores/:id/purchase-orders/cursorAC-01.2
GR per toko (filter status, purchase_order_id, with_purchase_order)GET/api/stores/:id/goods-receipts/cursorAC-01.3
Alamat supplier (alamat penagihan)GET/api/suppliers/:id/addressesAC-01.5
Karyawan toko (PIC)GET/api/stores/:id/employees/cursorUS-04, US-06

Filter GR pada lookup dikirim sekaligus dalam satu request: status = submitted, ditambah purchase_order_id[] untuk PO yang dipilih dan/atau with_purchase_order = false jika opsi Tanpa Pesanan Pembelian dipilih. Kedua filter terakhir digabung dengan OR.

13. Dependencies

PRD terkait

  • Goods Receipt — sumber baris Bill; GR berstatus Selesai saat dirujuk (BR-05).
  • Purchase Order — penyaring GR, serta sumber default harga, diskon, dan pajak baris (BR-06, BR-08).

Master data

  • Toko — toko aktif, status aktif, dan karyawan (PIC).
  • Supplier — supplier yang dikunci dari PO/GR, beserta alamatnya (alamat penagihan).
  • Produk & Inventaris Produk — produk dan kemasan yang dibawa dari baris GR.

Efek ke modul lain

  • Goods Receipt — GR yang dirujuk menjadi Selesai dan tidak bisa dipilih untuk Bill lain (BR-05).
  • Bill tidak mengubah stok; stok sudah bertambah saat GR diajukan.
  • Finance — total sudah dibayar dan sisa tagihan menjadi dasar pemantauan utang ke supplier.
  • Setiap perubahan tercatat di log aktivitas (BR-17).
Last updated on