Jira Code: PROT-176
These are the script used to display the page, used to search the Sales order, pick items and create item fulfillment via the single so pickup screen
/**
* @NApiVersion 2.x
* @NScriptType Suitelet
* @NModuleScope SameAccount
*/
/**
* Script Description
* This suitelet to search inventory lots and bins
*/
/*******************************************************************************
*
*
* NetSuite Name :PROT-176 JJ SL Search Lot
* Script ID: customscriptprot_176_jj_sl_search_lot
*
* *****************************************************************************
*
*
* $Author: Jobin & Jismi IT Services LLP $
*
* DESCRIPTION
* This suitelet to search inventory lots and bins
*
* Date Created :08-03-2019
*
* REVISION HISTORY Update:
*
*
*
******************************************************************************/
define(['N/search'],
function(search, file) {
var main = {
onRequest: function(context) {
var itemId = context.request.parameters.itemId;
log.debug('itemId', itemId);
var results = main.SearchLot(itemId);
log.debug('results', results)
if (results)
context.response.write(JSON.stringify(results));
else
context.response.write('FAILED');
},
SearchLot: function(id) {
var results = {};
var inventorynumberSearchObj = search.create({
type: "inventorynumber",
filters: [
["item.internalidnumber", "equalto", id],
"AND",
["location", "anyof", "1"],
"AND",
["quantityavailable", "greaterthan", "0"]
],
columns: [
search.createColumn({ name: "internalid", label: "Internal ID" }),
search.createColumn({ name: "inventorynumber", label: "Number" }),
search.createColumn({ name: "item", label: "Item" }),
search.createColumn({ name: "expirationdate", label: "Expiration Date" }),
search.createColumn({ name: "location", label: "Location" }),
search.createColumn({ name: "quantityavailable", label: "Available" }),
search.createColumn({ name: "binnumber", join: "item", label: "Bin Number" })
]
});
var searchResultCount = inventorynumberSearchObj.runPaged().count;
if (searchResultCount < 1)
return false;
else {
inventorynumberSearchObj.run().each(function(result) {
var obj = {
id: result.getValue({ name: "internalid", label: "Internal ID" }),
lot: result.getValue({ name: "inventorynumber", label: "Number" }),
bin: main.SearchBin(result.getValue({ name: "binnumber", join: "item", label: "Bin Number" })),
available: ''
};
results[obj.id] = obj;
results[obj.id].available = main.SearchAvailable(id, results[obj.id].bin.value, results[obj.id].lot);
return true;
});
}
return results;
},
SearchBin: function(binName) {
log.debug('binName', binName)
var binSearchObj = search.create({
type: "bin",
filters: [
["binnumber", "is", binName]
],
columns: [
search.createColumn({ name: "binnumber", label: "Bin Number" }),
search.createColumn({ name: "internalid", label: "Internal Id" })
]
}).run().getRange({ start: 0, end: 2 });
var bin = {
text: binSearchObj[0].getValue({ name: "binnumber", label: "Bin Number" }),
value: binSearchObj[0].getValue({ name: "internalid", label: "Internal Id" })
};
return bin;
},
SearchAvailable: function(ITEM_ID, BIN, LOT) {
var itemSearchObj = search.create({
type: "item",
filters: [
["internalidnumber", "equalto", ITEM_ID],
"AND",
["inventorynumberbinonhand.binnumber", "anyof", BIN],
"AND",
["inventorynumberbinonhand.inventorynumber", "is", LOT]
],
columns: [
search.createColumn({
name: "quantityavailable",
join: "inventoryNumberBinOnHand",
label: "Available"
})
]
}).run().getRange({ start: 0, end: 2 });
if (itemSearchObj.length > 0)
return itemSearchObj[0].getValue({ name: "quantityavailable", join: "inventoryNumberBinOnHand", label: "Available" });
else
return 0;
}
}
for (var key in main) {
if (typeof main[key] === 'function') {
main[key] = trycatch(main[key], key);
}
}
function trycatch(myfunction, key) {
return function() {
try {
return myfunction.apply(this, arguments);
} catch (e) {
log.debug("e in " + key, e);
}
}
};
return main;
});
/**
* @NApiVersion 2.x
* @NScriptType Suitelet
* @NModuleScope SameAccount
*/
/**
* Script Description
* This suitelet to search inventory lots and bins
*/
/*******************************************************************************
*
*
* NetSuite Name :PROT-176 JJ SL Search Lot
* Script ID: customscriptprot_176_jj_sl_search_lot
*
* *****************************************************************************
*
*
* $Author: Jobin & Jismi IT Services LLP $
*
* DESCRIPTION
* This suitelet to search inventory lots and bins
*
* Date Created :08-03-2019
*
* REVISION HISTORY Update:
*
*
*
******************************************************************************/
define(['N/search'],
function(search, file) {
var main = {
onRequest: function(context) {
var itemId = context.request.parameters.itemId;
log.debug('itemId', itemId);
var results = main.SearchLot(itemId);
log.debug('results', results)
if (results)
context.response.write(JSON.stringify(results));
else
context.response.write('FAILED');
},
SearchLot: function(id) {
var results = {};
var inventorynumberSearchObj = search.create({
type: "inventorynumber",
filters: [
["item.internalidnumber", "equalto", id],
"AND",
["location", "anyof", "1"],
"AND",
["quantityavailable", "greaterthan", "0"]
],
columns: [
search.createColumn({ name: "internalid", label: "Internal ID" }),
search.createColumn({ name: "inventorynumber", label: "Number" }),
search.createColumn({ name: "item", label: "Item" }),
search.createColumn({ name: "expirationdate", label: "Expiration Date" }),
search.createColumn({ name: "location", label: "Location" }),
search.createColumn({ name: "quantityavailable", label: "Available" }),
search.createColumn({ name: "binnumber", join: "item", label: "Bin Number" })
]
});
var searchResultCount = inventorynumberSearchObj.runPaged().count;
if (searchResultCount < 1)
return false;
else {
inventorynumberSearchObj.run().each(function(result) {
var obj = {
id: result.getValue({ name: "internalid", label: "Internal ID" }),
lot: result.getValue({ name: "inventorynumber", label: "Number" }),
bin: main.SearchBin(result.getValue({ name: "binnumber", join: "item", label: "Bin Number" })),
available: ''
};
results[obj.id] = obj;
results[obj.id].available = main.SearchAvailable(id, results[obj.id].bin.value, results[obj.id].lot);
return true;
});
}
return results;
},
SearchBin: function(binName) {
log.debug('binName', binName)
var binSearchObj = search.create({
type: "bin",
filters: [
["binnumber", "is", binName]
],
columns: [
search.createColumn({ name: "binnumber", label: "Bin Number" }),
search.createColumn({ name: "internalid", label: "Internal Id" })
]
}).run().getRange({ start: 0, end: 2 });
var bin = {
text: binSearchObj[0].getValue({ name: "binnumber", label: "Bin Number" }),
value: binSearchObj[0].getValue({ name: "internalid", label: "Internal Id" })
};
return bin;
},
SearchAvailable: function(ITEM_ID, BIN, LOT) {
var itemSearchObj = search.create({
type: "item",
filters: [
["internalidnumber", "equalto", ITEM_ID],
"AND",
["inventorynumberbinonhand.binnumber", "anyof", BIN],
"AND",
["inventorynumberbinonhand.inventorynumber", "is", LOT]
],
columns: [
search.createColumn({
name: "quantityavailable",
join: "inventoryNumberBinOnHand",
label: "Available"
})
]
}).run().getRange({ start: 0, end: 2 });
if (itemSearchObj.length > 0)
return itemSearchObj[0].getValue({ name: "quantityavailable", join: "inventoryNumberBinOnHand", label: "Available" });
else
return 0;
}
}
for (var key in main) {
if (typeof main[key] === 'function') {
main[key] = trycatch(main[key], key);
}
}
function trycatch(myfunction, key) {
return function() {
try {
return myfunction.apply(this, arguments);
} catch (e) {
log.debug("e in " + key, e);
}
}
};
return main;
});
/**
* @NApiVersion 2.x
* @NScriptType Suitelet
* @NModuleScope SameAccount
*/
/**
* Script Description
* This suitelet is used create Item fulfillment from SO.
*/
/*******************************************************************************
*
*
* NetSuite Name :PROT-176 JJ Create Item fulfillment
* Script ID:
*
* *****************************************************************************
*
*
* $Author: Jobin & Jismi IT Services LLP $
*
* DESCRIPTION
* This suitelet is used create Item fulfillment from SO.
*
* Date Created :09-03-2019
*
* REVISION HISTORY Update:
*
*
*
******************************************************************************/
var CONTEXT;
define(['N/search', 'N/record'],
function(search, record) {
var main = {
onRequest: function(context) {
CONTEXT = context;
if (context.request.method === 'POST') {
var itemObj = context.request.body;
log.debug('itemObj', itemObj);
var IF_CREATE = false;
itemObj = JSON.parse(itemObj);
for (var key in itemObj) {
//log.debug('itemObj[key].Lots', itemObj[key].Lots);
if (itemObj[key].Lots) {
//log.debug('itemObj[key].Lots', itemObj[key].Lots);
if (Object.keys(itemObj[key].Lots).length) {
IF_CREATE = true;
break;
}
}
}
if (IF_CREATE) {
var IF_tranid = main.CreateIF(itemObj);
var response = {
text: 'SUCCESS',
value: IF_tranid
}
context.response.write(JSON.stringify(response));
} else {
var response = {
text: 'FAIL',
value: 0
}
context.response.write(JSON.stringify(response));
}
}
},
CreateIF: function(ITEMS) {
var SOID = ITEMS[Object.keys(ITEMS)[0]].internalid;
var IF_RECORD = record.transform({
fromType: record.Type.SALES_ORDER,
fromId: SOID,
toType: record.Type.ITEM_FULFILLMENT,
isDynamic: true,
});
var ITEM_LINECOUNT = IF_RECORD.getLineCount({
sublistId: 'item'
});
for (var i = 0; i < ITEM_LINECOUNT; i++) {
IF_RECORD.selectLine({ sublistId: 'item', line: i });
var item = IF_RECORD.getCurrentSublistValue({
sublistId: 'item',
fieldId: 'item'
});
var onHand = IF_RECORD.getCurrentSublistValue({
sublistId: 'item',
fieldId: 'onhand'
});
var qtyCommitted = IF_RECORD.getCurrentSublistValue({
sublistId: 'item',
fieldId: 'quantitycommitted'
});
var line = IF_RECORD.getCurrentSublistValue({
sublistId: 'item',
fieldId: 'line'
});
if (onHand == '0' || onHand == 0) {
//log.debug('ONHAND', line);
var setKitQty = main.setQuantity(item, ITEMS, Number(qtyCommitted), IF_RECORD);
if (setKitQty) {
IF_RECORD.commitLine({
sublistId: 'item'
});
}
} else {
var quantity = Number(IF_RECORD.getCurrentSublistValue({
sublistId: 'item',
fieldId: 'quantity'
}));
//log.debug('ELSEline', line + ' ' + item);
//log.debug('quantityELSEline', quantity);
if (quantity > 0) {
var setMemberInventory = main.setInventory(IF_RECORD, item, ITEMS, Number(qtyCommitted));
IF_RECORD.commitLine({
sublistId: 'item'
});
} else {
if (ITEMS[item]) {
if (Number(ITEMS[item].SetQty) != 0) {
if (Number(qtyCommitted) > Number(ITEMS[item].SetQty)) {
IF_RECORD.setCurrentSublistValue({
sublistId: 'item',
fieldId: 'quantity',
value: ITEMS[item].SetQty
});
ITEMS[item].SetQty = 0;
var setMemberInventory = main.setInventory(IF_RECORD, item, ITEMS, Number(qtyCommitted));
IF_RECORD.commitLine({
sublistId: 'item'
});
} else if (Number(qtyCommitted) < Number(ITEMS[item].SetQty)) {
IF_RECORD.setCurrentSublistValue({
sublistId: 'item',
fieldId: 'quantity',
value: Number(qtyCommitted)
});
ITEMS[item].SetQty = Number(ITEMS[item].SetQty) - Number(qtyCommitted);
var setMemberInventory = main.setInventory(IF_RECORD, item, ITEMS, Number(qtyCommitted));
IF_RECORD.commitLine({
sublistId: 'item'
});
} else if (Number(qtyCommitted) == Number(ITEMS[item].SetQty)) {
IF_RECORD.setCurrentSublistValue({
sublistId: 'item',
fieldId: 'quantity',
value: Number(qtyCommitted)
});
ITEMS[item].SetQty = 0;
var setMemberInventory = main.setInventory(IF_RECORD, item, ITEMS, Number(qtyCommitted));
IF_RECORD.commitLine({
sublistId: 'item'
});
}
}
}
}
}
}
var ID = IF_RECORD.save();
log.debug('ID', ID);
var IF_RECORD = record.load({
type: record.Type.ITEM_FULFILLMENT,
id: ID,
isDynamic: true
});
var tranid = IF_RECORD.getText({
fieldId: 'tranid'
});
return tranid;
},
setInventory: function(RECORD, ITEM_ID, ITEMS, COMMITTED) {
var LOTS = ITEMS[ITEM_ID].Lots;
var Inventory = RECORD.getCurrentSublistSubrecord({
sublistId: 'item',
fieldId: 'inventorydetail'
});
for (var key in LOTS) {
if (COMMITTED > 0 && Number(LOTS[key].Quantity) != 0) {
var INV_LINECOUNT = Inventory.getLineCount({
sublistId: 'inventoryassignment'
});
//log.debug('INV_LINECOUNT', INV_LINECOUNT);
Inventory.selectNewLine({
sublistId: 'inventoryassignment'
});
Inventory.setCurrentSublistValue({
sublistId: 'inventoryassignment',
fieldId: 'issueinventorynumber',
value: LOTS[key].LotId
});
Inventory.setCurrentSublistValue({
sublistId: 'inventoryassignment',
fieldId: 'binnumber',
value: LOTS[key].BinID
});
var LotQty = Number(LOTS[key].Quantity);
if (COMMITTED > LotQty) {
Inventory.setCurrentSublistValue({
sublistId: 'inventoryassignment',
fieldId: 'quantity',
value: LOTS[key].Quantity
});
COMMITTED = COMMITTED - Number(LOTS[key].Quantity);
LOTS[key].Quantity = 0;
} else if (COMMITTED < LotQty) {
Inventory.setCurrentSublistValue({
sublistId: 'inventoryassignment',
fieldId: 'quantity',
value: COMMITTED
});
COMMITTED = 0;
LOTS[key].Quantity = Number(LOTS[key].Quantity) - COMMITTED;
} else if (COMMITTED == LotQty) {
Inventory.setCurrentSublistValue({
sublistId: 'inventoryassignment',
fieldId: 'quantity',
value: COMMITTED
});
COMMITTED = 0;
LOTS[key].Quantity = Number(LOTS[key].Quantity) - COMMITTED;
}
Inventory.commitLine({
sublistId: 'inventoryassignment'
});
}
}
return true;
},
setQuantity: function(ITEM_ID, ITEMS, COMMITTED, IF_RECORD) {
var getMemberItems = main.getMemberItems(ITEM_ID);
var set;
for (var key in getMemberItems) {
if (ITEMS[key]) {
if (Number(ITEMS[key].SetQty) != 0) {
if (COMMITTED > Number(ITEMS[key].SetQty)) {
IF_RECORD.setCurrentSublistValue({
sublistId: 'item',
fieldId: 'quantity',
value: ITEMS[key].SetQty
});
ITEMS[key].SetQty = 0;
} else if (COMMITTED < Number(ITEMS[key].SetQty)) {
IF_RECORD.setCurrentSublistValue({
sublistId: 'item',
fieldId: 'quantity',
value: COMMITTED
});
ITEMS[key].SetQty = Number(ITEMS[key].SetQty) - COMMITTED;
} else if (COMMITTED == Number(ITEMS[key].SetQty)) {
IF_RECORD.setCurrentSublistValue({
sublistId: 'item',
fieldId: 'quantity',
value: COMMITTED
});
ITEMS[key].SetQty = 0;
}
}
return true;
} else
return false;
}
},
deteleLotWithZero: function(LOTS, KEY) {
if (Number(LOTS[KEY].Quantity) == 0)
delete LOTS[KEY];
},
getMemberItems: function(ITEMID) {
var Member = {};
var itemSearchObj = search.create({
type: "item",
filters: [
["internalidnumber", "equalto", ITEMID]
],
columns: [
search.createColumn({ name: "internalid", join: "memberItem", label: "Member ID" }),
search.createColumn({ name: "memberitem", label: "Member Item" }),
search.createColumn({ name: "memberquantity", label: "Member Quantity" })
]
});
var searchResultCount = itemSearchObj.runPaged().count;
itemSearchObj.run().each(function(result) {
var id = result.getValue({ name: "internalid", join: "memberItem", label: "Member ID" });
Member[id] = {
id: id,
name: result.getValue({ name: "memberitem", label: "Member Item" }),
qty: Number(result.getValue({ name: "memberquantity", label: "Member Quantity" }))
};
return true;
});
return Member;
}
}
for (var key in main) {
if (typeof main[key] === 'function') {
main[key] = trycatch(main[key], key);
}
}
function trycatch(myfunction, key) {
return function() {
try {
return myfunction.apply(this, arguments);
} catch (e) {
log.debug("e in " + key, e);
var response = {
text: 'ERROR',
value: 0
}
CONTEXT.response.write(JSON.stringify(response));
}
}
};
return main;
});