How to generate ASN XML

/**
 * @NApiVersion 2.1
 */
define(['N/record', 'N/search'],
    /**
     *
     * @param record record module
     * @param search search module
     * @returns ASN-XML String
     */
    (record, search) => {

        var errorStack = []
        /**
         * @description Check whether the given parameter argument has value on it or is it empty.
         * ie, To check whether a value exists in parameter
         * @param {*} parameter parameter which contains/references some values
         * @param {*} parameterName name of the parameter, not mandatory
         * @returns {Boolean} true if there exist a value, else false
         */
        function checkForParameter(parameter, parameterName) {
            if (parameter !== "" && parameter !== null && parameter !== undefined && parameter !== false && parameter !== "null" && parameter !== "undefined" && parameter !== " " && parameter !== 'false') {
                return true;
            } else {
                if (parameterName)
                    log.debug('Empty Value found', 'Empty Value for parameter ' + parameterName);
                return false;
            }
        }


        const xmlAsnShippingNote = {
            /**
             *
             * @param itemFulfillmentId - The item fulfillment id
             * @param exchangeRecordId - The record id of the exchange custom record
             * @param salesOrderId - The corresponding sales order internal id
             *
             */
            xmlAsnFile: function (itemFulfillmentId, exchangeRecordId) {
                try {
                    var ifObjRecord = record.load({
                        type: record.Type.ITEM_FULFILLMENT,
                        id: itemFulfillmentId,
                        isDynamic: true
                    });

                    let totalLinesDelivered = 0;
                    let totalQtyDelivered = 0;
                    let totalQtyOrdered = 0;
                    let isOrderComplete = false;
                     //fetch sales order details
                    const isNumberOrString = (value) => {
                        return (util.isString(value) || util.isNumber(value))
                    };
                    var eXchangeObjRecord = record.load({
                        type: 'customrecord_ahnz67_jj_foodstuffexchange',
                        id: exchangeRecordId,
                        isDynamic: true
                    })
                    log.debug("eXchangeObjRecord", eXchangeObjRecord)

                    //fetch sales order details
                    var soIds = eXchangeObjRecord.getValue({
                        fieldId: "custrecord_ahnz67_created_salesorder"
                    })
                    log.debug("soIds", soIds)
                    log.debug("soIds", soIds[0])
                    var soObjRecord = record.load({
                        type: record.Type.SALES_ORDER,
                        id: soIds[0],
                        isDynamic: true
                    });
                    var itemfulfillmentSearchObj = search.create({
                        type: "itemfulfillment",
                       // settings:[{"name":"consolidationtype","value":"ACCTTYPE"}],
                        filters:
                        [
                           ["type","anyof","ItemShip"], 
                           "AND", 
                           ["createdfrom","anyof",soIds], 
                           "AND", 
                           ["quantity","greaterthan","0"],
                           "AND", 
                           ["status","anyof","ItemShip:C"],
                           "AND", 
                           ["shipping","is","F"], 
                          "AND", 
                          ["taxline","is","F"], 
                          "AND", 
                          ["cogs","is","F"]
                       ],
                        columns:
                        [
                           search.createColumn({
                                name: "quantityuom", // Changed from "quantity" to "quantityuom"
                                summary: "SUM",
                                label: "Quantity in Transaction Units"
                            }),
                           search.createColumn({
                              name: "item",
                              summary: "GROUP",
                              label: "Item"
                           })
                        ]
                     });
                     var totalQuantityByItem = {}; // Object to store total quantity for each item
                     var searchResultCount = itemfulfillmentSearchObj.runPaged().count;
                     log.debug("itemfulfillmentSearchObj result count",searchResultCount);
                     itemfulfillmentSearchObj.run().each(function(result){
                        var itemId = result.getValue({ name: "item", summary: "GROUP" });
                        let totalQDelivered = parseFloat(result.getValue({ name: "quantityuom", summary: "SUM" }) || 0);
                          // Store the total quantity for this item
                        totalQuantityByItem[itemId] = totalQDelivered;
                        // Add to the overall total quantity
                        totalQtyDelivered += totalQDelivered;
                        // Log the total quantity for this item
                        log.debug("Item ID: " + itemId + " Total Quantity Fulfilled: " + totalQtyDelivered);
                        return true;
                     });
               
                    log.debug("Final quanity to delivered Object",totalQuantityByItem);
                    log.debug("Final quanity to delivered",totalQtyDelivered);
                    totalLinesDelivered = Object.keys(totalQuantityByItem).length;
                    log.debug("lineCount",totalLinesDelivered);
              
                    const salesOrderLineCount = soObjRecord.getLineCount({ sublistId: "item" });
                    const orderedQuantities = {};
                    // Sum up quantities from the sales order
                    for (let i = 0; i < salesOrderLineCount; i++) {
                        const itemId = soObjRecord.getSublistValue({
                            sublistId: "item",
                            fieldId: "item",
                            line: i,
                        });
                    
                        const qtyOrdered = parseFloat(
                            soObjRecord.getSublistValue({
                                sublistId: "item",
                                fieldId: "quantity",
                                line: i,
                            }) || 0
                        );
                    
                        orderedQuantities[itemId] = qtyOrdered || 0;
                        totalQtyOrdered += qtyOrdered;
                        log.debug("Running Total Qty Ordered", { itemId, qtyOrdered, totalQtyOrdered });
                    
                    }
                    
                    if (totalQtyOrdered===totalQtyDelivered){
                        log.debug("Order complete is true ");
                        isOrderComplete=true;
                    }
                    else{
                        log.debug("Order complete is false");
                        isOrderComplete=false;
                    }
                    var priceBeforeGST_record = soObjRecord.getValue({
                        fieldId: "subtotal"
                    })
                    log.debug("priceBeforeGST_record", priceBeforeGST_record)

                    var asnConfirmationXml = '';
                    var XML_STRING = eXchangeObjRecord.getValue({
                        fieldId: 'custrecord_ahnz67_api_xmlresponse'
                    });
                    var jsonResponse = eXchangeObjRecord.getValue({
                        fieldId: 'custrecord_ahnz67_xml_to_json'
                    });
                    jsonResponse = JSON.parse(jsonResponse);
                    var EAN_Prefix = '';
                    var recordId = exchangeRecordId;
                    try {
                        //   let temp = XML_STRING.split('</CUSTOMER>')[0]
                        EAN_Prefix = isNumberOrString(XML_STRING.split('</CUSTOMER>')[0].split('<ORG_ID OrgType="EAN_Prefix">')[1].split('</ORG_ID>')[0]) ? XML_STRING.split('</CUSTOMER>')[0].split('<ORG_ID OrgType="EAN_Prefix">')[1].split('</ORG_ID>')[0] : ""
                    } catch (e) {
                        EAN_Prefix = isNumberOrString(XML_STRING.split('</CUSTOMER>')[0].split('<ORG_ID OrgType="EAN_PREFIX">')[1].split('</ORG_ID>')[0]) ? XML_STRING.split('</CUSTOMER>')[0].split('<ORG_ID OrgType="EAN_PREFIX">')[1].split('</ORG_ID>')[0] : ""
                        //errorStack.push(e.message)
                        log.debug("Error @ split for EAN_Prefix", e);
                    }
                    let currentTime = new Date().toISOString().split('.')[0];
                    let customerCompanyName = jsonResponse.purchase_order_150.customer.company.name;
                    let customerCompanyAddress1 = isNumberOrString(jsonResponse.purchase_order_150.customer.company.street_address.address1) ? jsonResponse.purchase_order_150.customer.company.street_address.address1 : "";
                    let customerCompanyAddress2 = isNumberOrString(jsonResponse.purchase_order_150.customer.company.street_address.address2) ? jsonResponse.purchase_order_150.customer.company.street_address.address2 : "";
                    let customerCompanyAddress3 = isNumberOrString(jsonResponse.purchase_order_150.customer.company.street_address.address3) ? jsonResponse.purchase_order_150.customer.company.street_address.address3 : "";
                    let customerCompanyCity = isNumberOrString(jsonResponse.purchase_order_150.customer.company.street_address.city) ? jsonResponse.purchase_order_150.customer.company.street_address.city : "";
                    let customerCompanyCountry = isNumberOrString(jsonResponse.purchase_order_150.customer.company.street_address.country) ? jsonResponse.purchase_order_150.customer.company.street_address.country : "";
                    let customerCompanyPostalAddress1 = isNumberOrString(jsonResponse.purchase_order_150.customer.company.postal_address.address1) ? jsonResponse.purchase_order_150.customer.company.postal_address.address1 : "";
                    let customerCompanyPostalAddress2 = isNumberOrString(jsonResponse.purchase_order_150.customer.company.postal_address.address2) ? jsonResponse.purchase_order_150.customer.company.postal_address.address2 : "";
                    let customerCompanyPostalAddress3 = isNumberOrString(jsonResponse.purchase_order_150.customer.company.postal_address.address3) ? jsonResponse.purchase_order_150.customer.company.postal_address.address3 : "";
                    let customerCompanyPostalCity = isNumberOrString(jsonResponse.purchase_order_150.customer.company.postal_address.city) ? jsonResponse.purchase_order_150.customer.company.postal_address.city : "";
                    let customerCompanyPostalCountry = isNumberOrString(jsonResponse.purchase_order_150.customer.company.postal_address.country) ? jsonResponse.purchase_order_150.customer.company.postal_address.country : "";
                    let customerCompanyPhone = isNumberOrString(jsonResponse.purchase_order_150.customer.company.phone) ? jsonResponse.purchase_order_150.customer.company.phone : "";
                    let customerCompanyFax = isNumberOrString(jsonResponse.purchase_order_150.customer.company.fax) ? jsonResponse.purchase_order_150.customer.company.fax : "";
                    let customerSupplierStoreCode = isNumberOrString(jsonResponse.purchase_order_150.customer.supplier_store_code) ? jsonResponse.purchase_order_150.customer.supplier_store_code : "";
                    let customerStoreOwnerCode = isNumberOrString(jsonResponse.purchase_order_150.customer.store_owner_code) ? jsonResponse.purchase_order_150.customer.store_owner_code : "";
                    let supplierCompanyAddress1 = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.street_address.address1) ? jsonResponse.purchase_order_150.supplier.company.street_address.address1 : "";
                    let supplierCompanyAddress2 = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.street_address.address2) ? jsonResponse.purchase_order_150.supplier.company.street_address.address2 : "";
                    let supplierCompanyAddress3 = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.street_address.address3) ? jsonResponse.purchase_order_150.supplier.company.street_address.address3 : "";
                    let supplierCompanyCity = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.street_address.city) ? jsonResponse.purchase_order_150.supplier.company.street_address.city : "";
                    let supplierCompanyCountry = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.street_address.country) ? jsonResponse.purchase_order_150.supplier.company.street_address.country : "";
                    let supplierCompanyPostalAddress1 = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.postal_address.address1) ? jsonResponse.purchase_order_150.supplier.company.postal_address.address1 : "";
                    let supplierCompanyPostalAddress2 = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.postal_address.address2) ? jsonResponse.purchase_order_150.supplier.company.postal_address.address2 : "";
                    let supplierCompanyPostalAddress3 = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.postal_address.address3) ? jsonResponse.purchase_order_150.supplier.company.postal_address.address3 : "";
                    let supplierCompanyPostalCity = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.postal_address.city) ? jsonResponse.purchase_order_150.supplier.company.postal_address.city : "";
                    let supplierCompanyPostalCountry = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.postal_address.country) ? jsonResponse.purchase_order_150.supplier.company.postal_address.country : "";
                    let supplierCompanyPhone = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.phone) ? jsonResponse.purchase_order_150.customer.company.phone : "";
                    let supplierCompanyFax = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.fax) ? jsonResponse.purchase_order_150.supplier.company.fax : "";
                    let supplierInternalCode = isNumberOrString(jsonResponse.purchase_order_150.supplier.supplier_internal_code) ? jsonResponse.purchase_order_150.supplier.supplier_internal_code : "";
                    let foodstuffsSupplierCode = isNumberOrString(jsonResponse.purchase_order_150.supplier.foodstuffs_supplier_code) ? jsonResponse.purchase_order_150.supplier.foodstuffs_supplier_code : "";
                    let orderNumber = isNumberOrString(jsonResponse.purchase_order_150.order_header.order_num) ? jsonResponse.purchase_order_150.order_header.order_num : "";
                    let orderDate = isNumberOrString(jsonResponse.purchase_order_150.order_header.order_date) ? jsonResponse.purchase_order_150.order_header.order_date : "";
                    let purchaseDepartment = isNumberOrString(jsonResponse.purchase_order_150.order_header.purchasing_department) ? jsonResponse.purchase_order_150.order_header.purchasing_department : "";
                    let supplierEanPrefix = '';
                    try {
                        supplierEanPrefix = isNumberOrString(XML_STRING.split('<SUPPLIER>')[1].split('<ORG_ID OrgType="EAN_Prefix">')[1].split('</ORG_ID>')[0]) ? XML_STRING.split('<SUPPLIER>')[1].split('<ORG_ID OrgType="EAN_Prefix">')[1].split('</ORG_ID>')[0] : ""
                    } catch (e) {
                        supplierEanPrefix = isNumberOrString(XML_STRING.split('<SUPPLIER>')[1].split('<ORG_ID OrgType="EAN_PREFIX">')[1].split('</ORG_ID>')[0]) ? XML_STRING.split('<SUPPLIER>')[1].split('<ORG_ID OrgType="EAN_PREFIX">')[1].split('</ORG_ID>')[0] : ""
                        //errorStack.push(e.message)
                        log.debug("Error @ split for supplierEANPrefix", e);
                    }
                    let buyer = isNumberOrString(jsonResponse.purchase_order_150.order_header.buyer) ? jsonResponse.purchase_order_150.order_header.buyer : "";
                    // let deliverDate = isNumberOrString(jsonResponse.purchase_order_150.order_header.requested_deliver_date) ? jsonResponse.purchase_order_150.order_header.requested_deliver_date : "";
                    let deliverAddress1 = isNumberOrString(jsonResponse.purchase_order_150.order_header.deliver_address.address1) ? jsonResponse.purchase_order_150.order_header.deliver_address.address1 : "";
                    let deliverAddress2 = isNumberOrString(jsonResponse.purchase_order_150.order_header.deliver_address.address2) ? jsonResponse.purchase_order_150.order_header.deliver_address.address2 : "";
                    let deliverAddress3 = isNumberOrString(jsonResponse.purchase_order_150.order_header.deliver_address.address3) ? jsonResponse.purchase_order_150.order_header.deliver_address.address3 : "";
                    let deliverAddressCity = isNumberOrString(jsonResponse.purchase_order_150.order_header.deliver_address.city) ? jsonResponse.purchase_order_150.order_header.deliver_address.city : "";
                    let deliverAddressPostalCode = isNumberOrString(jsonResponse.purchase_order_150.order_header.deliver_address.postal_code) ? jsonResponse.purchase_order_150.order_header.deliver_address.postal_code : "";
                    let deliverAddressCountry = isNumberOrString(jsonResponse.purchase_order_150.order_header.deliver_address.country) ? jsonResponse.purchase_order_150.order_header.deliver_address.country : "";
                    let billToName = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.name) ? jsonResponse.purchase_order_150.order_header.bill_to.company.name : "";
                    let billToEanPrefix = '';
                    try {
                        billToEanPrefix = isNumberOrString(XML_STRING.split('<BILL_TO>')[1].split('<ORG_ID OrgType="EAN_PREFIX">')[1].split('</ORG_ID>')[0]) ? XML_STRING.split('<BILL_TO>')[1].split('<ORG_ID OrgType="EAN_PREFIX">')[1].split('</ORG_ID>')[0] : ""
                    } catch (e) {

                        billToEanPrefix = isNumberOrString(XML_STRING.split('<BILL_TO>')[1].split('<ORG_ID OrgType="EAN_Prefix">')[1].split('</ORG_ID>')[0]) ? XML_STRING.split('<BILL_TO>')[1].split('<ORG_ID OrgType="EAN_Prefix">')[1].split('</ORG_ID>')[0] : ""
                        //errorStack.push(e.message)
                        log.debug("Error @ split for billToEanPREFIX", e);
                    }
                    let billToStreetAddress1 = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.address1) ? jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.address1 : "";
                    let billToStreetAddress2 = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.address2) ? jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.address2 : "";
                    let billToStreetAddress3 = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.address3) ? jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.address3 : "";
                    let billToStreetCity = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.city) ? jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.city : "";
                    let billToStreetAddressPostalCode = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.postal_code) ? jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.postal_code : "";
                    let billToStreetAddressCountry = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.country) ? jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.country : "";
                    let billToPostalAddress1 = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.address1) ? jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.address1 : "";
                    let billToPostalAddress2 = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.address2) ? jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.address2 : "";
                    let billToPostalAddress3 = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.address3) ? jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.address3 : "";
                    let billToPostalCity = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.city) ? jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.city : "";
                    let billToPostalAddressPostalCode = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.postal_code) ? jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.postal_code : "";
                    let billToPostalAddressCountry = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.country) ? jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.country : "";
                    let billToPhone = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.phone) ? jsonResponse.purchase_order_150.order_header.bill_to.company.phone : "";
                    let billToFax = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.fax) ? jsonResponse.purchase_order_150.order_header.bill_to.company.fax : "";
                    let currency = isNumberOrString(jsonResponse.purchase_order_150.order_header.currency) ? jsonResponse.purchase_order_150.order_header.currency : "";
                    let spInstructions = isNumberOrString(jsonResponse.purchase_order_150.order_header.special_instructions) ? jsonResponse.purchase_order_150.order_header.special_instructions : "";
                    let priceBeforeGst = isNumberOrString(jsonResponse.purchase_order_150.order_header.price_before_gst) ? jsonResponse.purchase_order_150.order_header.price_before_gst : "";
                    
                    //The order item lines of the XML request
                    let order_line = util.isArray(jsonResponse.purchase_order_150.lines.order_line) ? jsonResponse.purchase_order_150.lines.order_line : [jsonResponse.purchase_order_150.lines.order_line];
                    //Create an Object of 'Supplier Product'
                    /* let requestedItemObject = order_line.reduce((accumulator, currentElement) => {
                         return accumulator[currentElement.supplier_product] = currentElement.supplier_product, accumulator;
                     }, {});
                     log.debug('requestedItemObject', requestedItemObject);*/


                    //Create an Object of 'Supplier Product'
                    let requestedItemObject1 = order_line.reduce((accumulator, currentElement) => {
                        // return accumulator[currentElement.supplier_product] = currentElement.supplier_product, accumulator;
                        return accumulator[currentElement.barcode_product] = currentElement.barcode_product, accumulator;
                    }, {});
                    log.debug('requestedItemObject1', requestedItemObject1);

                    let requestedItemObject2 = order_line.reduce((accumulator, currentElement) => {
                        return accumulator[currentElement.customer_product] = currentElement.customer_product, accumulator;
                    }, {});
                    log.debug('requestedItemObject2 customer product', requestedItemObject2);

                    let requestedItemObject = { ...requestedItemObject1, ...requestedItemObject2 };
                    log.debug('requestedItemObject', requestedItemObject)


                    //Pass the 'Supplier Product' as an Array of Numbers and executes an Item Saved Search
                    let itemSearchResult = dataSets.fetchItemsByUpcCode(Object.keys(requestedItemObject));
                    log.debug('itemSearchResult', itemSearchResult);

                    let itemMap = {};
                    if (itemSearchResult && util.isArray(itemSearchResult) && itemSearchResult.length)
                        itemMap = itemSearchResult.reduce((accumulator, currentElement) => {
                            //Item Map using GTIN CODE (UPC Code) as key
                            if (currentElement.upccode.value && !accumulator[currentElement.upccode.value])
                                accumulator[currentElement.upccode.value] = currentElement.internalid.value;
                            //Item Map using NORTH ISLAND SAP CODE as key
                            if (currentElement.custitemitem_sapnth.value && !accumulator[currentElement.custitemitem_sapnth.value])
                                accumulator[currentElement.custitemitem_sapnth.value] = currentElement.internalid.value;
                            //Item Map using SOUTH ISLAND SAP CODE as key
                            if (currentElement.custitemitem_sapsth.value && !accumulator[currentElement.custitemitem_sapsth.value])
                                accumulator[currentElement.custitemitem_sapsth.value] = currentElement.internalid.value;
                            return accumulator;
                        }, {});
                    log.debug('itemMap', itemMap);

                    asnConfirmationXml = `<ASN_150 partner="FOODSTUFFS" transaction="ASN" version="1.50" timestamp="${currentTime}" document_mode="Live">
                 <CUSTOMER>
                     <COMPANY>
                         <NAME>${customerCompanyName}</NAME>
                         <ORG_ID OrgType="EAN_Prefix">${EAN_Prefix}</ORG_ID>
                         <STREET_ADDRESS>
                             <ADDRESS1>${customerCompanyAddress1}</ADDRESS1>
                             <ADDRESS2>${customerCompanyAddress2}</ADDRESS2>
                             <ADDRESS3>${customerCompanyAddress3}</ADDRESS3>
                             <CITY>${customerCompanyCity}</CITY>
                             <COUNTRY>${customerCompanyCountry}</COUNTRY>
                         </STREET_ADDRESS>
                         <POSTAL_ADDRESS>
                             <ADDRESS1>${customerCompanyPostalAddress1}</ADDRESS1>
                             <ADDRESS2>${customerCompanyPostalAddress2}</ADDRESS2>
                             <ADDRESS3>${customerCompanyPostalAddress3}</ADDRESS3>
                             <CITY>${customerCompanyPostalCity}</CITY>
                             <COUNTRY>${customerCompanyPostalCountry}</COUNTRY>
                         </POSTAL_ADDRESS>
                         <PHONE>${customerCompanyPhone}</PHONE>
                         <FAX>${customerCompanyFax}</FAX>
                     </COMPANY>
                     <SUPPLIER_STORE_CODE>${customerSupplierStoreCode}</SUPPLIER_STORE_CODE>
                     <STORE_OWNER_CODE>${customerStoreOwnerCode}</STORE_OWNER_CODE>
                 </CUSTOMER>
                 <SUPPLIER>
                     <COMPANY>
                         <NAME>${jsonResponse.purchase_order_150.supplier.company.name}</NAME>
                         <ORG_ID OrgType="EAN_Prefix">${supplierEanPrefix}</ORG_ID>
                         <STREET_ADDRESS>
                             <ADDRESS1>${supplierCompanyAddress1}</ADDRESS1>
                             <ADDRESS2>${supplierCompanyAddress2}</ADDRESS2>
                             <ADDRESS3>${supplierCompanyAddress3}</ADDRESS3>
                             <CITY>${supplierCompanyCity}</CITY>
                             <COUNTRY>${supplierCompanyCountry}</COUNTRY>
                         </STREET_ADDRESS>
                         <POSTAL_ADDRESS>
                            <ADDRESS1>${supplierCompanyPostalAddress1}</ADDRESS1>
                             <ADDRESS2>${supplierCompanyPostalAddress2}</ADDRESS2>
                             <ADDRESS3>${supplierCompanyPostalAddress3}</ADDRESS3>
                             <CITY>${supplierCompanyPostalCity}</CITY>
                             <COUNTRY>${supplierCompanyPostalCountry}</COUNTRY>
                         </POSTAL_ADDRESS>
                         <PHONE>${supplierCompanyPhone}</PHONE>
                         <FAX>${supplierCompanyFax}</FAX>
                     </COMPANY>
                     <SUPPLIER_INTERNAL_CODE >${supplierInternalCode}</SUPPLIER_INTERNAL_CODE>
                     <FOODSTUFFS_SUPPLIER_CODE>${foodstuffsSupplierCode}</FOODSTUFFS_SUPPLIER_CODE>
                 </SUPPLIER>
                 <ORDER_HEADER>
                     <ORDER_NUM>${orderNumber}</ORDER_NUM>
                     <ORDER_DATE>${orderDate}</ORDER_DATE>
                     <PURCHASING_DEPARTMENT>${purchaseDepartment}</PURCHASING_DEPARTMENT>
                     <BUYER>${buyer}</BUYER>
                     <ORDER_COMPLETE>${isOrderComplete}</ORDER_COMPLETE>
                     <DELIVER_ADDRESS>
                         <ADDRESS1>${deliverAddress1}</ADDRESS1>
                         <ADDRESS2>${deliverAddress2}</ADDRESS2>
                         <ADDRESS3>${deliverAddress3}</ADDRESS3>
                         <CITY>${deliverAddressCity}</CITY>
                         <POSTAL_CODE>${deliverAddressPostalCode}</POSTAL_CODE>
                         <COUNTRY>${deliverAddressCountry}</COUNTRY>
                     </DELIVER_ADDRESS>
                     <BILL_TO>
                         <COMPANY>
                             <NAME>${billToName}</NAME>
                             <ORG_ID OrgType="EAN_Prefix">${billToEanPrefix}</ORG_ID>
                             <STREET_ADDRESS>
                                 <ADDRESS1>${billToStreetAddress1}</ADDRESS1>
                                 <ADDRESS2>${billToStreetAddress2}</ADDRESS2>
                                 <ADDRESS3>${billToStreetAddress3}</ADDRESS3>
                                 <CITY>${billToStreetCity}</CITY>
                                 <POSTAL_CODE>${billToStreetAddressPostalCode}</POSTAL_CODE>
                                 <COUNTRY>${billToStreetAddressCountry}</COUNTRY>
                             </STREET_ADDRESS>
                             <POSTAL_ADDRESS>
                                 <ADDRESS1>${billToPostalAddress1}</ADDRESS1>
                                 <ADDRESS2>${billToPostalAddress2}</ADDRESS2>
                                 <ADDRESS3>${billToPostalAddress3}</ADDRESS3>
                                 <CITY>${billToPostalCity}</CITY>
                                 <POSTAL_CODE>${billToPostalAddressPostalCode}</POSTAL_CODE>
                                 <COUNTRY>${billToPostalAddressCountry}</COUNTRY>
                             </POSTAL_ADDRESS>
                             <PHONE>${billToPhone}</PHONE>
                             <FAX>${billToFax}</FAX>
                         </COMPANY>
                     </BILL_TO>
                     <CURRENCY>${currency}</CURRENCY>
                     <SPECIAL_INSTRUCTIONS>${spInstructions}</SPECIAL_INSTRUCTIONS>
                     <PRICE_BEFORE_GST>${priceBeforeGST_record}</PRICE_BEFORE_GST>
                 </ORDER_HEADER>
                 <LINES>`
                    let LineCount = ifObjRecord.getLineCount({
                        sublistId: 'item'
                    });
                    for (let j = 0; j < LineCount; j++) {
                        ifObjRecord.selectLine({
                            sublistId: 'item',
                            line: j
                        })
                        let itemInternalId = ifObjRecord.getCurrentSublistValue({
                            sublistId: 'item',
                            fieldId: 'item'
                        });
                        //Iterate over order_line to set them as Item in Item Sublist
                        for (let line of order_line) {
                            if (itemMap[(line.barcode_product).toString().trim()] == itemInternalId || itemMap[(line.customer_product).toString().trim()] == itemInternalId) {
                               // totalLinesDelivered += 1;
                                let itemQuantity = ifObjRecord.getCurrentSublistValue({
                                    sublistId: 'item',
                                    fieldId: 'quantity'
                                });
                                //totalQtyDelivered += itemQuantity;
                                let customerProduct = isNumberOrString(line.customer_product) ? line.customer_product : "";
                                let supplierProduct = isNumberOrString(line.supplier_product) ? line.supplier_product : "";
                                let barCodeProduct = isNumberOrString(line.barcode_product) ? line.barcode_product : "";
                                let productId = isNumberOrString(line.product_id) ? line.product_id : "";
                                let customerSequence = isNumberOrString(line.customer_sequence) ? line.customer_sequence : "";
                                let supplierSequence = isNumberOrString(line.supplier_sequence) ? line.supplier_sequence : "";
                                let prodDesc = isNumberOrString(line.product_desc) ? line.product_desc : "";
                                let qtyOrdered = isNumberOrString(line.qty_ordered) ? line.qty_ordered : "";
                                //totalQtyOrdered += qtyOrdered
                                let qtyCarton = isNumberOrString(line.qty_ordered) ? line.qty_in_carton : "";
                                let testSplit = '';
                                try {
                                    testSplit = XML_STRING.split(productId.toString().trim() + '</PRODUCT_ID>')[1].split('<PRICE_UNIT_OF_MEASURE priceuomcode=')[1].split('>')[1].split('</PRICE_UNIT_OF_MEASURE')[0];
                                } catch (e) {
                                    log.debug("Error @ split for testSplit", e);
                                    testSplit = ''
                                    errorStack.push(e.message)
                                }
                                let unitMeasure = '';
                                try {
                                    unitMeasure = isNumberOrString(XML_STRING.split(productId.toString().trim() + '</PRODUCT_ID>')[1].split('<UNIT_OF_MEASURE uomcode=')[1].split('>')[1].split('</UNIT_OF_MEASURE')[0]) ? XML_STRING.split(productId.toString().trim() + '</PRODUCT_ID>')[1].split('<UNIT_OF_MEASURE uomcode=')[1].split('>')[1].split('</UNIT_OF_MEASURE')[0] : ""
                                } catch (e) {
                                    log.debug("Error @ split for unitMeasure", e);
                                    unitMeasure = ''
                                    errorStack.push(e.message)
                                }
                                let price = isNumberOrString(line.pricing_detail.price) ? line.pricing_detail.price : "";
                                let priceMeasure = '';
                                try {
                                    priceMeasure = isNumberOrString(XML_STRING.split(productId.toString().trim() + '</PRODUCT_ID>')[1].split('<PRICE_UNIT_OF_MEASURE priceuomcode=')[1].split('>')[1].split('</PRICE_UNIT_OF_MEASURE')[0]) ? XML_STRING.split(productId.toString().trim() + '</PRODUCT_ID>')[1].split('<PRICE_UNIT_OF_MEASURE priceuomcode=')[1].split('>')[1].split('</PRICE_UNIT_OF_MEASURE')[0] : "";
                                } catch (e) {
                                    log.debug("Error @ split for priceMeasure", e);
                                    priceMeasure = ''
                                    errorStack.push(e.message)
                                }
                                let discount = isNumberOrString(line.pricing_detail.discount) ? line.pricing_detail.discount : "";
                                let discountList = isNumberOrString(line.pricing_detail.discount_list) ? line.pricing_detail.discount_list : "";
                                let bonusStock = isNumberOrString(line.pricing_detail.bonus_stock) ? line.pricing_detail.bonus_stock : "";
                                let linePrice = isNumberOrString(line.pricing_detail.line_price) ? line.pricing_detail.line_price : "";

                                asnConfirmationXml += `
                                 <ORDER_LINE>
                                         <CUSTOMER_PRODUCT>${customerProduct}</CUSTOMER_PRODUCT>
                                         <SUPPLIER_PRODUCT>${supplierProduct}</SUPPLIER_PRODUCT>
                                         <BARCODE_PRODUCT>${barCodeProduct}</BARCODE_PRODUCT>
                                         <PRODUCT_ID>${productId}</PRODUCT_ID>
                                         <CUSTOMER_SEQUENCE>${customerSequence}</CUSTOMER_SEQUENCE>
                                         <SUPPLIER_SEQUENCE>${supplierSequence}</SUPPLIER_SEQUENCE>
                                         <PRODUCT_DESC>${prodDesc}</PRODUCT_DESC>
                                         <QTY_ORDERED>${qtyOrdered}</QTY_ORDERED>
                                         <UNIT_OF_MEASURE uomcode="Retail Unit">${unitMeasure}</UNIT_OF_MEASURE>
                                         <QTY_IN_CARTON>${qtyCarton}</QTY_IN_CARTON>
                                         <QTY_FOR_DELIVERY>${itemQuantity}</QTY_FOR_DELIVERY>
                                         <PRICING_DETAIL>
                                             <PRICE>${price}</PRICE>
                                             <PRICE_UNIT_OF_MEASURE priceuomcode="Retail Unit">${priceMeasure}</PRICE_UNIT_OF_MEASURE>
                                             <DISCOUNT>${discount}</DISCOUNT>
                                             <DISCOUNT_LIST>${discountList}</DISCOUNT_LIST>
                                             <BONUS_STOCK>${bonusStock}</BONUS_STOCK>
                                             <LINE_PRICE>${linePrice}</LINE_PRICE>
                                     </PRICING_DETAIL>
                                 </ORDER_LINE>`;
                            }
                        }
                    }
                    asnConfirmationXml += `</LINES>
                         <CONTROL>        
                             <LINES_DELIVERED>${totalLinesDelivered}</LINES_DELIVERED>
                             <TOTAL_QTY_ORDERED>${totalQtyOrdered}</TOTAL_QTY_ORDERED>
                             <TOTAL_QTY_FOR_DELIVERY>${totalQtyDelivered}</TOTAL_QTY_FOR_DELIVERY>
                         </CONTROL>
                     </ASN_150>`
                    log.debug("asnConfirmationXml", asnConfirmationXml);

                    //Replace the xml escaped character & with encoded &amp;
                    //asnConfirmationXml = asnConfirmationXml.replace(/&(?!amp;)/gi, encodeURIComponent("&amp;"));
                    asnConfirmationXml = asnConfirmationXml.replace(/&/g, "&amp;");

                    eXchangeObjRecord.setValue({
                        fieldId: 'custrecord_ahnz_78_asn_xml_message',
                        value: asnConfirmationXml
                    });
                    let itemFulfillmentArray = eXchangeObjRecord.getValue({
                        fieldId: 'custrecord_ahnz_78_item_fulfillment_asn',
                    });
                    itemFulfillmentArray.push(itemFulfillmentId);
                    //  log.debug("itemFulfillmentArray", itemFulfillmentArray);
                    eXchangeObjRecord.setValue({
                        fieldId: 'custrecord_ahnz_78_item_fulfillment_asn',
                        value: itemFulfillmentArray
                    });

                    eXchangeObjRecord.setValue({
                        fieldId: 'custrecord_ahnz_78_jj_asn_error',
                        value: errorStack[0]
                    });

                    eXchangeObjRecord.save({
                        enableSourcing: true,
                        ignoreMandatoryFields: true
                    });
                    return asnConfirmationXml;
                } catch (err) {
                    log.debug("Error @ AsnXmlMessage main", err);
                    record.submitFields({
                        type: "customrecord_ahnz67_jj_foodstuffexchange",
                        id: recordId,
                        values: {
                            custrecord_ahnz_78_jj_asn_error: err
                        },
                        options: { enableSourcing: true, ignoreMandatoryFields: true }
                    });
                    return false;
                }
            },

        }

        const dataSets = {
            /**
             * @description Object referencing NetSuite Saved Search
             * @typedef {Object} SearchObj
             * @property {Object[]} filters - Filters Array in Search
             * @property {Object[]} columns - Columns Array in Search
             */
            /**
             * @description to format Saved Search column to key-value pair where each key represents each columns in Saved Search
             * @param {SearchObj} savedSearchObj
             * @param {void|String} priorityKey
             * @returns {Object.<String,SearchObj.columns>}
             */
            fetchSavedSearchColumn(savedSearchObj, priorityKey) {
                let columns = savedSearchObj.columns;
                let columnsData = {},
                    columnName = '';
                columns.forEach(function (result, counter) {
                    columnName = '';
                    if (result[priorityKey]) {
                        columnName += result[priorityKey];
                    } else {
                        if (result.summary)
                            columnName += result.summary + '__';
                        if (result.formula)
                            columnName += result.formula + '__';
                        if (result.join)
                            columnName += result.join + '__';
                        columnName += result.name;
                    }
                    columnsData[columnName] = result;
                });
                return columnsData;
            },
            /**
             * @description Representing each result in Final Saved Search Format
             * @typedef formattedEachSearchResult
             * @type {{value:any,text:any}}
             */
            /**
             * @description to fetch and format the single saved search result. ie, Search result of a single row containing both text and value for each columns
             * @param {Object[]} searchResult contains search result of a single row
             * @param {Object.<String,SearchObj.columns>} columns
             * @returns {Object.<String,formattedEachSearchResult>|{}}
             */
            formatSingleSavedSearchResult(searchResult, columns) {
                let responseObj = {};
                for (let column in columns)
                    responseObj[column] = {
                        value: searchResult.getValue(columns[column]),
                        text: searchResult.getText(columns[column])
                    };
                return responseObj;
            },
            /**
             * @description to iterate over and initiate format of each saved search result
             * @param {SearchObj} searchObj
             * @param {void|Object.<String,SearchObj.columns>} columns
             * @returns {[]|Object[]}
             */
            iterateSavedSearch(searchObj, columns) {
                if (!checkForParameter(searchObj))
                    return false;
                if (!checkForParameter(columns))
                    columns = dataSets.fetchSavedSearchColumn(searchObj);

                let response = [];
                let searchPageRanges;
                try {
                    searchPageRanges = searchObj.runPaged({
                        pageSize: 1000
                    });
                } catch (err) {
                    return [];
                }
                if (searchPageRanges.pageRanges.length < 1)
                    return [];

                let pageRangeLength = searchPageRanges.pageRanges.length;
                log.debug('pageRangeLength', pageRangeLength);

                for (let pageIndex = 0; pageIndex < pageRangeLength; pageIndex++)
                    searchPageRanges.fetch({
                        index: pageIndex
                    }).data.forEach(function (result) {
                        response.push(dataSets.formatSingleSavedSearchResult(result, columns));
                    });

                return response;
            },
            /**
             * @description Saved Search for fetching the customer based on Store ID
             * @param {Number} STORE_ID - FoodStuff Store ID
             * @returns {boolean|*[]|Object[]} Search Result
             */
            fetchCustomerByStoreId(STORE_ID) {
                let customerSearchObj = search.create({
                    type: "customer",
                    filters: [
                        ["isinactive", "is", "F"], //Inactive	is false
                        "AND",
                        ["custentitystore_id", "isnotempty", ""], //Foodstuffs Store ID (Custom)	is not empty
                        "AND",
                        ["custentitystore_id", "is", STORE_ID.toString().trim()] //Foodstuffs Store ID (Custom)	is STORE_ID
                    ],
                    columns: [
                        search.createColumn({ name: "internalid", label: "internalid" }), //Internal ID
                        search.createColumn({ name: "entityid", sort: search.Sort.ASC, label: "entityid" }), //Name
                        search.createColumn({ name: "hasduplicates", label: "hasduplicates" }), //Duplicate
                        search.createColumn({ name: "category", label: "category" }), //Category
                        search.createColumn({ name: "companyname", label: "companyname" }), //Company Name
                        search.createColumn({ name: "custentity2", label: "custentity2" }), //Customer Type (Custom)
                        search.createColumn({ name: "isperson", label: "isperson" }), //Is Individual
                        search.createColumn({ name: "salesrep", label: "salesrep" }), //Sales Rep
                        search.createColumn({ name: "territory", label: "territory" }), //Territory
                        search.createColumn({ name: "startdate", label: "startdate" }),//Start Date
                        search.createColumn({ name: "phone", label: "phone" }), //Phone
                        search.createColumn({ name: "email", label: "email" }), //Email
                        search.createColumn({ name: "billaddress1", label: "billaddress1" }), //Billing Address 1
                        search.createColumn({ name: "billaddress2", label: "billaddress2" }), //Billing Address 2
                        search.createColumn({ name: "billcity", label: "billcity" }), //Billing City
                        search.createColumn({ name: "billstate", label: "billstate" }), //Billing State/Province
                        search.createColumn({ name: "billzipcode", label: "billzipcode" }), //Billing Zip
                        search.createColumn({ name: "billcountry", label: "billcountry" }), //Billing Country
                        search.createColumn({ name: "shipaddress", label: "shipaddress" }), //Shipping Address
                        search.createColumn({ name: "billaddress", label: "billaddress" }), //Billing Address
                        search.createColumn({ name: "custentitystore_id", label: "custentitystore_id" }) //Foodstuffs Store ID (Custom)
                    ]
                });
                let searchResultCount = customerSearchObj.runPaged().count;
                log.debug("fetchCustomerByStoreId result count", searchResultCount);
                return dataSets.iterateSavedSearch(customerSearchObj, dataSets.fetchSavedSearchColumn(customerSearchObj, 'label'));
            },
            /**
             * @description Saved Search for fetching the items based on UPC Code / GTIN Code , North Island SAP Code (Custom), South Island SAP Code (Custom)
             * @param {Array.<Number>} ITEM_ARRAY - UPC Codes as an Array
             * @returns {boolean|[]|Object[]} - Search result
             */
            fetchItemsByUpcCode(ITEM_ARRAY) {
                var inventoryitemSearchObj = search.create({
                    type: "inventoryitem",
                    filters: [
                        ["type", "anyof", "InvtPart"], //Type is Inventory Item
                        "AND",
                        ["isinactive", "is", "F"], //Inactive is false
                        "AND",
                        [].concat(ITEM_ARRAY.reduce((accumulator, currentElement, currentIndex) => {
                            let formulaString = `formulanumeric: CASE '${currentElement.toString().trim()}' WHEN {upccode} THEN 1 WHEN {custitemitem_sapnth} THEN 1 WHEN {custitemitem_sapsth} THEN 1 ELSE 0 END`;
                            return 0 === currentIndex ? accumulator.push([formulaString, "equalto", 1]) :
                                accumulator.push("OR", [formulaString, "equalto", 1]),
                                accumulator;
                        }, []))
                    ],
                    columns: [
                        search.createColumn({ name: "internalid", label: "internalid" }), //Internal ID
                        search.createColumn({ name: "itemid", label: "itemid" }), //Name
                        search.createColumn({ name: "upccode", sort: search.Sort.ASC, label: "upccode" }), //UPC Code
                        search.createColumn({
                            name: "custitemitem_sapnth",
                            sort: search.Sort.ASC,
                            label: "custitemitem_sapnth"
                        }), //North Island SAP Code (Custom)
                        search.createColumn({
                            name: "custitemitem_sapsth",
                            sort: search.Sort.ASC,
                            label: "custitemitem_sapsth"
                        }) //South Island SAP Code (Custom)
                    ]
                });
                var searchResultCount = inventoryitemSearchObj.runPaged().count;
                //  log.debug("fetchItemsByUpcCode result count", searchResultCount);
                return dataSets.iterateSavedSearch(inventoryitemSearchObj, dataSets.fetchSavedSearchColumn(inventoryitemSearchObj, 'label'));
            },

        };

        return { xmlAsnShippingNote };

    });

Leave a comment

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