Auto PO Creation And Item Line Closing.

The client would like to create a customization that will close the item lines in the purchase order that are not received and create a new purchase order for the unreceived items.

We can create a user event script that can be deployed in the Item receipt

/**
 * @NApiVersion 2.1
 * @NScriptType UserEventScript
 */
/*******************************************************************
 *   UserEvent Script
 ****************************************************************
 *
 * Date: 25/12/2022
 *
 * Author: Jobin and Jismi IT Services LLP
 *
 * REVISION HISTORY
 *
 * Revision 1.0
 *
 * Description: Auto PO creation and item line closing
 *
 * Revision 2.0
 *
 *
 ***************************************************************/
define(['N/email', 'N/file', 'N/record', 'N/search','N/ui/serverWidget','N/format'],
    /**
     * @param{email} email
     * @param{file} file
     * @param{record} record
     * @param{search} search
     */
    (email, file, record, search,serverWidget,format) => {
        let poorderLine;
        let poCount;
        let itemArray = [];
        let newItemArray=[];
        let itemDataArray=[];
        let closedItemArray=[];


        /**
         * @description the fuctcion to remove null value from the array
         * @param array - array containing elements
         */

        function removeNull(newItemArray) {
            try {
                return newItemArray.filter(element => {
                    return element !== null;
                });

            } catch (e) {
                log.debug("error @removeNull function", e)
            }
        }

        /**
         * @description the fuctcion to close line item in PO
         * @param newObjRec - new po record
         *  @param i - line to close
         */

        function closeLineItem(poRecord, i) {
            try {
                poRecord.setSublistValue({
                    sublistId: 'item',
                    fieldId: 'isclosed',
                    value: true,
                    line: i,
                    ignoreFieldChange: true
                })

            } catch (e) {
                log.error("error @ function closeLineItem", e)
            }
        }

        /**
         * @description the fuctcion to insert new item line to PO
         * @param a - array containing elements
         *  @param newObjRec - new po record
         */
        function addItemLines(newPoOrder,newItemArray) {
            try {
                let arr = removeNull(newItemArray)
                log.debug("arr", arr)
                for (let i = 0; i < arr.length; i++) {
                    //set value to item line item field
                   // newPoOrder.selectNewLine({sublistId: 'item', line: i});
                    newPoOrder.setSublistValue({
                        sublistId: 'item',
                        fieldId: 'item',
                        line: i,
                        value: arr[i].itemName
                    });
                    newPoOrder.setSublistValue({
                        sublistId: 'item',
                        fieldId: 'quantity',
                        line: i,
                        value: arr[i].quantity
                    });
                   // newPoOrder.commitLine({sublistId: 'item'});

                }

                let newObjRecId = newPoOrder.save({
                    enableSourcing:true,
                    ignoreMandatoryFields:true
                });
                log.debug("newObjRecId", newObjRecId)
                return newObjRecId;

            } catch (e) {
                log.error("error @addItemLines function", e)
            }

        }

        function purchaseOrderDetails(poRecordsId){
            try {
                let itemArray=[]
                let purchaseorderSearchObj = search.create({
                    type: "purchaseorder",
                    filters:
                        [
                            ["type","anyof","PurchOrd"],
                            "AND",
                            ["internalid","anyof",poRecordsId],
                            "AND",
                            ["mainline","is","T"]
                        ],
                    columns:
                        [
                            search.createColumn({
                                name: "internalid",
                                join: "vendor",
                                label: "Internal ID"
                            }),
                            search.createColumn({
                                name: "trandate", label: "Date"
                            }),
                            search.createColumn({name: "currency", label: "Currency"}),
                            search.createColumn({
                                name: "internalid",
                                join: "location",
                                label: "Internal ID"
                            }),
                 search.createColumn({name: "exchangerate", label: "Exchange Rate"}),
                search.createColumn({name: "custbody_bil_type", label: "BILL TYPE"}),
               search.createColumn({name: "custbody_purchase_remarks", label: "Remarks"}),
                search.createColumn({name: "subsidiary", label: "Subsidiary"})
                  
                           
                        ]
                });
                let searchResultCount = purchaseorderSearchObj.runPaged().count;
                log.debug("purchaseorderSearchObj result count",searchResultCount);
                let itemObj = {}
                if (searchResultCount > 0){

                    purchaseorderSearchObj.run().each(function(result){
                        // .run().each has a limit of 4,000 results
                        //return true;
                        itemObj.memberId =  result.getValue({
                            name: "internalid",
                            join: "vendor",
                            label: "Internal ID"
                        }),
                        itemObj.memberDate =  result.getValue({
                        name: "trandate",
                            label: "Date"
                        }),
                            itemObj.memberCurrency =  result.getValue({
                                name: "currency",
                                label: "Currency"
                            })
                        itemObj.memberLocation =  result.getValue({
                            name: "internalid",
                            join: "location",
                            label: "Internal ID"
                        })
                        itemObj.memberExcRate =  result.getValue({
                            name: "exchangerate",
                            label: "Exchange Rate"
                        })
                        itemObj.memberBillType =  result.getValue({
                            name: "custbody_bil_type",
                            label: "BILL TYPE"
                        })
                        itemObj.memberRemarks =  result.getValue({
                            name: "custbody_purchase_remarks",
                            label: "Remarks"
                        })
                        itemObj.memberSub =  result.getValue({
                            name: "subsidiary",
                            label: "Subsidiary"
                        })
                        return true;
                    });
                    log.debug("itemObj",itemObj)
                    return itemObj;
                }


            }catch (e) {
                log.debug("error @ search function", e)

            }
        }

        /**
         * Defines the function definition that is executed before record is loaded.
         * @param {Object} scriptContext
         * @param {Record} scriptContext.newRecord - New record
         * @param {string} scriptContext.type - Trigger type; use values from the context.UserEventType enum
         * @param {Form} scriptContext.form - Current form
         * @param {ServletRequest} scriptContext.request - HTTP request information sent from the browser for a client action only.
         * @since 2015.2
         */
        const beforeLoad = (scriptContext) => {
            try {
                if (scriptContext.type === 'create') {
                    let recObj = scriptContext.newRecord;
                    let poRecordId = recObj.getText({fieldId: 'createdfrom'})
                    let poRecIntId = recObj.getValue({fieldId: 'createdfrom'})
                    let form = scriptContext.form;


                    // add a custom button in IR record
                    scriptContext.form.addButton({
                        id: 'custpage_item_receive',
                        label: 'REJECT ITEM RECEIVING',
                        functionName: "createRejectReason('" + poRecordId + "','" + poRecIntId + "')"
                    });
                    //scriptContext.form.clientScriptModulePath='/SuiteScripts/JJ CL Cust Button Redirect MAMS-44.js';
                    scriptContext.form.clientScriptFileId = 16274
                }

            } catch (e) {
                log.error("error @ before load function", e)
            }
        }

        /**
         * Defines the function definition that is executed after record is submitted.
         * @param {Object} scriptContext
         * @param {Record} scriptContext.newRecord - New record
         * @param {Record} scriptContext.oldRecord - Old record
         * @param {string} scriptContext.type - Trigger type; use values from the context.UserEventType enum
         * @since 2015.2
         */
        const afterSubmit = (scriptContext) => {
            try{
                let contextMode = scriptContext.type;
                if (contextMode === scriptContext.UserEventType.CREATE) {
                    let irRecord = scriptContext.newRecord;

                    //check whether the checkbox is checked in the IR record

                    let isCheckedClosePO = irRecord.getValue({fieldId: 'custbody_jj_closing_po'})
                    if (isCheckedClosePO === true) {

                        // load the PO

                        let poRecordsId = irRecord.getValue({fieldId: 'createdfrom'})
                        log.debug("poRecordsId", poRecordsId)
                        let poRecord = record.load({
                            type: record.Type.PURCHASE_ORDER,
                            id: poRecordsId,
                            //isDynamic: true,
                        });
                        let transnDate=poRecord.getText({fieldId:'trandate'})
                        log.debug("transnDate2", new Date(transnDate))
                        poCount = poRecord.getLineCount({sublistId: 'item'});

                        // loop through the PO item lines
                        let i;

                        for ( i = 0; i < poCount; i++) {
                            let poItemId = poRecord.getSublistValue({sublistId: 'item', fieldId: 'item', line: i})
                            poorderLine = poRecord.getSublistValue({fieldId: 'orderline', sublistId: 'item', line: i})
                            let poQnty = poRecord.getSublistValue({sublistId: 'item', fieldId: 'quantity', line: i})
                            log.debug("poQnty", poQnty)
                            let poQntyRecevd = poRecord.getSublistValue({
                                sublistId: 'item',
                                fieldId: 'quantityreceived',
                                line: i
                            })
                            log.debug("poQntyRecevd", poQntyRecevd)
                            let closedPO = poRecord.getSublistValue({
                                sublistId: 'item',
                                fieldId: 'isclosed',
                                line: i
                            })
                            log.debug("closedPO", closedPO)

                            // set the line item to 'closed' if quantity received is zero

                            if (poQntyRecevd == 0 && closedPO == false)
                             {

                                let itemData = {
                                    itemName: poItemId,
                                    quantity: poQnty,
                                };
                                itemArray.push(itemData)
                                log.debug("itemArray", itemArray)

                                closeLineItem(poRecord, i)

                            }
                          else
                                if (poQntyRecevd == 0 && closedPO == true){

                                    let itemData = {
                                        itemName: poItemId,
                                        quantity: poQnty,
                                    };
                                    closedItemArray.push(itemData)
                                    log.debug("closedItemArray", closedItemArray)

                                }

                        else {

                                // close the PO item line and add new line for received quantity if the received quantity is less than
                                // actual quantity, also create new PO for rest of the items

                                if (poQnty > poQntyRecevd) {
                                    let newPOQnty = poQnty - poQntyRecevd;
                                    log.debug("newPOQnty", newPOQnty)

                                    let itemData = {
                                        itemName: poItemId,
                                        quantity: newPOQnty,
                                    };
                                    itemDataArray.push(itemData)
                                    log.debug("itemDataArray", itemDataArray)
                                    poRecord.setSublistValue({
                                        sublistId: "item",
                                        fieldId: "quantity",
                                        value: poQntyRecevd,
                                        line: i
                                    });

                                    // close the item line if the quantity>quantityreceived
                                   // closeLineItem(poRecord, i)
                                }

                            }
                        }
                        // add new item line to the PO record  with new quantity if quantity>quantityReceived
                        for (let k = 0; k < itemDataArray.length; k++) {
                            var lineCount = poRecord.getLineCount({sublistId: 'item'});
                            poRecord.setSublistValue({
                                sublistId: "item",
                                fieldId: "item",
                                value: itemDataArray[k].itemName,
                                line: lineCount,

                            });
                            poRecord.setSublistValue({
                                sublistId: "item",
                                fieldId: "quantity",
                                value: itemDataArray[k].quantity,
                                line: lineCount
                            });
                            closeLineItem(poRecord, lineCount)

                        }
                        poRecord.save({
                            enableSourcing: true,
                            ignoreMandatoryFields: true,

                        })

                        let newPoItemDetails=purchaseOrderDetails(poRecordsId)
                        log.debug("newPoItemDetails",newPoItemDetails)
                        let newPoOrder=record.create({
                            type: record.Type.PURCHASE_ORDER,
                        })
                        newPoOrder.setValue({fieldId:'entity',value:newPoItemDetails.memberId})

                       // newPoOrder.setValue({fieldId:'trandate',value:})
                        let parsedDate=format.parse({value:newPoItemDetails.memberDate, type: format.Type.DATE})
                        newPoOrder.setValue({fieldId:'trandate',value:parsedDate})
                        newPoOrder.setValue({fieldId:'currency',value:newPoItemDetails.memberCurrency})
                        newPoOrder.setValue({fieldId:'location',value:newPoItemDetails.memberLocation})
                        newPoOrder.setValue({fieldId:'exchangerate',value:newPoItemDetails.memberExcRate})
                        newPoOrder.setValue({fieldId:'custbody_bil_type',value:newPoItemDetails.memberBillType})
                        if(newPoItemDetails.memberRemarks){
                            newPoOrder.setValue({fieldId:'custbody_purchase_remarks',value:newPoItemDetails.memberRemarks})
                        }
                        newPoOrder.setValue({fieldId:'subsidiary',value:newPoItemDetails.memberSub})
                        //newPoOrder.setValue({fieldId:'entity',value:newPoItemDetails.memberAddr})
                        newItemArray=itemArray.concat(itemDataArray);
                        log.debug("newItemArray", newItemArray)
                        var newobjRecId = addItemLines(newPoOrder,newItemArray)
                        log.debug("newobjRecId", newobjRecId)
                         record.submitFields({
                            type: record.Type.PURCHASE_ORDER,
                            id: poRecordsId,
                            values: {
                                'custbody_jj_childpo':newobjRecId
                            },
                            options: {
                                enableSourcing: false,
                                ignoreMandatoryFields: true
                            }
                        });
                        let id = record.submitFields({
                            type: record.Type.PURCHASE_ORDER,
                            id: newobjRecId,
                            values: {
                                'currency': newPoItemDetails.memberCurrency,
                                'location': newPoItemDetails.memberLocation,
                                'custbody_jj_createdpo':poRecordsId
                            },
                            options: {
                                enableSourcing: false,
                                ignoreMandatoryFields: true
                            }
                        });
                        log.debug("id", id)
                    }
                }

            }catch (e) {
                log.error("error @ after submit",e)
            }
        }
        return {beforeLoad, afterSubmit}

    });

Leave a comment

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