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