The Shopify to NetSuite Real-time sync cannot be achievable using only webhook since there is no permission to add the header from Shopify webhook call to NetSuite. To tackle this scenario, we use the email plugin as the trigger point. Whenever an order is created in Shopify the email notification can be sent to staff email. Using this feature we added NetSuite email plugin emailID to receive alerts. When an email plugin receives the alert from the Shopify the script from the NetSuite side will fetch the latest order from Shopify so that the all the orders are sync in Realtime.
function process(email) {
try {
// log all information in email
var fromAddress = email.getFrom();
log("fromAddress", fromAddress);
var subject = email.getSubject();
log("fromAddress", fromAddress);
var recordid = createtask(true);
} catch (e) {
log('error in main', e)
}
}
function createtask(type) {
try {
var url = nlapiResolveURL("SUITELET", "customscript_daz_12_sl_scheduler", "customdeploy_daz_12_sl_scheduler", "external");
log('rl', url);
var res = nlapiRequestURL(url, null, 'POST', 'POST');
} catch (e) {
log('error in createtask', e)
}
}
function log(label, text) {
nlapiLogExecution('DEBUG', label, text);
}
/**
* * @NApiVersion 2.x
* @NScriptType Suitelet
*/
/**
* Script Description: Send zendesl data to Netsuite
*Create Employee record
*/
/*******************************************************************************
* * ESW - Zendesk Integeration * *
* **************************************************************************
* Date: 16/05/18 created Script name:ESW-78 SL Zendesk-Netsuite Connector
*
*
*
******************************************************************************/
define(['N/email', 'N/file', 'N/http', 'N/https', 'N/record', 'N/runtime', 'N/search', 'N/ui/serverWidget', 'N/format'],
/**
* @param {email} email
* @param {file} file
* @param {http} http
* @param {https} https
* @param {record} record
* @param {runtime} runtime
* @param {search} search
* @param {serverWidget} serverWidget
*/
function(email, file, http, https, record, runtime, search, serverWidget, format) {
var main = {
onRequest: function(context) {
/*var APIKEY = runtime.getCurrentScript().getParameter("custscript_current_position");*/
var deploy = context.request.parameters.deploy;
var type = context.request.parameters.type;
if (type == "employee" && deploy == 1) {
var employeedata = context.request.body;
log.debug("employeedata", employeedata);
var employeedata = JSON.parse(employeedata);
var employeedata = employeedata["employeedata"];
var responsedata = main.createemployee(employeedata);
if (parseInt(responsedata) > 0) {
context.response.write('{ "Employee Record Created Succefully": { "internalid":' + responsedata + '} }');
} else {
context.response.write('{"ERROR":{"type":"' + responsedata.name + '","message":"' + responsedata.message + '"}}')
}
} else if (type == "purchaseorder" && deploy == 2) {
var podata = context.request.body;
log.debug("podata", podata);
var podata = JSON.parse(podata);
var podata = podata["podata"];
var responsedata = main.createpo(podata);
if (parseInt(responsedata) > 0) {
context.response.write('{ "Purchase Order Record Created Succefully": { "internalid":' + responsedata + '} }');
} else {
context.response.write('{"ERROR":{"type":"' + responsedata.name + '","message":"' + responsedata.message + '"}}')
}
} else {
context.response.write('{"ERROR":{"type":"WRONG PARAMETERS","message":"Please Recheck The Params"}}')
}
},
createemployee: function(employeedata) {
var employeerec = record.create({
type: "employee",
isDynamic: true
});
var name = employeedata.firstname + " " + employeedata.lastname;
employeerec.setValue({
fieldId: 'entityid',
value: name,
ignoreFieldChange: true
});
employeerec.setValue({
fieldId: 'subsidiary',
value: employeedata.subsidiary,
ignoreFieldChange: true
});
var recievedhiredate = employeedata.hiredate;
var dateformatted = format.parse({
value: recievedhiredate,
type: format.Type.DATE
});
employeerec.setValue({
fieldId: 'hiredate',
value: dateformatted,
ignoreFieldChange: true
});
employeerec.setValue({
fieldId: 'department',
value: employeedata.department,
ignoreFieldChange: true
});
employeerec.setValue({
fieldId: 'class',
value: employeedata.class,
ignoreFieldChange: true
});
employeerec.setValue({
fieldId: 'supervisor',
value: employeedata.supervisor,
ignoreFieldChange: true
});
var recid = employeerec.save();
return recid;
},
createpo: function(podata) {
}
};
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 e
}
}
};
return main
});
/**
* * @NApiVersion 2.x
* @NScriptType ScheduledScript
*/
/**
* Script Description: Send netsuite data to Zendesk
*Department , Items,Class ,Vendors
*/
/*******************************************************************************
* * ESW - Zendesk Integeration * *
* **************************************************************************
* Date: 03/05/18 created Script name:ESW-78 SS Netsuite - Zendesk Connector:
*
* parameters : custscript_itemfulfillmentid
* custscript_jj_shjn11_startindex
*
******************************************************************************/
define(
['N/https', 'N/record', 'N/runtime', 'N/search', 'N/format', "N/file", 'N/task'],
function(https, record, runtime, search, format, file, task) {
var main = {
checkforusage: function(type) {
var scriptObj = runtime.getCurrentScript();
var remainingTime = scriptObj.getRemainingUsage();
log.debug("Remaining governance units@ " + type, remainingTime);
//Check the remaining usage is too low
/* if (remainingTime < 1000) {
//reschedule Schedule script
scheduleScrptTask = task.create({
taskType: task.TaskType.SCHEDULED_SCRIPT,
scriptId: "customscriptesw_78_ss_netsuite_zendesk",
deploymentId: 'customdeployesw_78_ss_netsuite_zendesk',
params: {
custscript_current_position: itemFulfillmentId,
custscript_type: executiontype
}
});
}*/
},
scheduleanother: function(type, reason) {
var scheduleScrptTask = task.create({
taskType: task.TaskType.SCHEDULED_SCRIPT,
scriptId: "customscriptesw_78_ss_netsuite_zendesk",
deploymentId: 'customdeployesw_78_ss_netsuite_zendesk',
params: {
custscript_current_position: 1,
custscript_type: type
}
});
scheduleScrptTask.submit();
},
createfile: function(netsuitedata, name) {
var fileObj = file.create({
name: name + '.txt',
fileType: file.Type.JSON,
contents: JSON.stringify(netsuitedata),
encoding: file.Encoding.UTF8,
folder: 1387,
isOnline: true
});
var fileid = fileObj.save();
log.debug("fileid", fileid);
},
pushdata: function() {
var netsuitedata = main.getdata("item");
main.senddata(netsuitedata, 360004420134, "item");
var netsuitedata = main.getdata("department");
main.senddata(netsuitedata, 360004365673, "department");
var netsuitedata = main.getdata("classification");
main.senddata(netsuitedata, 360004420774, "classification");
var netsuitedata = main.getdata("vendor");
main.senddata(netsuitedata, 360004420794, "vendor");
},
senddata: function(netsuitedata, id, type) {
var headerObj = {
'content-type': 'application/json',
'authorization': 'Basic c210QHZlcnNhdGEuY29tL3Rva2VuOnB6SFIxYVc5a09uOURUUG1jSlZIOHlic21qNXJnZkU3QmpjdkdsajY='
}
log.debug("netsuitedata in senddata", netsuitedata);
log.debug("netsuitedata in type", type);
var response = https.put({
url: 'https://tickets.zendesk.com/api/v2/ticket_fields/' + id + '.json',
body: netsuitedata,
headers: headerObj
});
log.debug("response", response);
},
getdata: function(type) {
var fileSearchObj = search.create({
type: "file",
filters: [
["name", "is", type + ".txt"]
],
columns: [
search.createColumn({
name: "name",
sort: search.Sort.ASC,
label: "Name"
}),
search.createColumn({ name: "internalid", label: "Internal ID" })
]
});
var searchResultCount = fileSearchObj.runPaged().count;
var fileid = 0;
fileSearchObj.run().each(function(result) {
fileid = result.getValue("internalid");
});
log.debug("fileid", fileid);
var fileObj = file.load({
id: fileid
});
if (fileObj.size < 10485760) {
var JSON = fileObj.getContents();
}
return JSON
},
execute: function(scriptContext) {
var currentposition = runtime.getCurrentScript().getParameter("custscript_current_position");
var executiontype = runtime.getCurrentScript().getParameter("custscript_type");
log.debug("executiontype", executiontype);
if (executiontype == "item") {
var netsuitedata = main.createitemsearch("item");
main.createfile(netsuitedata, executiontype);
main.scheduleanother("department");
} else if (executiontype == "department") {
var netsuitedata = main.createsearch("department");
main.createfile(netsuitedata, executiontype);
main.scheduleanother("classification");
} else if (executiontype == "classification") {
var netsuitedata = main.createsearch("classification");
main.createfile(netsuitedata, executiontype);
main.scheduleanother("vendor");
} else if (executiontype == "vendor") {
var netsuitedata = main.createvendorsearch("vendor");
main.createfile(netsuitedata, executiontype);
main.scheduleanother("pushdata");
} else if (executiontype == "pushdata") {
main.pushdata();
}
},
createitemsearch: function(typeofsearch) {
var Searchobj = search.create({
type: typeofsearch,
filters: [],
columns: [
search.createColumn({
name: "itemid",
sort: search.Sort.ASC,
label: "Name"
}),
search.createColumn({ name: "displayname", label: "Display Name" }),
search.createColumn({ name: "internalid", label: "Internal ID" })
]
});
var searchPageRanges = Searchobj.runPaged({
pageSize: 1000
});
log.debug("searchPageRanges createitemsearch", searchPageRanges.pageRanges.length)
var currentdataobj = {};
currentdataobj.custom_field_options = [];
for (var i = 0; i < searchPageRanges.pageRanges.length; i++) {
searchPageRanges.fetch({
index: i
}).data.forEach(function(result) {
var tempobj = {};
tempobj.value = result.getValue({
name: "internalid"
});
tempobj.name = result.getValue({
name: "itemid"
});
currentdataobj.custom_field_options.push(tempobj);
return true;
});
}
var dataobj = {};
dataobj.ticket_field = currentdataobj;
return dataobj;
},
createsearch: function(typeofsearch) {
var departmentSearchObj = search.create({
type: typeofsearch,
filters: [],
columns: [
search.createColumn({
name: "name",
sort: search.Sort.ASC,
label: "Name"
}),
search.createColumn({ name: "internalid", label: "Internal ID" })
]
});
var searchPageRanges = departmentSearchObj.runPaged({
pageSize: 1000
});
log.debug("searchPageRanges createsearch", searchPageRanges.pageRanges.length)
var currentdataobj = {};
currentdataobj.custom_field_options = [];
for (var i = 0; i < searchPageRanges.pageRanges.length; i++) {
searchPageRanges.fetch({
index: i
}).data.forEach(function(result) {
var tempobj = {};
tempobj.value = result.getValue({
name: "internalid"
});
tempobj.name = result.getValue({
name: "name"
});
currentdataobj.custom_field_options.push(tempobj);
return true;
});
}
var dataobj = {};
dataobj.ticket_field = currentdataobj;
return dataobj;
},
createvendorsearch: function(typeofsearch) {
var vendorSearchObj = search.create({
type: typeofsearch,
filters: [],
columns: [
search.createColumn({ name: "altname", label: "Name" }),
search.createColumn({ name: "internalid", label: "Internal ID" })
]
});
var searchResultCount = vendorSearchObj.runPaged().count;
var searchPageRanges = vendorSearchObj.runPaged({
pageSize: 1000
});
var currentdataobj = {};
currentdataobj.custom_field_options = [];
for (var i = 0; i < searchPageRanges.pageRanges.length; i++) {
searchPageRanges.fetch({
index: i
}).data.forEach(function(result) {
var tempobj = {};
tempobj.value = result.getValue({
name: "internalid"
});
tempobj.name = result.getValue({
name: "altname"
});
currentdataobj.custom_field_options.push(tempobj);
return true;
});
}
var dataobj = {};
dataobj.ticket_field = currentdataobj;
return dataobj;
}
}
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;
});