Split Shipment Fulfillment with NetSuite

NetSuite natively supports partially fulfilling a SalesOrder. However, updating an ItemFulfillment record (NetSuite’s equivalent to a ‘package’ or ‘shipment’ in other systems nomenclature) after it’s been created comes with some unique edge cases in NetSuite.

Here’s the NetSuite state that I was operating in:

Sales Order is created. order_status = _partiallyFulfilled An ItemFulfillment exists with ship_status = _picked A CustomerDeposit representing the payment coming from an external system is associated with the SalesOrder The contents of the created ItemFulfillment need to be adjusted and a second ItemFulfillment needs to be created.

Here is some key information on how NetSuite’s ItemFulfillments work:

The order_line field is not set on an ItemFulfillments item list elements if the item is a “member” of another item in the item list. In other words, if you are fulfilling a KitItem or AssemblyItem the components of those items will appear on the ItemFulfillment’s item list but will not have a key (unique ID to reference them on the sub lisT) and thus cannot be updated. The item_receive flag is equivalent to the “Fulfill” column in the GUI. The replace_all flag on item_list must be set to false when updating an item list containing KitItems or AssemblyItems. Also, all items without an order line must be removed from the item_list. If they are not removed, the following fatal error will be thrown: “Adding new line to sublist item is not allowed.”

Using the NetSuite SuiteTalk ruby gem, here’s how to remove items from an existing ItemFulfillment:

item_fulfillment.item_list.item.each do |i| i.item_receive = false i.quantity = 0 end item_fulfillment.item_list.replace_all = false item_fulfillment.item_list.items.reject! { |i| i.order_line.blank? } item_fulfillment.update(item_list: item_fulfillment.item_list)

Continue Reading