Suitelet for Single SO Pickup

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;
    });

Leave a comment

Your email address will not be published. Required fields are marked *