Daily SKU file Update to clutch server

Mapreduce script for doing daily sku update to clutch server

/**
 * @NApiVersion 2.1
 * @NScriptType MapReduceScript
 */
define(['N/encode', 'N/file', 'N/http', 'N/https', 'N/record', 'N/runtime', 'N/search', 'N/sftp'],

    (encode, file, http, https, record, runtime, search, sftp) => {


        /**
         * @description the function to check whether a value exists in parameter
         * @param parameter -passing parameter
         * @param parameterName - passing parameter name
         * @returns{Boolean}
         */
        function checkForParameter(parameter, parameterName) {
            if (
                parameter != "" &&
                parameter != null &&
                parameter != undefined &&
                parameter != "null" &&
                parameter != "undefined" &&
                parameter != " " &&
                parameter != false
            ) {
                return true;
            } else {
                if (parameterName)
                    log.debug(
                        "Empty Value found",
                        "Empty Value for parameter " + parameterName
                    );
                return false;
            }
        }


        //var passwordGUID= "3fbf8bb33d394a4b9c283e99382463ee";
        var hostKey ="AAAAB3NzaC1yc2EAAAADAQABAAABAQCwwWy3bYw9XcSbFp637H7mFkqdPm+pa2WOt3Wex07tykAXtX6rny7uNIQ9PXh9//ITawHDon8/C0laDb8Pb7NHi3DXt6DnktNhtDrYrzklvmFgom36Qxhj3cnwVf8pkE9mSfzFaMREV/46bsbpa6WENhQyD0+/0tSI72byoyvxHJM69rny7a83u4xmrnkVStmf0wpAD9T1zmVo0Zh9OjcjglioYBHnqdOV50fj2D5amUSCO/cP+6N5ps1vyZWLQS2MjP8AYbz7ZBq8kPY0cpr4Lps04z6K+yatEv8Df+HEPu5aloDkIIFSGzi2d8QsgPki7pU2jHKiiASMLdrdb8+V";

        const getInputData = (inputContext) => {
            try{
                //search for getting the item details
                var itemSearchObj = search.create({
                    type: "item",
                    filters:
                        [
                            ["isinactive","is","F"],
                            "AND",
                            ["name","isnotempty",""],
                            "AND",
                            ["systemnotes.field","anyof","INVTITEM.SNAME"],
                            "AND",
                            ["systemnotes.date","on","today"],
                            "OR",
                            ["systemnotes.type","is","T"]
                        ],
                    columns:
                        [
                            //search.createColumn({name: "internalid", label: "Internal ID"}),
                            search.createColumn({
                                name: "itemid",
                                sort: search.Sort.ASC,
                                label: "Name"
                            }),

                            search.createColumn({name: "custitem_nssc_webstore_short_desc", label: "Webstore Short Description"}),
                            search.createColumn({name: "custitemitem_link", label: "Link"}),
                            search.createColumn({name: "baseprice", label: "Base Price"}),
                            search.createColumn({name: "urlcomponent", label: "URL Component"}),
                            search.createColumn({name: "custitem_sme_item_weight", label: "Item Option Weight"}),
                            search.createColumn({name: "custitem_atlas_item_image", label: "Item Image"}),
                            search.createColumn({name: "displayname", label: "Display Name"}),
                            search.createColumn({name: "issueproduct", label: "Product"}),
                            search.createColumn({name: "class", label: "Class"})

                        ]
                });
                var itemArray=[];

                var pagedData = itemSearchObj.runPaged({
                    pageSize: 1000
                });
                var resultCount = itemSearchObj.runPaged({
                    pageSize: 1000
                }).count;
                log.debug("resultCount",resultCount)
                if(resultCount > 0){
                    for (var i = 0; i < pagedData.pageRanges.length; i++) {

                        // fetch the current page data
                        var currentPage = pagedData.fetch(i);
                        // and forEach() thru all results
                        currentPage.data.forEach(function (result) {

                             var resultObj = {};
                             //resultObj.itemInternalId=result.getValue({name: "internalid", label: "Internal ID"});
                            resultObj.itemDisplayName=result.getValue({name: "displayname", label: "Display Name"});
                            resultObj.itemSKU = result.getValue({name: "itemid",sort: search.Sort.ASC, label: "Name"});
                            resultObj.itemDescription = result.getValue({name: "custitem_nssc_webstore_short_desc", label: "Webstore Short Description"})
                            resultObj.imgURL=result.getValue({name: "urlcomponent", label: "URL Component"});
                            resultObj.itemPrice = result.getValue({name: "baseprice", label: "Base Price"});
                            resultObj.itemImage=result.getValue({name: "custitem_atlas_item_image", label: "Item Image"});
                            resultObj.itemWeight=result.getText({name: "custitem_sme_item_weight", label: "Item Option Weight" });
                            resultObj.itemCategory=result.getText({name: "class", label: "Class" });

                                itemArray.push(resultObj);
                            return true;
                        });
                    }
                }
                //log.debug("itemArray",itemArray);
                return itemArray;

            }catch (e) {
                log.debug("error@getInputData",e);
            }
        }

        const reduce = (reduceContext) => {
            try {
                var itemData = reduceContext.values.map(JSON.parse);
               // log.debug("itemData", itemData)
                if (itemData.length > 0){
                    reduceContext.write({
                        key: "test",
                        value: JSON.stringify(itemData)
                    });
            }
            }catch (e) {
                log.error("error@reduce",e)
            }
        }

        const summarize = (summaryContext) => {
            try {
                let csvHeader = ["title","id", "description","link","price","imageLink","shippingWeight","gtin","externalProductId","externalProductIdType","googleProductCategory"];
                let csvFileData = csvHeader.toString() + '\r\n';
                let dataAvail = false;
                summaryContext.output.iterator().each(function (key, value) {
                    let parseSummary= JSON.parse(value);

                    if (parseSummary) {
                        let urlComponent= parseSummary[0].imgURL
                        if(checkForParameter(urlComponent)){
                            var urlWeb="https://www.smeincusa.com/" +urlComponent
                        }else{
                            var urlWeb=parseSummary[0].imgURL
                        }
                        //log.debug("urlComponent",urlComponent)
                        let desc= parseSummary[0].itemDescription.replaceAll(',','')
                        //log.debug("desc",desc);
                        let descProduct=desc.replace(/<[^>]*>?/gm, '')
                        let description=descProduct.replace(/(?:\r\n|\r|\n)/g,'')
                        let itemDescr=description.replaceAll('"','""')
                        let displayNameIs=parseSummary[0].itemDisplayName.replaceAll(',','')
                        let displayName=displayNameIs.replaceAll('"','""')
                        csvFileData += displayName + ',' + parseSummary[0].itemSKU + ',' + itemDescr + ',' + urlWeb + ',' + parseSummary[0].itemPrice + ',' + parseSummary[0].itemImage + ',' + parseSummary[0].itemWeight.replaceAll(',','') +','+ " " +','+ " " +','+ " " +','+ parseSummary[0].itemCategory.replaceAll(',','') +'\r\n'
                        dataAvail = true
                    }
                    return true;
                });
                let tDate= new Date();
                let year = tDate.getFullYear()
                let today = tDate.getDate()
                let month = tDate.getMonth()+1
                let date = year +'-'+month+'-'+today;
                let fileName= 'SKU_'+ date + '.csv';

                // create sku file in file cabinet
                if (dataAvail) {
                    let csvfileObj = file.create({
                        name: fileName,
                        fileType: file.Type.CSV,
                        contents: csvFileData,
                        encoding: file.Encoding.UTF_8,
                        folder: 150480
                    });

                    let fileID = csvfileObj.save();
                    log.debug("fileID",fileID)
                    // create connection to sftp server

                    let connection = sftp.createConnection({
                        username: 'sme2clutchsftp',
                        keyId:'custkey_jj_sku_key',
                        //passwordGuid:passwordGUID,
                        url: 'securetransfer.clutch.com',
                        hostKey: hostKey,
                        port: 22,
                        hostKeyType: 'rsa',
                    });
                    let upload = connection.upload({
                        directory: '/incoming',
                        filename: fileName,
                        file: csvfileObj,
                        replaceExisting: true
                    });
                    log.debug("Connection - UPLOAD", upload);

                }
            }catch (e) {
                log.error("error@summarize",e);
            }
        }

        return {getInputData, reduce, summarize}

    });

Leave a comment

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