NetSuite Zendesk integration is Two-way data communication. Vendors, item, department, classifications are integrated to and from between NetSuite and Zendesk.
The scheduled script is used to fetch the details from the Zendesk. The scheduled script is scheduled every 15 minutes to fetch the data from Zendesk.
ESW-78 SS Netsuite – Zendesk Connector
/**
* * @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;
});
A Suitelet is used to fetch the data from netsuite from zendesk. API call from zendesk is the trigger point to fetch the details from netsuite. Vendor ,departments,items.
ESW-78 SL Zendesk-Netsuite Connector
/**
* * @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
});