I am new to NetSuite domain. I want to create item Fulfillment from salces Order through RestLet post method. But when I send the data from postman show error that Please configure the inventory detail in line 2 of the item list.
/**
*@NApiVersion 2.x
*@NScriptType Restlet
*/
define(["N/search", "N/record", "N/cache", "N/log", "N/error",],
function (search, record, cache, log, error) {
function _post(context) {
try {
if (context != null && context != "") {
var recidArr = [];
for (var i = 0; i < context.length; i++) {
var contextObj = context[i];
log.debug("contextObj", contextObj);
var salesOrderId = contextObj.salesOrderId;
var trandate = contextObj.trandate;
var ifStage = contextObj.ifStage;
var memo = contextObj.memo;
var itemList = contextObj.itemList;
var tranDetail = search.lookupFields({
type: record.Type.SALES_ORDER,
id: salesOrderId,
columns: 'status'
});
var soStatusDetail = tranDetail.status
var soStatus = soStatusDetail[0].text
if (soStatus == "Partially Fulfilled" || soStatus == "Pending Fulfillment") {
var itemFulfillmentObj = record.transform({
fromType: record.Type.SALES_ORDER,
fromId: salesOrderId,
toType: record.Type.ITEM_FULFILLMENT,
isDynamic: true,
});
if (trandate) {
itemFulfillmentObj.setText("trandate", trandate);
}
if (memo) {
itemFulfillmentObj.setValue("memo", memo);
}
itemFulfillmentObj.setValue("shipstatus", "B");
if (ifStage) {
itemFulfillmentObj.setValue("custbody_xxflx_fulfillmentstage", ifStage);
}
/// configure item fulfillment line label value
if (itemList) {
for (var j = 0; j < itemList.length; j++) {
var itemlistObject = itemList[j];
var item = itemlistObject.item;
var location = itemlistObject.location;
var quantity = itemlistObject.quantity;
var inventoryDetail = itemlistObject.inventoryDetail;// this is inventory detail configuration
var checkLotSerial = fetchItemLotOrSerial(item);
log.debug('checkLotSerial for item:', JSON.stringify(checkLotSerial) + '(item:)' + item)
var itemLine = itemFulfillmentObj.findSublistLineWithValue({
sublistId: 'item',
fieldId: 'item',
value: item
});
if (itemLine >= 0) {
itemFulfillmentObj.selectLine({
sublistId: 'item',
line: itemLine
});
itemFulfillmentObj.setCurrentSublistValue({
sublistId: "item",
fieldId: "itemreceive",
value: true,
});
if (quantity) {
itemFulfillmentObj.setCurrentSublistValue({
sublistId: "item",
fieldId: "quantity",
value: quantity,
});
}
if (location) {
itemFulfillmentObj.setCurrentSublistValue({
sublistId: "item",
fieldId: "location",
value: location,
});
}
/// configure inventory details configuration
if (checkLotSerial.isSerialized == true || checkLotSerial.isLot == true) {
if (inventoryDetail) {
var inventoryDetails = itemFulfillmentObj.getCurrentSublistSubrecord({
sublistId: 'item', // inventory or item
fieldId: 'inventorydetail',
});
for (var k = 0; k < inventoryDetail.length; k++) {
var lotSerialNo = inventoryDetail[k].lotSerialNo
var qty = inventoryDetail[k].qty
var status = inventoryDetail[k].status
inventoryDetails.selectNewLine({
sublistId: 'inventoryassignment'
});
if (lotSerialNo) {
inventoryDetails.setCurrentSublistValue({
sublistId: 'inventoryassignment',
fieldId: 'issueinventorynumber',
value: lotSerialNo
});
}
if (qty) {
inventoryDetails.setCurrentSublistValue({
sublistId: 'inventoryassignment',
fieldId: 'quantity',
value: qty
});
}
if (status) {
inventoryDetails.setCurrentSublistValue({
sublistId: 'inventoryassignment',
fieldId: 'inventorystatus',
value: status
});
}
inventoryDetails.commitLine({
sublistId: 'inventoryassignment'
});
}
}
else {
throw 'no inventory detail found for a lot/serial controlled item'
}
}
}
else {
throw 'items not found for fulfilment'
}
itemFulfillmentObj.commitLine({
sublistId: "item",
});
}
}
var itemFulfillmentId = itemFulfillmentObj.save({
enableSourcing: true,
ignoreMandatoryFields: true,
});
log.debug("itemFulfillmentId", itemFulfillmentId);
if (itemFulfillmentId) {
recidArr.push(itemFulfillmentId);
}
}
}
if (recidArr.length > 0) {
return {
success: true,
status: "200",
created: "Records Created Successfully : " + recidArr
};
} else {
return {
success: false,
status: "500",
message: "No Records Created"
};
}
}
} catch (err) {
log.debug({
title: "POST",
details: JSON.stringify(err),
});
return err;
}
}
///// GET |||
function get(datain) {
try {
if (!isEmpty(datain)) {
//var recIdArr = []
// for (var i = 0; i < datain.length; i++) {
var contextObj = datain[i];
log.debug('contextObj', contextObj)
var ifId = datain.ifId;
var ifStatus = datain.ifStatus;
if (!isEmpty(ifId) && !isEmpty(ifStatus)) {
record.submitFields({
type: record.Type.ITEM_FULFILLMENT,
id: ifId,
values: { 'custbody_xxflx_fulfillmentstage': ifStatus },
})
return "IF has been updated successfully, Id: " + ifId
}
// }
}
} catch (e) {
log.debug(e.name, e.message);
return {
success: false,
status: "500",
message: e.message
};
}
}
function fetchItemLotOrSerial(item) {
var isSerialized;
var isLot;
if (item != null && item != '') {
var itemSearchObj = search.create({
type: "item",
filters: [
["internalid", "is", item]
],
columns: [
search.createColumn({
name: "isserialitem"
}),
search.createColumn({
name: "islotitem"
})
]
});
var cols = itemSearchObj.columns;
var searchResultCount = itemSearchObj.runPaged().count;
itemSearchObj.run().each(function (result) {
isSerialized = result.getValue(cols[0]);
isLot = result.getValue(cols[1]);
log.debug('isSerialized', isSerialized);
log.debug('isLot', isLot);
return true;
});
}
return {
isSerialized: isSerialized,
isLot: isLot
};
}
function isEmpty(obj) {
return obj == null || obj == '' || obj == undefined;
}
return {
post: _post,
get: get,
};
});