Help with inbound email action script

Tracey6
Tera Contributor

Hi - I need some help with a new email inbound email action script that:

1)  Checks if the sender has an open Incident created in the last 15 minutes.

2)  If no, create a new incident

3)  If yes, add the new email body as a comment on the most recent open incident.

 

The script runs and finds the last open incident but is not adding 15 minutes to the variable fifteenMinutesLater.  Therefore, a new incident always gets created.   I added some logging to get the value of fifteenMinutesLater and it's the same as the variable incidentCreated.  

 d 

Below is the script and a snapshot of the logs.

 

(function runEmailAction(email) {
var logPrefix = "[DEV OPS Inbound Email Action - Incident 15-min Rule]";
var fromAddress = (email.from || '').match(/<(.+)>/);
fromAddress = fromAddress ? fromAddress[1] : email.from;

gs.info(logPrefix + "STEP 1 - Email received from: " + fromAddress);
email.log(logPrefix + "STEP 1 - Email received from: " + fromAddress);

// Find the user based on the from address
var userGr = new GlideRecord('sys_user');
userGr.addQuery('email', fromAddress);
userGr.query();

if (!userGr.next()) {
var msg = logPrefix + "STEP 2 - No user found with email: " + fromAddress;
gs.info(msg);
email.log(msg);
return;
}

var userId = userGr.sys_id;

// Use current processing time as the email reference time
var emailSent = new GlideDateTime();
gs.info(logPrefix + "STEP 3 - Email processed at: " + emailSent.getDisplayValue());
email.log(logPrefix + "STEP 3 - Email processed at: " + emailSent.getDisplayValue());

// Query most recent open (non-closed) incident by this user
var incGr = new GlideRecord('incident');
incGr.addQuery('caller_id', userId);
incGr.addQuery('state', '!=', '7'); // Not closed
incGr.orderByDesc('sys_created_on');
incGr.setLimit(1);
incGr.query();
(function runEmailAction(email) {
var logPrefix = "[DEV OPS Inbound Email Action - Incident 15-min Rule]";
var fromAddress = (email.from || '').match(/<(.+)>/);
fromAddress = fromAddress ? fromAddress[1] : email.from;

gs.info(logPrefix + "STEP 1 - Email received from: " + fromAddress);
email.log(logPrefix + "STEP 1 - Email received from: " + fromAddress);

// Find the user based on the from address
var userGr = new GlideRecord('sys_user');
userGr.addQuery('email', fromAddress);
userGr.query();

if (!userGr.next()) {
var msg = logPrefix + "STEP 2 - No user found with email: " + fromAddress;
gs.info(msg);
email.log(msg);
return;
}

var userId = userGr.sys_id;

// Use current processing time as the email reference time
var emailSent = new GlideDateTime();
gs.info(logPrefix + "STEP 3 - Email processed at: " + emailSent.getDisplayValue());
email.log(logPrefix + "STEP 3 - Email processed at: " + emailSent.getDisplayValue());

// Query most recent open (non-closed) incident by this user
var incGr = new GlideRecord('incident');
incGr.addQuery('caller_id', userId);
incGr.addQuery('state', '!=', '7'); // Not closed
incGr.orderByDesc('sys_created_on');
incGr.setLimit(1);
incGr.query();

if (incGr.next()) {

var incidentCreated = new GlideDateTime(incGr.sys_created_on); //date and time last open incident was created
gs.log(logPrefix + "STEP 3A - Incident Created: " + incidentCreated.getDisplayValue());

var fifteenMinutesLater = new GlideDateTime(); //variable for incidentCreated plus 15 minutes
fifteenMinutesLater.setDisplayValue(incidentCreated.getDisplayValue());
fifteenMinutesLater.addMinutes(15);
gs.log(logPrefix + "STEP 3B - Fifteen Minutes Later: " + fifteenMinutesLater.getDisplayValue());

gs.info(logPrefix + "STEP 4 - Most recent open incident: " + incGr.number + " created at " + incidentCreated.getDisplayValue());
email.log(logPrefix + "STEP 4 - Most recent open incident: " + incGr.number + " created at " + incidentCreated.getDisplayValue());

gs.info(logPrefix + "STEP 5 - Comparing current time: " + emailSent.getDisplayValue() +
" to 15-minute window ending at: " + fifteenMinutesLater.getDisplayValue());
email.log(logPrefix + "STEP 5 - Comparing current time: " + emailSent.getDisplayValue() +
" to 15-minute window ending at: " + fifteenMinutesLater.getDisplayValue());

if (emailSent.compareTo(fifteenMinutesLater) < 0) {
// Within 15-minute window — update the existing incident
incGr.comments = "New email received at " + emailSent.getDisplayValue() + ":\n" + email.body_text;
incGr.update();

var updateMsg = logPrefix + "STEP 6 - Updated existing incident [" + incGr.number + "] with new email comment.";
gs.info(updateMsg);
email.log(updateMsg);
return; // Stop further processing
}

var expiredMsg = logPrefix + "STEP 7 - Email is outside 15-minute window. Creating new incident.";
gs.info(expiredMsg);
email.log(expiredMsg);
} else {
var noMatchMsg = logPrefix + "STEP 8 - No open incident found. Creating new incident.";
gs.info(noMatchMsg);
email.log(noMatchMsg);
}

// Create a new incident
var newInc = new GlideRecord('incident');
newInc.initialize();
newInc.caller_id = userId;
newInc.short_description = email.subject || "Incident submitted via email";
newInc.description = email.body_text;
newInc.comments = "Incident created from email processed at " + emailSent.getDisplayValue();
var newSysId = newInc.insert();

var newMsg = logPrefix + "STEP 9 - Created new incident [" + newInc.number + "].";
gs.info(newMsg);
email.log(newMsg);

})(email);

if (incGr.next()) {
/*var incidentCreated = new GlideDateTime(incGr.sys_created_on);
var fifteenMinutesLater = new GlideDateTime();
fifteenMinutesLater.setValue(incidentCreated.getValue());
fifteenMinutesLater.addMinutes(15);*/

var incidentCreated = new GlideDateTime(incGr.sys_created_on); //date and time last open incident was created
gs.log(logPrefix + "STEP 3A - Incident Created: " + incidentCreated.getDisplayValue());

var fifteenMinutesLater = new GlideDateTime(); //variable for incidentCreated plus 15 minutes
fifteenMinutesLater.setDisplayValue(incidentCreated.getDisplayValue());
fifteenMinutesLater.addMinutes(15);
gs.log(logPrefix + "STEP 3B - Fifteen Minutes Later: " + fifteenMinutesLater.getDisplayValue());

gs.info(logPrefix + "STEP 4 - Most recent open incident: " + incGr.number + " created at " + incidentCreated.getDisplayValue());
email.log(logPrefix + "STEP 4 - Most recent open incident: " + incGr.number + " created at " + incidentCreated.getDisplayValue());

gs.info(logPrefix + "STEP 5 - Comparing current time: " + emailSent.getDisplayValue() +
" to 15-minute window ending at: " + fifteenMinutesLater.getDisplayValue());
email.log(logPrefix + "STEP 5 - Comparing current time: " + emailSent.getDisplayValue() +
" to 15-minute window ending at: " + fifteenMinutesLater.getDisplayValue());

if (emailSent.compareTo(fifteenMinutesLater) < 0) {
// Within 15-minute window — update the existing incident
incGr.comments = "New email received at " + emailSent.getDisplayValue() + ":\n" + email.body_text;
incGr.update();

var updateMsg = logPrefix + "STEP 6 - Updated existing incident [" + incGr.number + "] with new email comment.";
gs.info(updateMsg);
email.log(updateMsg);
return; // Stop further processing
}

var expiredMsg = logPrefix + "STEP 7 - Email is outside 15-minute window. Creating new incident.";
gs.info(expiredMsg);
email.log(expiredMsg);
} else {
var noMatchMsg = logPrefix + "STEP 8 - No open incident found. Creating new incident.";
gs.info(noMatchMsg);
email.log(noMatchMsg);
}

// Create a new incident
var newInc = new GlideRecord('incident');
newInc.initialize();
newInc.caller_id = userId;
newInc.short_description = email.subject || "Incident submitted via email";
newInc.description = email.body_text;
newInc.comments = "Incident created from email processed at " + emailSent.getDisplayValue();
var newSysId = newInc.insert();

var newMsg = logPrefix + "STEP 9 - Created new incident [" + newInc.number + "].";
gs.info(newMsg);
email.log(newMsg);

})(email);

1 REPLY 1

Tracey6
Tera Contributor

Screenshot script.png