Inventory database
inventory memisahkan definisi item dari stok fisik. InventoryItem mengarah ke product catalog melalui productId, sedangkan quantity berada pada warehouse/batch.
Model dan ownership
WarehousedanWarehouseBinadalah lokasi organisasi.InventoryItemadalah SKU/unit dengan status, minStock, barcode, dan valuation method.WarehouseStockadalah aggregate quantity unik per warehouse dan item.InventoryBatchmenyimpan expiration dan remaining quantity.InventoryMovementadalah ledger event; perlakukan sebagai immutable.InventoryTransfermengoordinasikan perpindahan antar warehouse.
Aturan mutasi stok
Jangan mengubah quantity tanpa membuat movement yang mencatat previousStock, currentStock, actor, reference, dan warehouse. Gunakan atomic update atau optimistic concurrency untuk mencegah lost update. WarehouseStock memiliki unique pair [warehouseId, inventoryItemId].
Valuation method yang tersedia adalah FIFO, LIFO, FEFO, dan average cost. FEFO harus memilih batch dengan expiration terdekat yang masih memiliki quantity.
Cross-database reference
Validasi organizationId melalui runner dan productId melalui catalog sebelum membuat inventory item. Inventory tidak boleh menghapus product catalog; archive dilakukan pada owner domain.