@dhaz we are using Rest API and we wrote script include and business rule
script include:
var MSSIntegrationUtils = Class.create();
MSSIntegrationUtils.prototype = {
initialize: function() {
},
_fieldMapping : {
//mssfield : servicenowfield
"partnerTicketId" : "number",
"id":"u_mss_ticket_id",
//"issueType":"issuetype",
"service":"business_service",
"issueDescription": "short_description",
// "contactName":"",
// "contactEmail":"",
// "contactPhone":"",
"priorityVal":"urgency",
"severityVal":"impact",
"statusVal":"state"
// "nature":"requesttype",
// "worklogText":"comments",
},
_urgencyField : {
//mssfield : servicenowfield
"High (1)" : "1",
"Medium (2)" : "2",
"Low (3)" : "3"
},
_impactField : {
//mssfield : servicenowfield
"SEV1" : "1",
"SEV2" : "2",
"SEV3" : "3",
"SEV4" : "4"
},
_stateField :{
//mssfield : servicenowfield
"New" : "1", //New
"Assigned" : "9", //Assigned
"Work In Progress" : "2", //In Progress
"Pending" : "3", //On Hold
"Resolved, Pending Closure" : "6", //Resolved
"Closed" : "7" //Closed
},
getFieldMapping: function (){
return this._fieldMapping;
},
getServiceNowField: function(mssField){
var result = this._fieldMapping[mssField];
if(result)
return result;
else
return 'nomapping';
},
getMssField: function(serviceNowField){
var result = 'nomapping';
for(var key in this._fieldMapping) {
if(this._fieldMapping[key] === serviceNowField) {
result = key;
}
}
return result;
},
getUrgencyValue: function(mssValue){
var result = this._urgencyField[mssValue];
if(result)
return result;
else
return 'nomapping';
},
getPriorityValue: function(serviceNowValue){
var result = 'nomapping';
for(var key in this._urgencyField) {
if(this._urgencyField[key] === serviceNowValue) {
result = key;
}
}
return result;
},
getImpactValue: function(mssValue){
var result = this._impactField[mssValue];
if(result)
return result;
else
return 'nomapping';
},
getSeverityValue: function(serviceNowValue){
var result = 'nomapping';
for(var key in this._impactField) {
if(this._impactField[key] === serviceNowValue) {
result = key;
}
}
return result;
},
getStateValue: function(mssValue){
var result = this._stateField[mssValue];
if(result)
return result;
else
return 'nomapping';
},
getStatusValue: function(serviceNowValue){
var result = 'nomapping';
for(var key in this._stateField) {
if(this._stateField[key] === serviceNowValue) {
result = key;
}
}
return result;
},
getServiceNowUser : function(email){
var result = '';
if(email == '')
return '';
var userGr = new GlideRecord('sys_user');
userGr.addEncodedQuery('email='+email);
userGr.query();
if(userGr.next()){
result = userGr.getValue('sys_id');
}
return result;
},
updateMss: function(id, payload){
try {
gs.info("MSS log updateMss " + id +'|'+ payload);
var r = new sn_ws.RESTMessageV2('MSS Integration', 'UpdateIncident');
r.setStringParameterNoEscape('id', id);
r.setRequestBody(payload);
var response = r.execute();
var responseBody = response.getBody();
var httpStatus = response.getStatusCode();
gs.info("MSS log updateMss result " + id +'|'+ httpStatus);
}
catch(ex) {
var message = ex.message;
gs.error("Error in MSS integration " + message);
}
},
createIncident: function(payload){
//payload will be from MSS system
try{
if(payload){
var desc = '';
var id = '';
var state = '';
var urgency = '';
var impact = '';
var service = '';
var nature = '';
var worknotes = '';
var attachmentListData;
var incsysid = '';
var caller = '';
var parsedData = JSON.parse(payload);
//Mapping fields manually
for(var key in parsedData) {
switch(key){
case 'id': id = parsedData[key];
break;
case 'issueDescription' : desc = parsedData[key];
break;
case 'severityVal' : impact = this.getImpactValue(parsedData[key]) != 'nomapping' ? this.getImpactValue(parsedData[key]) : '';
break;
case 'priorityVal' : urgency = this.getUrgencyValue(parsedData[key]) != 'nomapping' ? this.getUrgencyValue(parsedData[key]) : '';
break;
case 'statusVal' : state = this.getStateValue(parsedData[key]) != 'nomapping' ? this.getStateValue(parsedData[key]) : '';
break;
case 'service' : service = parsedData[key];
break;
case 'nature' : nature = parsedData[key];
break;
case 'contactEmail' : caller = this.getServiceNowUser(parsedData[key]);
break;
case 'worklogEntries' : var worklogs = parsedData[key];
for(var i = 0; i<worklogs.length; i++){
var worklogentry = worklogs[i];
for(var item in worklogentry){
// if(item == 'username' && worklogentry[item] == 'testintegrationcontact'){
// continue;
// }
worknotes += item + ' : ' + worklogentry[item] + '\n';
}
}
break;
case 'attachments' : attachmentListData = parsedData[key];
break;
default:
break;
}
}
if(id != ''){
var incidentGr = new GlideRecord('incident');
incidentGr.addQuery('u_mss_ticket_id', id);
incidentGr.query();
if(!incidentGr.next()){
//No record with mss id. Insert the incident
incidentGr.initialize();
incidentGr.setValue('category','software');
incidentGr.setValue('subcategory','qroc');
// incidentGr.setValue('cmdb_ci','aff281ae1b9ce4106ff69827bc4bcb20');
incidentGr.setValue('contact_type','self-service');
incidentGr.setValue('assignment_group',gs.getProperty('mau.mss.int.default.assign.group'));
if(caller != ''){
incidentGr.setValue('caller_id',caller);
}
else{
//default caller IBM QRoC
incidentGr.setValue('caller_id',gs.getProperty('mau.mss.int.default.caller'));
}
if(state !='')
incidentGr.setValue('state', state);
if(impact !='')
incidentGr.setValue('impact', impact);
if(urgency !='')
incidentGr.setValue('urgency', urgency);
incidentGr.setValue('short_description', desc);
incidentGr.setValue('description', desc);
incidentGr.setDisplayValue('business_service', service);
incidentGr.setValue('u_mss_ticket_id',id);
if(worknotes != '')
incidentGr.work_notes = worknotes;
incsysid = incidentGr.insert();
this.loadAttachments(incidentGr, attachmentListData);
}
}
//Get number and patch MSS
var patchincGR = new GlideRecord('incident');
patchincGR.get(incsysid);
var incNumber = patchincGR.getValue('number');
//var patchPayload = '{"partnerTicketId": "'+incNumber+'","statusVal":"'+this.getStatusValue(patchincGR.state+'')+'"}';
var patchPayload = '{"partnerTicketId": "'+incNumber+'"}';
this.updateMss(id,patchPayload);
}
}
catch(ex) {
var message = ex.message;
gs.error("Error in MSS integration " + message);
}
},
updateIncident: function(payload){
//payload will be from MSS system
try{
if(payload){
var desc = '';
var id = '';
var state = '';
var urgency = '';
var impact = '';
var service = '';
var nature = '';
var worknotes = '';
var attachmentListData;
var parsedData = JSON.parse(payload);
//Mapping fields manually
for(var key in parsedData) {
switch(key){
case 'id': id = parsedData[key];
break;
case 'issueDescription' : desc = parsedData[key];
break;
case 'severityVal' : impact = this.getImpactValue(parsedData[key]) != 'nomapping' ? this.getImpactValue(parsedData[key]) : '';
break;
case 'priorityVal' : urgency = this.getUrgencyValue(parsedData[key]) != 'nomapping' ? this.getUrgencyValue(parsedData[key]) : '';
break;
case 'statusVal' : state = this.getStateValue(parsedData[key]) != 'nomapping' ? this.getStateValue(parsedData[key]) : '';
break;
case 'service' : service = parsedData[key];
break;
case 'nature' : nature = parsedData[key];
break;
case 'worklogEntries' : var worklogs = parsedData[key];
for(var i = 0; i<worklogs.length; i++){
if(i==0){
var worklogentry = worklogs[i];
for(var item in worklogentry){
// if(item == 'username' && worklogentry[item] == 'testintegrationcontact'){
// continue;
// }
worknotes += item + ' : ' + worklogentry[item] + '\n';
}
}
}
break;
case 'attachments' : attachmentListData = parsedData[key];
break;
default:
break;
}
}
if(id != ''){
var incidentGr = new GlideRecord('incident');
incidentGr.addQuery('u_mss_ticket_id', id);
incidentGr.query();
if(incidentGr.next()){
var isUpdated = false;
if(state !=''){
incidentGr.setValue('state', state);
if(state == '6')//If state is Resolved, set Resolution code and Resolution notes
{
incidentGr.setValue('close_code','Third Party Resolution');
incidentGr.setValue('close_notes','Resolved from MSS');
}
isUpdated = true;
}
if(impact !=''){
incidentGr.setValue('impact', impact);
isUpdated = true;
}
if(urgency !=''){
incidentGr.setValue('urgency', urgency);
isUpdated = true;
}
if(desc != ''){
incidentGr.setValue('short_description', desc);
incidentGr.setValue('description', desc);
isUpdated = true;
}
if(worknotes != ''){
incidentGr.work_notes = worknotes;
isUpdated = true;
}
if(isUpdated)
incidentGr.update();
this.loadAttachments(incidentGr, attachmentListData);
}
}
}
}
catch(ex) {
var message = ex.message;
gs.error("Error in MSS integration " + message);
}
},
loadAttachments: function(incGR, attachmentListData){
try{
//Loop through attachment list and load to ServiceNow
for(var i = 0; i<attachmentListData.length; i++){
if(i==0){
var attachmententry = attachmentListData[i];
var attachmentid = attachmententry["id"];
var filename = attachmententry["attachment"];
gs.info("MSS log loadAttachments: " + attachmentid +'|' + filename);
var r = new sn_ws.RESTMessageV2('MSS Integration', 'GetAttachment');
r.setStringParameterNoEscape('id', attachmentid);
//r.saveResponseBodyAsAttachment('incident',incsysid,filename);
var response = r.execute();
var base64encoded = response.getBody();
var decodedBytes = GlideStringUtil.base64DecodeAsBytes(base64encoded);
var newattach = new GlideSysAttachment();
newattach.write(incGR,filename,'',decodedBytes);
}
}
}
catch(ex) {
var message = ex.message;
gs.error("Error in MSS integration " + message);
}
},
postAttachments: function(attachment){
var incidentGr = new GlideRecord('incident');
incidentGr.addQuery('sys_id', attachment.getValue('table_sys_id'));
incidentGr.query();
if (incidentGr.next()) {
var sa = new GlideSysAttachment();
var binData = sa.getBytes(attachment);
var base64Data = GlideStringUtil.base64Encode(binData);
var r = new sn_ws.RESTMessageV2('MSS Integration', 'PostAttachment');
var payload = {};
payload["ticketId"] = incidentGr.getValue('u_mss_ticket_id');
payload["file"] = attachment.getValue('file_name');
payload["description"] = 'Attachment from ServiceNow';
payload["fileContent"] = base64Data;
payload["blockEventNotification"] = "Block";
var jsonval = JSON.stringify(payload);
r.setRequestBody(jsonval);
// var multipart = '------WebKitFormBoundaryBBB\r\nContent-Disposition:form-data; name="file"; fileName=' + '"' + attachment.getValue('file_name') + '"' + ';ticketId=' + '"' + incidentGr.getValue('u_mss_ticket_id') + '"' + ';description=' + '"' + 'Attachment from MAU ServiceNow' + '"' + ';' + '\r\nContent-Type:' + attachment.getValue('content_type') +'\r\n\r\n'+ base64Data + '\r\n\r\n------WebKitFormBoundaryBBB--';
// r.setRequestBody(multipart);
gs.info('MSS log postAttachments payload - ' + jsonval);
//gs.info('MSS log postAttachments payload - ' + multipart);
var response = r.execute();
var responseBody = response.getBody();
var httpStatus = response.getStatusCode();
if ((httpStatus == 200) || (httpStatus == 201)) {
gs.info('MSS log postAttachments - success' + responseBody);
} else {
gs.info('MSS log postAttachments - error' + responseBody);
}
}
},
type: 'MSSIntegrationUtils'
};
Business rule:
(function executeRule(current, previous /*null when async*/) {
// Logic to update MSS system
var payload = {};
var util = new MSSIntegrationUtils();
// var fieldlist = util.getFieldMapping();
// for(var key in fieldlist){
// if(current[fieldlist[key]].changes()){
// gs.addInfoMessage(fieldlist[key] + ' is changed');
// util.getMssField(fieldlist[key]);
// }
// }
var worknotes = '';
// if(current.state.changes()){
// var mssStatus = util.getStatusValue(current.state +'');
// if(mssStatus != 'nomapping')
// payload[util.getMssField('state')] = mssStatus;
// }
if(current.hold_reason.changesTo(2) || (current.state.changesFrom(6) && current.state.changesTo(2))){
//When onhold reason changes to Awaiting Evidence
//Or when ticket is reopened -> state change from Resolved to Inprogress
payload[util.getMssField('state')] = "New";
}
if(current.impact.changes()){
var mssSeverity = util.getSeverityValue(current.impact+'');
if(mssSeverity != 'nomapping')
payload[util.getMssField('impact')] = mssSeverity;
}
if(current.urgency.changes()){
var mssPriority = util.getPriorityValue(current.urgency+'');
if(mssPriority != 'nomapping')
payload[util.getMssField('urgency')] = mssPriority;
}
if(current.work_notes.changes()){
var lastWorkNote = current.work_notes.getJournalEntry(1);
worknotes += lastWorkNote+'';
}
if(current.comments.changes()){
var lastcomments = current.comments.getJournalEntry(1);
worknotes += lastcomments+'';
}
//Send payload if there is an update with mapped fields
if(worknotes != ''){
payload[util.getMssField('state')] = "New";
payload["worklogText"] = worknotes;
payload["blockEventNotification"] = "Block";
}
var jsonval = JSON.stringify(payload);
if(jsonval.length === 2){
//No update
}
else{
util.updateMss(current.u_mss_ticket_id+'',jsonval);
//gs.addInfoMessage('Payload - ' + jsonval);
}
})(current, previous);