Sending Email to Inactive user.

HaseemM85874654
Tera Contributor

 

I have implemented a scheduled job in ServiceNow to track and manage inactive users based on their last login time. This ensures that inactive users are properly monitored and notified before deactivation. However, the final notification is not being received by users when using the following query:

 

javascript
 
gs.eventQueue("user.inactive.60", grInactive); grInactive.addEncodedQuery("last_login_time<=" + date60);
 

Here, date60 is a GlideDate variable that retrieves all users who have not logged in for more than 60 days, and grInactive is a GlideRecord variable.

1 ACCEPTED SOLUTION

Here's my approach and it's working as expected.

1. Event registry: 

JSiva_0-1741411173658.png

 

2. Scheduled job:

JSiva_1-1741411221917.png

 

 

var user = new GlideRecord('sys_user');

//Active users with last login time is not empty and last login time is before 60 days.
user.addEncodedQuery("active=true^last_login_timeISNOTEMPTY^last_login_timeRELATIVELT@dayofweek@ago@60");

user.query();
while (user.next()) {

    //Triggering the event by passing the user record and user sys_id
    gs.eventQueue('dormancy.policy.trigger', user, user.sys_id);

    // Calling the function to remove user from the groups
    this.removeUsersFromGroup(user);
}

// Function to remove users from the group
function removeUsersFromGroup(user_record) {
    var group_membership = new GlideRecord('sys_user_grmember');
    group_membership.addQuery("user", user_record.sys_id);
    group_membership.deleteMultiple();
}

 

 

Notification:

JSiva_2-1741411430062.pngJSiva_3-1741411447299.pngJSiva_4-1741411471295.png

 

Result:

JSiva_5-1741411531988.pngJSiva_6-1741411555966.png

I hope this helps.

View solution in original post

5 REPLIES 5

J Siva
Tera Sage

Hi @HaseemM85874654 

1. Are you sure that users are active at that time of triggering this event?

2. Please validate your encoded query, because you've mentioned date60 is GlideDate variable but last_login_time is GlideDateTime variable. So your encoded filter condition would be something like below,

Screenshot_20250307-061426.png

I have tried the this: last_login_timeRELATIVELT@dayofweek@ago@60, But my notification still not triggering and also the user is active, I am sending notification before taking the roles and permission however my notification is not getting even my event is triggering also roles and groups are taking properly,

Here is my Whole code,

(function executeScheduleJob() {
    var date30 = new GlideDateTime();
    date30.addDaysUTC(-30);
    var date44 = new GlideDateTime();
    date44.addDaysUTC(-44);
    var date45 = new GlideDateTime();
    date45.addDaysUTC(-45);
    var date59 = new GlideDateTime();
    date59.addDaysUTC(-59);
    var date60 = new GlideDateTime();
    date60.addDaysUTC(-60);

    function processUsers(query, eventName) {
        var grUser = new GlideRecord('sys_user');
        grUser.addEncodedQuery(query);
        grUser.query();
        while (grUser.next()) {
            gs.eventQueue(eventName, grUser);
        }
    }
    // Users inactive for 30-44 days
    processUsers("last_login_time>=" + date44.getValue() + "^last_login_time<=" + date30.getValue(), "user.inactive.30");

    // Users inactive for 45-59 days
    processUsers("last_login_time>=" + date59.getValue() + "^last_login_time<=" + date45.getValue(), "user.inactive.45");
    // users inactive for 59-60+ days
    // processUsers("last_login_time>=" + date60.getValue() + "^last_login_time<=" + date59.getValue(), "user.inactive.60");

    // Users inactive for 60+ days (disable them)
    var grInactive = new GlideRecord('sys_user');
    grInactive.addEncodedQuery("last_login_time <=" + date60); // Query all the users that are inactive more then 60.
    gr.grInactive.addEncodedQuery("last_login_timeRELATIVELT@dayofweek@ago@60");
    grInactive.query();
    while (grInactive.next()) {
        processUsers("last_login_time>=" + date60.getValue() + "^last_login_time<=" + date59.getValue(), "user.inactive.60");
        gs.eventQueue("user.inactive.60", grInactive);
        // Remove roles
        var grRoles = new GlideRecord('sys_user_has_role');
        grRoles.addQuery('user', grInactive.sys_id);
        grRoles.deleteMultiple();
        // Remove from groups
        var grGroups = new GlideRecord('sys_user_grmember');
        grGroups.addQuery('user', grInactive.sys_id);
        grGroups.deleteMultiple();

        // Disable user
        grInactive.active = false;
        grInactive.update();
    }
})();

I have test multiple scenario that's why code is not clean.



Here's my approach and it's working as expected.

1. Event registry: 

JSiva_0-1741411173658.png

 

2. Scheduled job:

JSiva_1-1741411221917.png

 

 

var user = new GlideRecord('sys_user');

//Active users with last login time is not empty and last login time is before 60 days.
user.addEncodedQuery("active=true^last_login_timeISNOTEMPTY^last_login_timeRELATIVELT@dayofweek@ago@60");

user.query();
while (user.next()) {

    //Triggering the event by passing the user record and user sys_id
    gs.eventQueue('dormancy.policy.trigger', user, user.sys_id);

    // Calling the function to remove user from the groups
    this.removeUsersFromGroup(user);
}

// Function to remove users from the group
function removeUsersFromGroup(user_record) {
    var group_membership = new GlideRecord('sys_user_grmember');
    group_membership.addQuery("user", user_record.sys_id);
    group_membership.deleteMultiple();
}

 

 

Notification:

JSiva_2-1741411430062.pngJSiva_3-1741411447299.pngJSiva_4-1741411471295.png

 

Result:

JSiva_5-1741411531988.pngJSiva_6-1741411555966.png

I hope this helps.

J Siva
Tera Sage

Hi thanks for this let me try your code..