Di Odoo, setiap kali stok bergerak, sebenarnya ada cerita yang cukup panjang di belakangnya. Mulai dari barang datang ke gudang, dipindahkan antar lokasi, dipakai untuk produksi, sampai akhirnya dikirim ke customer. Semua langkah itu tidak cuma kelihatan di layar, tapi juga disimpan rapi di database. Dua tabel yang paling penting untuk urusan ini adalah stock_move dan stock_move_line.

Kita bisa bayangkan stock_move sebagai “rencana dan ringkasan pergerakan barang”. Satu baris di stock_move mewakili satu pergerakan logis: produk apa yang bergerak, jumlahnya berapa, dari lokasi mana ke lokasi mana, dan karena dokumen apa. Untuk operasi seperti penerimaan (receipt), pengiriman (delivery), atau internal transfer, baris di stock_move biasanya terhubung ke dokumen stock_picking. Di tampilan Odoo, inilah yang muncul sebagai Delivery Order, Receipt, atau Internal Transfer. Jadi, satu dokumen picking bisa punya beberapa baris produk, dan tiap baris produk itu punya satu record di stock_move.
Ketika masuk ke Manufacturing Order, stock_move tetap dipakai sebagai ringkasan pergerakan, tapi ada tambahan konteks. Di sini, Odoo perlu membedakan antara barang jadi yang masuk ke stok dan material/komponen yang keluar dari stok untuk dipakai produksi. Bedanya ada di field yang dipakai:
- Pergerakan barang jadi biasanya punya
production_id - Pergerakan material/komponen yang dikonsumsi punya
raw_material_production_id
Hanya dengan melihat stock_move, sebenarnya kita sudah bisa tahu: material apa saja yang digunakan di sebuah MO dan barang jadi apa yang dihasilkan. Tapi itu masih di level ringkasan.
Nah, di sinilah stock_move_line masuk. Kalau stock_move adalah rencana dan gambaran besarnya, stock_move_line adalah detail bagaimana pergerakan itu benar-benar terjadi di gudang. Satu stock_move bisa dipecah menjadi beberapa baris stock_move_line. Di stock_move_line inilah Odoo menyimpan detail seperti:
- Diambil dari lokasi fisik mana persisnya
- Masuk ke lokasi tujuan mana
- Pakai lot atau serial number yang mana
- Berapa qty yang benar-benar dipindahkan (
qty_done) - Kalau pergerakan di-split, bagian mana yang dari rak A, bagian mana dari rak B
Contohnya, di stock_move tertulis barang A pindah 10 unit dari Gudang 1 ke Lokasi Produksi. Tapi di lapangan, petugas mengambil 4 unit dari Rak-01 dan 6 unit dari Rak-02. Di database, tetap satu stock_move (10 unit), tapi akan ada dua stock_move_line: satu untuk 4 unit dari Rak-01, satu untuk 6 unit dari Rak-02. Jadi, secara bisnis tetap satu pergerakan, tapi secara fisik tercatat lengkap.
Di proses produksi, kombinasi kedua tabel ini jadi makin berguna. Dari stock_move kita bisa lihat:
- Material apa saja yang dipakai (raw_material_production_id)
- Barang jadi apa yang dihasilkan (production_id)
Lalu dari stock_move_line kita bisa detailkan:
- Material diambil dari lot mana
- Dari lokasi mana
- Kapan benar-benar diproses
- Berapa qty yang dipakai per lot
Kalau suatu saat kita perlu traceability, misalnya ingin menjawab: “Produk jadi dengan lot ini dibuat dari bahan baku lot apa saja?”, kita bisa menyusun jawabannya dari data di stock_move dan stock_move_line.
Pada akhirnya, kalau kita ingin benar-benar paham cara stok bekerja di Odoo, kita perlu melihat dua level ini sekaligus:
- stock_move untuk melihat alur bisnis dan rencana pergerakan
- stock_move_line untuk melihat detail fisik di gudang
Dengan memahami peran keduanya, kita jadi lebih mudah membuat laporan, menganalisis masalah stok, atau menjelaskan ke tim lain kenapa suatu angka stok bisa sampai seperti sekarang. Bukan cuma lihat “sisa stok berapa”, tapi juga mengerti bagaimana stok itu bisa sampai di angka tersebut.
