Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Dynamic Approval Routing Based on Organizational Hierarchy

## Overview

This Script Include provides a dynamic way to determine approval routing based on a user's organizational hierarchy, including their manager, department head, and role-based approvers. It is designed to be used in workflows, business rules, or Flow Designer actions to automate complex approval chains.

## Features

- Retrieves a user's manager as an approver.
- Adds department head if available.
- Includes role-based approvers (e.g., Finance Head for users with `finance_approver` role).
- Easily extendable for other roles or organizational logic.

## Usage

### Script Include: `ApprovalRouter`

Call the `getApprovers(userId)` method to retrieve a list of approver `sys_id`s.

```javascript
var router = new ApprovalRouter();
var approvers = router.getApprovers(current.requested_for.toString());

gs.info('Approvers: ' + approvers.join(', '));
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
var ApprovalRouter = Class.create();
ApprovalRouter.prototype = {
initialize: function() {},

/**
* Returns an array of approver sys_ids based on user's department and role.
* @param {String} userId - Sys ID of the user for whom to find approvers.
* @returns {Array} approverSysIds - List of approver sys_ids.
*/
getApprovers: function(userId) {
var approverSysIds = [];

// Get user record
var userGR = new GlideRecord('sys_user');
if (!userGR.get(userId)) {
gs.error('User not found: ' + userId);
return approverSysIds;
}

// Add manager if exists
if (userGR.manager) {
approverSysIds.push(userGR.manager.toString());
}

// Add department head if available
if (userGR.department) {
var deptGR = new GlideRecord('cmn_department');
if (deptGR.get(userGR.department)) {
if (deptGR.u_department_head) {
approverSysIds.push(deptGR.u_department_head.toString());
}
}
}

// Add role-based approvers (e.g., Finance Approver)
var roleGR = new GlideRecord('sys_user_has_role');
roleGR.addQuery('user', userId);
roleGR.query();
while (roleGR.next()) {
var roleName = roleGR.role.name;
if (roleName == 'finance_approver') {
// Add finance head
var financeGR = new GlideRecord('sys_user');
financeGR.addQuery('title', 'Finance Head');
financeGR.setLimit(1);
financeGR.query();
if (financeGR.next()) {
approverSysIds.push(financeGR.sys_id.toString());
}
}
}

return approverSysIds;
},

type: 'ApprovalRouter'
};
Loading