Versi 1
| Field | Isi |
|---|---|
| Dokumen ID | VBS-PBL-001 |
| Deskripsi | Pencatatan invoice pembelian barang dari supplier melalui empat jalur (pembelian biasa, atas PO, atas penerimaan, dan import), beserta daftar, ringkasan hutang, filter, dan pengelolaan status draft / selesai |
| Nomor Revisi | 1 |
| Tanggal | 2026-10-04 |
| Keterangan | Dokumentasi baseline dari dokumentasi fitur demo dan kode FE |
1. Ringkasan
a. In scope
- User melihat ringkasan pembelian: total pembelian belum lunas, total pembelian jatuh tempo, dan total pembelian terbayar 30 hari terakhir.
- User melihat daftar invoice pembelian (tanggal, nomor invoice, supplier, total, PPN, potongan PPh, status, jatuh tempo, lunas, tipe, lampiran) dan memilih kolom yang ditampilkan.
- User mencari berdasarkan nomor invoice dan memfilter daftar berdasarkan periode tanggal invoice, periode jatuh tempo, supplier, tipe (barang / import / aset), barang, status invoice (selesai / belum selesai), dan tagihan (lunas / belum lunas).
- User membuat pembelian biasa untuk barang yang sudah diterima (nota offline / WA / nota fisik).
- User membuat pembelian atas PO dengan memilih invoice PO sehingga barang terisi otomatis.
- User membuat pembelian atas penerimaan dengan memilih invoice penerimaan barang dari gudang sehingga barang terisi otomatis.
- User membuat pembelian import dengan data PO import, PIB (bea masuk, PPN, PPh 22), biaya asuransi, dan invoice terkait (pengiriman, asuransi, biaya lain).
- User menyimpan pembelian sebagai draft (simpan sementara) atau final (selesai).
- User mengubah, menghapus, atau memfinalkan invoice yang masih draft.
- User dengan hak khusus membuka kembali invoice selesai menjadi draft dan memposting ulang jurnal pembelian.
- User mengaitkan invoice pembelian ke invoice induk / invoice terkait, menambah lampiran, menambah potongan PPh, mencetak invoice, dan menuju pelunasan hutang.
b. Catatan
c. Kesimpulan
- [FE] -
- [BE] -
2. Functional Requirement
| Kode | Deskripsi |
|---|---|
| FR-01 | Sistem menampilkan ringkasan pembelian belum lunas, jatuh tempo, dan terbayar 30 hari terakhir bagi user yang berhak melihat summary |
| FR-02 | Sistem menampilkan daftar invoice pembelian semua tipe (barang, import, aset) dengan pagination dan kolom yang bisa dipilih |
| FR-03 | User dapat mencari dan memfilter daftar pembelian |
| FR-04 | User dapat membuat pembelian biasa dengan rincian barang, biaya lain, diskon, PPN, PPh, tempo, dan metode pembayaran |
| FR-05 | User dapat membuat pembelian atas PO yang mengambil barang dari invoice PO belum selesai |
| FR-06 | User dapat membuat pembelian atas penerimaan yang mengambil barang dari invoice penerimaan barang |
| FR-07 | User dapat membuat pembelian import dengan data PIB, PO import, dan invoice terkait |
| FR-08 | User dapat menyimpan pembelian sebagai draft atau final |
| FR-09 | User dapat mengubah, menghapus, dan memfinalkan invoice pembelian yang masih draft |
| FR-10 | User dengan hak unlock dapat mengubah invoice selesai kembali menjadi draft |
| FR-11 | User dapat memposting ulang invoice pembelian yang sudah selesai |
| FR-12 | User dapat mengaitkan invoice pembelian ke invoice induk / invoice terkait |
3. Use Case List
| Kode | Deskripsi |
|---|---|
| UC-01 | Melihat ringkasan dan daftar pembelian |
| UC-02 | Mencari dan memfilter daftar pembelian |
| UC-03 | Membuat pembelian biasa |
| UC-04 | Membuat pembelian atas PO |
| UC-05 | Membuat pembelian atas penerimaan |
| UC-06 | Membuat pembelian import |
| UC-07 | Mengubah invoice pembelian draft |
| UC-08 | Memfinalkan atau menghapus invoice pembelian draft |
| UC-09 | Membuka kembali (unlock) invoice pembelian ke draft |
| UC-10 | Memposting ulang invoice pembelian |
| UC-11 | Mengaitkan invoice pembelian ke invoice induk / terkait |
4. Use Case Scenario
UC-01 : Melihat ringkasan dan daftar pembelian
| Aktor | User brand dengan hak pembelian |
| Deskripsi | User melihat ringkasan hutang pembelian dan daftar invoice pembelian |
| Prekondisi | User sudah login Brand aktif User memiliki hak #pembelian basic |
| Alur utama | 1. User membuka menu Transaksi, Pembelian. 2. Sistem menampilkan kartu ringkasan pembelian belum lunas, jatuh tempo, dan terbayar 30 hari terakhir. 3. Sistem menampilkan daftar invoice pembelian terbaru beserta tipe dan status. 4. User menggulir untuk memuat halaman berikutnya. 5. User mengatur kolom tabel atau membuka preview lampiran. |
| Alur negatif | - Jika daftar kosong tanpa filter, muncul "Daftar Invoice masih kosong". - Jika daftar kosong dengan filter, muncul "Invoice Tidak Ditemukan". - Jika gagal memuat ringkasan, kartu ringkasan menampilkan nominal 0. |
| Bisnis rule | - Kartu ringkasan hanya tampil bagi user dengan hak #summary-pembelian.- User tanpa hak #pembelian all hanya melihat invoice yang dibuatnya sendiri.- User non admin brand hanya melihat invoice pada gudang yang diizinkan. - Kolom PPN hanya tampil jika brand Pengusaha Kena Pajak. - Kolom Lunas tampil - untuk invoice draft.- Daftar diperbarui otomatis saat ada event pembelian baru dari socket. |
| Postkondisi | Ringkasan dan daftar pembelian tampil |
| Trigger | User membuka halaman Pembelian |
| Kode FR | FR-01 FR-02 |
UC-02 : Mencari dan memfilter daftar pembelian
| Aktor | User brand dengan hak pembelian |
| Deskripsi | User mempersempit daftar pembelian berdasarkan kriteria |
| Prekondisi | User berada di halaman daftar pembelian |
| Alur utama | 1. User mengetik nomor invoice pada kolom pencarian. 2. User membuka Filter. 3. User mengisi periode tanggal invoice, periode jatuh tempo, supplier, tipe, barang, status invoice, dan/atau tagihan. 4. Sistem memuat ulang daftar dari halaman pertama dan menampilkan filter aktif. |
| Alur negatif | - Jika tidak ada data yang cocok, muncul "Invoice Tidak Ditemukan". - User dapat menekan Reset untuk mengosongkan filter. |
| Bisnis rule | - Tipe: Aset, Import, Barang. - Status invoice: Selesai, Belum selesai. - Tagihan: Lunas, Belum lunas. - Periode tanggal bisa mode harian atau bulanan (akhir bulan dipakai sebagai batas akhir). |
| Postkondisi | Daftar pembelian sesuai filter |
| Trigger | User mengubah pencarian atau filter |
| Kode FR | FR-03 |
UC-03 : Membuat pembelian biasa
| Aktor | User dengan hak tambah pembelian |
| Deskripsi | User mencatat invoice pembelian untuk barang yang sudah diterima |
| Prekondisi | Supplier terdaftar di master supplier Barang terdaftar di master barang User memiliki hak #pembelian-only atau #pembelian basic |
| Alur utama | 1. User klik Buat Invoice, Pembelian. 2. User mengisi tanggal, lokasi / gudang (kandang diperlakukan sebagai gudang), supplier, tempo, cluster, PPN dan mode PPN, nomor faktur pajak, serta keterangan nota. 3. User menambah baris barang (qty, satuan, harga, diskon). 4. User menambah biaya lain-lain dan diskon global (opsional). 5. User mengisi metode pembayaran. 6. User memilih Simpan Draft atau Simpan Final. 7. Untuk final, sistem meminta konfirmasi lalu menyimpan invoice. 8. Sistem mengunggah lampiran (jika ada) dan kembali ke daftar. |
| Alur negatif | - Jika header belum lengkap, muncul "Tolong lengkapi form dengan benar!". - Jika rincian belum lengkap, muncul "Tolong lengkapi rincian dengan benar!". - Jika gudang belum dipilih, muncul "Tolong lengkapi gudang form dengan benar!". - Jika biaya belum lengkap, muncul "Tolong lengkapi Biaya dengan benar!". - Jika tempo lebih dari 0 tanpa supplier, muncul "Tempo harus 0 untuk pembelian tanpa supplier". - Jika tempo 0 dan metode pembayaran kosong, muncul "Metode Pembayaran Harus Diisi". - Jika pembayaran melebihi atau kurang dari total, muncul "Pembayaran tidak boleh melebihi Nilai Total Pembayaran" / "Total Bayar Kurang Dari Total Pembelian". - Jika harga beli lebih tinggi dari pembelian terakhir dan user tidak punya hak #beli-above-last, muncul "Harga Beli tidak boleh lebih dari harga pembelian terakhir".- Jika user tidak punya akses gudang, muncul "Anda tidak memiliki akses pada gudang ...". |
| Bisnis rule | - Tempo 0 berarti dibayar kontan sehingga total pembayaran wajib sama dengan total pembelian saat final. - Metode pembayaran titipan memakai invoice DP dan menjadikan tempo minimal 1. - PPN hanya berlaku jika brand PKP dan PPN masukan diaktifkan, nomor faktur pajak dikirim bila PPN aktif. - Simpan final tidak dapat diubah kembali kecuali di-unlock. - Barang dengan nomor seri dipecah per qty 1. |
| Postkondisi | Invoice pembelian tersimpan sebagai draft atau selesai |
| Trigger | User klik Simpan Draft / Simpan Final |
| Kode FR | FR-04 FR-08 |
UC-04 : Membuat pembelian atas PO
| Aktor | User dengan hak #pembelian-tanpa-penerimaan |
| Deskripsi | User mengubah PO yang sudah diproses menjadi invoice pembelian |
| Prekondisi | Ada invoice PO berstatus belum selesai untuk supplier dan gudang terkait |
| Alur utama | 1. User klik Buat Invoice, Pembelian atas PO (atau membuka dari PO). 2. User memilih gudang dan supplier. 3. Sistem menampilkan invoice PO belum selesai milik supplier dan gudang tersebut. 4. User memilih invoice PO. 5. Sistem mengisi supplier, gudang, lokasi, dan barang dari PO. 6. User melengkapi harga, pembayaran, lalu menyimpan draft / final. |
| Alur negatif | - Jika invoice PO dari tautan tidak ditemukan, muncul "Invoice PO yang anda cari tidak ditemukan!". - Validasi form, rincian, dan pembayaran sama seperti pembelian biasa. |
| Bisnis rule | - Invoice PO wajib dipilih. - Barang tidak perlu diinput ulang karena diambil dari PO. - Hanya PO berstatus belum selesai yang dapat dipilih. |
| Postkondisi | Invoice pembelian tersimpan dan terhubung ke invoice PO |
| Trigger | User memilih menu Pembelian atas PO |
| Kode FR | FR-05 FR-08 |
UC-05 : Membuat pembelian atas penerimaan
| Aktor | User dengan hak #pembelian-dengan-penerimaan |
| Deskripsi | User membuat invoice pembelian dari invoice penerimaan barang gudang |
| Prekondisi | Gudang sudah membuat invoice penerimaan barang dari supplier terkait |
| Alur utama | 1. User klik Buat Invoice, Pembelian atas Penerimaan. 2. User memilih gudang dan supplier. 3. Sistem menampilkan invoice penerimaan untuk gudang dan supplier tersebut. 4. User memilih invoice penerimaan. 5. Sistem mengisi barang dari penerimaan. 6. User melengkapi harga, pembayaran, lalu menyimpan draft / final. |
| Alur negatif | - Jika supplier diganti, pilihan invoice penerimaan dikosongkan. - Validasi form, rincian, dan pembayaran sama seperti pembelian biasa. |
| Bisnis rule | - Invoice penerimaan wajib dipilih. - Id invoice pembelian memakai id invoice penerimaan dan ditandai sebagai pembelian dari penerimaan. - Qty stok dapat diambil dari qty penerimaan. |
| Postkondisi | Invoice pembelian tersimpan dan terhubung ke invoice penerimaan |
| Trigger | User memilih menu Pembelian atas Penerimaan |
| Kode FR | FR-06 FR-08 |
UC-06 : Membuat pembelian import
| Aktor | User dengan hak tambah pembelian |
| Deskripsi | User mencatat pembelian dari luar negeri dengan data tambahan import |
| Prekondisi | Supplier, barang / aset, dan akun pembayaran tersedia |
| Alur utama | 1. User klik Buat Invoice, Pembelian Import. 2. User mengisi informasi nota (tanggal, supplier, gudang, mata uang dan kurs, nomor PO import, nomor BL). 3. User mengisi rincian barang dan/atau aset. 4. User mengisi PIB (nomor, tanggal, bea masuk, PPN, PPh 22, tanggal bayar, akun pembayaran) dan SPTNP bila ada. 5. User memilih invoice terkait (pengiriman, asuransi, biaya lain). 6. User mengisi metode pembayaran lalu menyimpan draft / final. 7. Sistem menyimpan invoice, mengaitkan invoice terkait, dan mengunggah lampiran. |
| Alur negatif | - Jika rincian barang / aset belum lengkap, muncul "Tolong lengkapi rincian barang dengan benar!" / "Tolong lengkapi rincian aset dengan benar!". - Jika ada nilai PIB tanpa tanggal PIB, muncul "Tolong lengkapi tanggal pib dengan benar!". - Jika tanggal bayar PIB diisi tanpa akun, muncul "Tolong lengkapi akun pembayaran pib dengan benar!". - Jika SPTNP tanpa akun, muncul "Tolong lengkapi akun pembayaran sptnp dengan benar!". |
| Bisnis rule | - Pembelian import tidak boleh konsinyasi. - Total pembelian import termasuk biaya asuransi, pengiriman, dan biaya lain dari invoice terkait. - PPN pada daftar untuk import = PIB PPN ditambah PPN SPTNP, potongan PPh = PIB PPh 22. |
| Postkondisi | Invoice pembelian import tersimpan dengan tipe Import |
| Trigger | User klik Simpan pada form pembelian import |
| Kode FR | FR-07 FR-08 FR-12 |
UC-07 : Mengubah invoice pembelian draft
| Aktor | User dengan hak #pembelian basic |
| Deskripsi | User memperbaiki invoice pembelian yang masih draft |
| Prekondisi | Invoice berstatus draft |
| Alur utama | 1. User memilih Edit pada menu aksi invoice. 2. Sistem memuat data invoice (pembelian biasa atau import). 3. User mengubah data lalu menyimpan draft / final. |
| Alur negatif | - Jika invoice tidak ditemukan, sistem kembali ke daftar pembelian. - Jika tempo lebih dari 0 tanpa hak, muncul "Anda tidak memiliki akses melakukan pembelian tempo > 0, silahkan ganti tempo menjadi 0". - Validasi lain sama seperti pembuatan. |
| Bisnis rule | - Menu Edit hanya muncul untuk invoice draft. - Invoice tipe aset diarahkan ke halaman pembelian aset. |
| Postkondisi | Invoice pembelian diperbarui |
| Trigger | User klik Edit |
| Kode FR | FR-09 |
UC-08 : Memfinalkan atau menghapus invoice pembelian draft
| Aktor | User dengan hak #pembelian basic |
| Deskripsi | User menyelesaikan invoice draft langsung dari daftar atau menghapusnya |
| Prekondisi | Invoice berstatus draft |
| Alur utama | 1. User membuka menu aksi invoice draft. 2. User memilih Finalize Nota, sistem menandai invoice selesai lalu membuka cetak invoice. 3. Atau user memilih Hapus, mengonfirmasi, dan sistem menghapus invoice dari daftar. |
| Alur negatif | - Jika user membatalkan konfirmasi hapus, invoice tidak dihapus. - Jika gagal, muncul notifikasi error dari server. |
| Bisnis rule | - Hapus hanya untuk invoice draft dan tidak dapat dikembalikan. - Invoice import / aset dihapus melalui jalur invoice pembelian all. |
| Postkondisi | Invoice menjadi selesai atau terhapus |
| Trigger | User klik Finalize Nota / Hapus |
| Kode FR | FR-09 |
UC-09 : Membuka kembali (unlock) invoice pembelian ke draft
| Aktor | User dengan hak #can-draft dan #pembelian draft |
| Deskripsi | User mengubah invoice selesai kembali menjadi draft agar bisa diedit |
| Prekondisi | Invoice berstatus selesai |
| Alur utama | 1. User membuka menu aksi invoice selesai. 2. User memilih Ubah ke Simpan Draft. 3. Sistem membuka kunci invoice. 4. Sistem menampilkan "Berhasil Ubah Pembelian dengan no invoice ... ke Draft". |
| Alur negatif | - Tanpa hak, menu tidak tampil. - Jika server menolak, muncul notifikasi error. |
| Bisnis rule | - Unlock membutuhkan dua hak sekaligus: #can-draft dan #pembelian draft. |
| Postkondisi | Invoice kembali berstatus draft |
| Trigger | User klik Ubah ke Simpan Draft |
| Kode FR | FR-10 |
UC-10 : Memposting ulang invoice pembelian
| Aktor | User brand |
| Deskripsi | User memicu ulang posting data pembelian yang sudah selesai |
| Prekondisi | Invoice berstatus selesai |
| Alur utama | 1. User memilih Posting Ulang pada menu aksi. 2. Sistem memposting ulang sesuai tipe invoice. 3. Sistem menampilkan "Berhasil Memposting Ulang Pembelian dengan no invoice ...". |
| Alur negatif | - Jika gagal, muncul notifikasi error dari server. |
| Bisnis rule | - Barang memakai posting ulang pembelian. - Import memakai sinkronisasi satuan bulk import. - Aset memakai sinkronisasi integrity pembelian aset. |
| Postkondisi | Data turunan pembelian terposting ulang |
| Trigger | User klik Posting Ulang |
| Kode FR | FR-11 |
UC-11 : Mengaitkan invoice pembelian ke invoice induk / terkait
| Aktor | User brand |
| Deskripsi | User menghubungkan invoice pembelian dengan invoice induk atau invoice biaya terkait |
| Prekondisi | Invoice pembelian tersedia di daftar |
| Alur utama | 1. User memilih Kaitkan ke Parent Invoice (barang) atau Kaitkan ke Invoice Pengiriman / Asuransi / Biaya Lain (import / aset). 2. User memilih invoice pada modal. 3. Sistem menyimpan relasi invoice. |
| Alur negatif | - Jika tidak ada invoice dipilih, tidak ada perubahan. - Jika gagal, muncul notifikasi error. |
| Bisnis rule | - Untuk barang, invoice ini menjadi anak dari invoice terpilih. - Untuk import / aset, invoice terpilih menjadi anak dari invoice ini. |
| Postkondisi | Relasi invoice tersimpan |
| Trigger | User memilih aksi kaitkan invoice |
| Kode FR | FR-12 |
5. Data Flow Diagram
DFD-01 — Alur jalur pembelian
DFD-02 — Status invoice pembelian
6. Sequence Diagram
SD-01 — UC-01 : Melihat ringkasan dan daftar pembelian
SD-02 — UC-02 : Mencari dan memfilter daftar pembelian
SD-03 — UC-03 : Membuat pembelian biasa
SD-04 — UC-04 : Membuat pembelian atas PO
SD-05 — UC-05 : Membuat pembelian atas penerimaan
SD-06 — UC-06 : Membuat pembelian import
SD-07 — UC-07 : Mengubah invoice pembelian draft
SD-08 — UC-08 : Memfinalkan atau menghapus invoice pembelian draft
SD-09 — UC-09 : Membuka kembali (unlock) invoice pembelian ke draft
SD-10 — UC-10 : Memposting ulang invoice pembelian
SD-11 — UC-11 : Mengaitkan invoice pembelian ke invoice induk / terkait
7. Table Schema
8. API Schema
| Endpoint | Status | Perubahan |
|---|---|---|
POST /financial-report/invoice-hutang-report | existing | - |
POST /financial-report/invoice-bayar-hutang-report | existing | - |
POST /laporan-pembelian/purchase-report | existing | - |
GET /invoice-pembelian-all | existing | - |
GET /invoice-pembelian-all/:id | existing | - |
GET /invoice-pembelian/:id | existing | - |
GET /invoice-purchase-order | existing | - |
GET /invoice-purchase-order/:id | existing | - |
GET /invoice-penerimaan-barang | existing | - |
POST /pembelian | existing | - |
PUT /pembelian/:id | existing | - |
POST /pembelian-import | existing | - |
PUT /pembelian-import/:id | existing | - |
POST /invoice-pembelian/upload | existing | - |
PUT /invoice-pembelian/invoice-only/:id | existing | - |
DELETE /invoice-pembelian/:id | existing | - |
DELETE /invoice-pembelian-all/:id | existing | - |
PUT /invoice-pembelian/unlock/:id | existing | - |
PUT /invoice-pembelian-all/unlock/:id | existing | - |
PUT /pembelian/posting-ulang/:id | existing | - |
POST /integrity/sync-satuan-bulk-import | existing | - |
POST /integrity-pembelian-aset/sync | existing | - |
POST /pembelian/connect-to-parent-invoice | existing | - |