It is before insert business rule on sysapproval_approver table.

KOLLATIY
Tera Contributor
Filter conditions :
group is not empty
approval for starts with RITM.
this script is working fine for catalog items with flows but it is not working for catalog items with workflows. I tried to debug but i got no valid answer for this. here groupid is getting empty value for workflows where as flows i am getting exact group sysid. Help me on this community ..
 
(function executeRule(current, previous /*null when async*/)
 {
    var approverID = current.approver;
    var groupID = current.group.assignment_group;
    var requestedFor = current.sysapproval.request.requested_for;
    gs.info("approverId current approver"+approverID+"group Id, assignment grp:"+groupID+"requested_for"+requestedFor);
    if (current.group != "" && approverID == requestedFor) {
        // Get the Group Record
        var grGroup = new GlideRecord('sys_user_group');
        if (grGroup.get(groupID)) {
            // B. Check Member Count of the Group
            var count = new GlideAggregate('sys_user_grmember');
            count.addQuery('group', groupID);
            count.addAggregate('COUNT');
            count.query();
            var memberCount = 0;
            if (count.next()) {
                memberCount = count.getAggregate('COUNT');
            }
            //If user is the ONLY member (Count == 1)
            gs.info("membercount value : "+memberCount);
            if (memberCount == 1) {

 

                var newApprover = "";

 

                // === SCENARIO 1: User is the Group Manager ===
                // Logic: Route to the User's own Manager
                if (grGroup.manager == requestedFor) {
                    var userRec = new GlideRecord('sys_user');
                    if (userRec.get(requestedFor) && userRec.manager && userRec.manager.active == true) {
                        newApprover = userRec.manager;
                        gs.addInfoMessage("Approval rerouted to Requester's Manager.");
                    }
                }
               
                // === SCENARIO 2: User is NOT the Manager (Standard Member) ===
                // Logic: Route to Group Primary Manager OR Secondary Manager
                else {
                   
                    // Priority 1: Check Primary Manager
                    if (grGroup.manager && grGroup.manager != requestedFor && grGroup.manager.active == true) {
                        newApprover = grGroup.manager;
                        gs.addInfoMessage("Approval rerouted to Group Primary Manager.");
                    }
                   
                    // Priority 2: Check Secondary Manager (List Field)
                    // Only runs if Primary Manager is empty or invalid
                    else if (!grGroup.u_secondary_manager.nil()) {
                        var secListStr = grGroup.u_secondary_manager.toString();
                        var secArray = secListStr.split(',');
                       
                        // Loop through list to find the first valid, ACTIVE manager
                        for (var i = 0; i < secArray.length; i++) {
                            var candidateID = secArray[i];
                           
                            // 1. Skip if candidate is the requester
                            if (candidateID != requestedFor) {
                               
                                // 2. Check if this candidate is ACTIVE
                                // We must query sys_user because we only have an ID string here
                                var grCheckUser = new GlideRecord('sys_user');
                                if (grCheckUser.get(candidateID) && grCheckUser.active == true) {
                                    newApprover = candidateID;
                                    gs.addInfoMessage("Approval rerouted to Group Secondary Manager.");
                                    break;
                                }
                            }
                        }
                    }
                }
                if (newApprover) {
                    current.approver = newApprover;
                    // Important: We return here so we don't run the abort logic below
                    return;
                }
            }
        }
        current.setAbortAction(true);
    }
   
})(current, previous);
3 REPLIES 3

Deepak Shaerma
Mega Sage
Mega Sage

Hi @KOLLATIY 

you need a fallback mechanism to your script, like if current.group is empty (which only happend in workflows), you should look up the group from the RITM's Assignment Group (or whichever field stores the relevant group on the RITM).

(function executeRule(current, previous /*null when async*/) {

    var approverID = current.approver;
    var requestedFor = current.sysapproval.request.requested_for;
    var groupID = "";

    // 1. Try getting Group from the Approval Record (Works for Flow Designer)
    if (current.group && current.group.assignment_group) {
        groupID = current.group.assignment_group;
    } 
    // 2. Fallback: If empty, get it from the RITM Assignment Group (Works for Workflow)
    else if (current.sysapproval && current.sysapproval.sys_class_name == 'sc_req_item') {
    
        groupID = current.sysapproval.assignment_group;
    }

    gs.info("DEBUG: Approver: " + approverID + " | Group: " + groupID + " | ReqFor: " + requestedFor);

    // ------------------------------------------------------------
    
    
    if (groupID && approverID == requestedFor) {

        
        var grGroup = new GlideRecord('sys_user_group');
        if (grGroup.get(groupID)) {
            
            // B. Check Member Count of the Group
            var count = new GlideAggregate('sys_user_grmember');
            count.addQuery('group', groupID);
            count.addAggregate('COUNT');
            count.query();
            var memberCount = 0;
            if (count.next()) {
                memberCount = count.getAggregate('COUNT');
            }

            gs.info("DEBUG: Member Count: " + memberCount);

          
            if (memberCount == 1) {

                var newApprover = "";

                // === SCENARIO 1: User is the Group Manager ===
                if (grGroup.manager == requestedFor) {
                    var userRec = new GlideRecord('sys_user');
                    if (userRec.get(requestedFor) && userRec.manager && userRec.manager.active == true) {
                        newApprover = userRec.manager;
                        gs.addInfoMessage("Approval rerouted to Requester's Manager.");
                    }
                }

                // === SCENARIO 2: User is NOT the Manager (Standard Member) ===
                else {
                    // Priority 1: Check Primary Manager
                    if (grGroup.manager && grGroup.manager != requestedFor && grGroup.manager.active == true) {
                        newApprover = grGroup.manager;
                        gs.addInfoMessage("Approval rerouted to Group Primary Manager.");
                    }
                    // Priority 2: Check Secondary Manager (List Field)
                    else if (!grGroup.u_secondary_manager.nil()) {
                        var secListStr = grGroup.u_secondary_manager.toString();
                        var secArray = secListStr.split(',');

                        for (var i = 0; i < secArray.length; i++) {
                            var candidateID = secArray[i];
                            if (candidateID != requestedFor) {
                                var grCheckUser = new GlideRecord('sys_user');
                                if (grCheckUser.get(candidateID) && grCheckUser.active == true) {
                                    newApprover = candidateID;
                                    gs.addInfoMessage("Approval rerouted to Group Secondary Manager.");
                                    break;
                                }
                            }
                        }
                    }
                }

                if (newApprover) {
                    current.approver = newApprover;
                    return; // Stop here to save changes
                }
            }
        }
    } else {
        gs.info("DEBUG: Could not determine Group ID for RITM: " + current.sysapproval.number);
    }
    
    // current.setAbortAction(true); 

})(current, previous);



Happy to help! If this resolved your issue, kindly mark it as the correct answer   and Helpful 👍 and close the thread 🔒 so others can benefit too.
Warm Regards,
Deepak Sharma
Community Rising Star 2025

Ankur Bawiskar
Tera Patron
Tera Patron

@KOLLATIY 

what's your actual business requirement here?

 

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader

Matthew_13
Kilo Sage

@KOLLATIY  - I second with Ankur, What is the business requirement here?