Need to map third party application field to servicenow fields

Vani14
Tera Contributor

we have create integration in ServiceNow we are trying to map the third party application field "Severity value to impact and urgency in ServiceNow" please let me know is this possible.

 

ex: severityVal=Urgency and severityVal=Impact

2 REPLIES 2

dhaz
Tera Guru

We may need some more context as to how you are implementing this integration. Are you using REST, SOAP, IHUB spokes, data sources/transform map? The way you need to map the 2 fields depends on which method you are using for the integration.

Vani14
Tera Contributor

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