Inventaris Konsinyasi di ERP: Miliki Stok yang Bukan Milikmu

Foto oleh toolstop on flickr
Inventaris konsinyasi adalah stok yang dikirim consignor ke gudang consignee sambil tetap memegang kepemilikan hukum sampai pelanggan akhir membelinya. Dalam ERP, ini berarti item tersebut tercatat dalam jumlah stok fisik consignee tetapi tidak termasuk dalam laporan posisi keuangan consignee, sehingga sistem perlu melacak kuantitas dan kepemilikan sebagai dua fakta terpisah, bukan satu.
Pesanan penjualan standar berasumsi kepemilikan berpindah begitu barang dikirim, yang langsung memicu pengakuan pendapatan dan pengurangan nilai inventaris. Barang konsinyasi dikirim tanpa terjadi penjualan, jadi jika alur standar dipakai ulang, pendapatan akan diakui dan nilai inventaris berkurang sebelum pelanggan akhir benar-benar membeli, membuat pendapatan dan piutang tercatat berlebihan.
Tambahkan kolom owner_party_id pada tabel entri buku besar stok itu sendiri, bukan pada master item atau rekaman gudang. Ini membuat buku besar kuantitas berubah pada penerimaan dan transfer fisik, sementara buku besar kepemilikan hanya berubah pada penjualan yang terkonfirmasi atau voucher pengembalian formal, sehingga SKU yang sama bisa menyimpan stok konsinyasi dan milik sendiri berdampingan di gudang yang sama.
Menurut aturan gaya IFRS 15 dan ASC 606, pendapatan diakui ketika kendali atas barang berpindah ke pelanggan akhir, yaitu saat consignee melaporkan penjualan, bukan saat consignor awalnya mengirim barang ke consignee dan bukan saat kas akhirnya diterima. Consignor biasanya menjadi pihak utama dalam pengaturan ini dan melaporkan pendapatan serta harga pokok penjualan secara bruto, dengan bagian consignee dicatat sebagai beban komisi.
Perlakukan setiap laporan penjualan yang terkonfirmasi sebagai rekaman tak berubah yang mengakrualkan utang komisi ke consignee dan piutang untuk nilai penjualan bruto, lalu kelompokkan akrual tersebut ke dalam proses penyelesaian periodik. Simpan cuplikan tarif komisi pada laporan penjualan itu sendiri saat penjualan terjadi, karena perjanjian sering dinegosiasikan ulang dan penyelesaian beberapa bulan kemudian harus tetap mencerminkan tarif yang berlaku saat penjualan terjadi.

Foto oleh toolstop on flickr
Inventaris konsinyasi mematahkan asumsi yang tertanam di sebagian besar modul stok ERP, yaitu bahwa siapa pun yang menguasai barang juga memilikinya. Consignor mengirim stok ke gudang consignee, consignee memajang dan menjualnya, tetapi hak milik hukum tetap berada pada consignor sampai pelanggan akhir benar-benar membeli. Jika model inventaris hanya melacak kuantitas dan lokasi, kamu akan mencatat pendapatan dan harga pokok penjualan pada momen yang salah, dan laporan posisi keuangan akan menunjukkan inventaris yang secara hukum milik pihak lain.
Tulisan ini membahas rancangan konkret untuk stok konsinyasi di ERP kustom: cara memisahkan kepemilikan dari penguasaan pada level model data, cara alur penyelesaian consignor dan akrual komisi seharusnya berjalan, kapan pengakuan pendapatan sebenarnya terpicu menurut aturan gaya IFRS 15 dan ASC 606, serta entri buku besar yang tepat yang harus dihasilkan sebuah penjualan. Pola-pola di sini berasal dari pembangunan modul persetujuan dan inventaris untuk klien manufaktur dan distribusi yang lazim memakai syarat konsinyasi dengan dealer dan mitra ritel.
Setiap entri buku besar stok konvensional menjawab satu pertanyaan: berapa banyak item ada di gudang tertentu. Konsinyasi memaksa pertanyaan kedua yang independen: siapa yang secara hukum memiliki kuantitas itu saat ini. Kedua fakta ini berubah pada peristiwa dan waktu yang berbeda, sehingga tidak bisa disimpan pada penanda yang sama. Implementasi naif yang menambahkan satu boolean seperti is_consignment pada master item akan rusak begitu item yang sama dijual dengan syarat konsinyasi ke satu mitra dan sekaligus dijual langsung ke mitra lain.
Modelkan kepemilikan sebagai properti dari entri buku besar stok itu sendiri, bukan properti dari item atau gudang. Kolom owner_party_id pada setiap baris buku besar memungkinkan satu item eksis dalam status konsinyasi dan milik sendiri sekaligus di gudang yang berbeda tanpa percabangan skema apa pun.
Implementasi paling bersih menjaga dua buku besar yang secara logis terpisah namun berbagi tabel dasar yang sama. Buku besar kuantitas menjawab di mana stok secara fisik berada dan berubah pada voucher penerimaan, transfer, serta pengembalian fisik. Buku besar kepemilikan menjawab siapa yang memegang hak milik hukum dan hanya berubah pada voucher penjualan konsinyasi atau voucher transfer kepemilikan formal. Karena kedua buku besar mengacu pada item dan gudang yang sama, kamu selalu bisa menjawab dua pertanyaan yang ditanyakan berbeda oleh manajer gudang dan kontroler keuangan: berapa banyak yang kita punya, dan berapa banyak dari yang kita punya itu benar-benar milik kita.
| Peristiwa | Buku Besar Kuantitas | Buku Besar Kepemilikan |
|---|---|---|
| Consignor mengirim ke gudang consignee | Bertambah di gudang consignee | Tidak berubah, tetap milik consignor |
| Consignee menjual ke pelanggan akhir | Berkurang di gudang consignee | Berpindah ke pelanggan akhir pada momen yang sama |
| Consignee mengembalikan stok yang tidak terjual | Berkurang di consignee, bertambah di consignor | Tidak berubah, kepemilikan memang tidak pernah berada di consignee |
Sebuah pengaturan konsinyasi di sistem melalui empat jenis voucher yang berbeda, masing-masing dengan aturan pencatatannya sendiri dan efeknya sendiri, atau justru sengaja tidak berefek, pada buku besar umum.
// stock_ledger_entry
{
id: uuid,
item_id: uuid,
warehouse_id: uuid, // consignee's physical warehouse
owner_party_id: uuid, // consignor (legal owner), NOT the warehouse holder
quantity: decimal,
valuation_rate: decimal, // consignor's cost, hidden from consignee
ownership_flag: 'consignment' | 'owned',
posting_datetime: timestamp,
voucher_type: 'consignment_receipt' | 'consignment_sale' | 'consignment_return',
voucher_id: uuid
}
// Two ledgers move independently:
// 1. Quantity ledger -> updates on physical receipt/return at consignee warehouse
// 2. Ownership ledger -> stays with consignor until a sale voucher firesJangan pernah mencatat pendapatan atau menghapus nilai inventaris pada langkah penerimaan konsinyasi. Ada godaan untuk memperlakukan voucher penerimaan seperti pengiriman penjualan karena pergerakan fisiknya tampak identik, tetapi melakukan itu mengakui pendapatan sebelum penjualan ke pelanggan akhir benar-benar ada, yang melanggar kriteria perpindahan kontrol pada IFRS 15 maupun ASC 606 dan membuat piutang tercatat berlebihan.
Penyelesaian adalah titik di mana kebanyakan modul konsinyasi buatan sendiri berantakan, karena membutuhkan penggabungan banyak peristiwa laporan penjualan kecil menjadi satu utang atau piutang periodik, sambil tetap menjaga jejak audit ke setiap penjualan individual. Mesin penyelesaian harus memperlakukan setiap laporan penjualan yang terkonfirmasi sebagai rekaman tak berubah dan berstempel waktu yang mengakrualkan utang komisi ke consignee dan piutang dari consignee untuk nilai penjualan bruto, lalu mengelompokkan akrual tersebut ke dalam satu proses penyelesaian.
Simpan tarif komisi sebagai cuplikan pada setiap rekaman laporan penjualan pada saat rekaman itu dibuat, selain referensi ke perjanjiannya. Perjanjian sering dinegosiasikan ulang, dan proses penyelesaian enam bulan kemudian harus mencerminkan tarif yang berlaku saat penjualan benar-benar terjadi, bukan apa pun yang tertulis di perjanjian hari ini.
Menurut IFRS 15 maupun ASC 606, consignor hampir selalu menjadi pihak utama dalam pengaturan ini, karena tetap memegang kendali atas barang, menanggung risiko inventaris, dan biasanya menetapkan atau menyetujui harga jual kembali. Itu berarti consignor mengakui pendapatan dan harga pokok penjualan dalam jumlah bruto pada saat kendali berpindah ke pelanggan akhir, bukan saat barang dikirim ke consignee dan bukan saat kas diterima. Bagian consignee adalah beban komisi, bukan pengurang pendapatan, karena consignor melaporkan secara bruto, bukan neto.
// Fired only when the consignee reports an end-customer sale,
// never at physical receipt of the consigned goods.
function postConsignmentSale(saleReport: ConsignmentSaleReport) {
const { itemId, qtySold, sellingPrice, commissionRate, costRate } = saleReport
// 1. Recognize revenue (consignor is principal -> gross reporting)
journal.post([
{ account: 'AccountsReceivable_Consignee', debit: qtySold * sellingPrice },
{ account: 'SalesRevenue', credit: qtySold * sellingPrice },
])
// 2. Relieve consignment inventory, recognize COGS
journal.post([
{ account: 'COGS', debit: qtySold * costRate },
{ account: 'ConsignmentInventory', credit: qtySold * costRate },
])
// 3. Accrue the consignee's commission as an expense, net at settlement
const commission = qtySold * sellingPrice * commissionRate
journal.post([
{ account: 'CommissionExpense', debit: commission },
{ account: 'AccountsPayable_Consignee', credit: commission },
])
}Sebagian besar kesulitan pada modul inventaris konsinyasi berasal dari beberapa kesalahan berulang yang mudah dihindari jika dirancang sejak awal, bukan ditambal setelah klien mengeluh.
Pastikan pembagian dua buku besar benar sejak level skema, dan sisa alur kerja konsinyasi, perjanjian, penerimaan, laporan penjualan, penyelesaian, dan pengakuan pendapatan, akan berjalan sebagai rangkaian pencatatan voucher yang lugas alih-alih kumpulan logika kasus khusus yang berbelit.