Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

Dynamic Filter reporting hierarchy script

andrewgamble
Tera Contributor

I'm trying to create a dynamic filter that will return the entire reporting hierarchy of the current user by looking at the manager field on sys_user.   So far, I've gotten it to pull the direct reports of the current user but I've not been able to get the direct report's of the current user's direct reports.   I would like to go six levels deep using something like this:

Current User -> Current User's Direct Reports -> Current User's Direct Report's Direct Reports

I thnk I need to use a while loop but I'm not quite sure how to do that.   Any thoughts?   Thanks!

Here's the script I have so far:

var getWithinMyReportingHierarchy = Class.create();

getWithinMyReportingHierarchy.prototype = {

      initialize: function() {

      },

getWithinMyReportingHierarchy:function(){

  var u = gs.getUserID();

  var gp = [];

  var g = new GlideRecord("sys_user");

  g.addQuery("manager", u);

  g.query();

  while( g.next()) {

  gp.push(g.sys_id.toString());

  }

  return gp;

  //

},

      type: 'getWithinMyReportingHierarchy'

};

1 ACCEPTED SOLUTION

Hi Andrew,



Try this one, I left the other function in there in case you want to run it the other way around:


var getWithinMyReportingHierarchy = Class.create();


getWithinMyReportingHierarchy.prototype = {


      initialize: function () {


      },


      hierarchy: [],


      getWithinMyReportingHierarchy: function () {


              var sid = gs.getUserID();


              this.getManager(sid);


              return this.hierarchy;


      },


      getMyDirectReportHierarchy: function () {


              var sid = gs.getUserID();


              this.getDirectReports(sid);


              return this.hierarchy;


      },


      getManager: function (sid) {


              var gr = new GlideRecord('sys_user');


              if (gr.get(sid)) {


                      if (!gr.manager.isNil()) {


                              if (this.hierarchy.toString().indexOf(gr.manager.sys_id.toString()) == -1) {


                                      this.hierarchy.push(String(gr.manager.sys_id));


                                      this.getManager(String(gr.manager.sys_id));


                              }


                      }


              }


      },


      getDirectReports: function (sid) {


              var gr = new GlideRecord('sys_user');


              gr.addQuery('manager', sid);


              gr.query();


              while (gr.next()) {


                      if (this.hierarchy.toString().indexOf(gr.sys_id.toString()) == -1) {


                              this.hierarchy.push(String(gr.sys_id));


                              this.getDirectReports(String(gr.sys_id));


                      }


              }


      },




      type: 'getWithinMyReportingHierarchy'


};




var reportHierarchy = new getWithinMyReportingHierarchy();


var result = reportHierarchy.getMyDirectReportHierarchy();


gs.log(result, 'hie');




Regards,



Mike Moody


View solution in original post

17 REPLIES 17

bernyalvarado
Mega Sage

A recursive function will be the best way to do this.



Thanks,


Berny


Mike Moody
Kilo Guru

Hi Andrew,



Try something like this:



var getWithinMyReportingHierarchy = Class.create();


getWithinMyReportingHierarchy.prototype = {


      initialize: function () {


      },


      hierarchy: [],


      getWithinMyReportingHierarchy: function () {


              var sid = gs.getUserID();


              this.getManager(sid);


              return this.hierarchy;


      },


      getManager: function (sid) {


              var gr = new GlideRecord('sys_user');


              if (gr.get(sid)) {


                      if (!gr.manager.isNil()) {


                              if (this.hierarchy.toString().indexOf(gr.manager.sys_id.toString()) == -1) {


                                      this.hierarchy.push(String(gr.manager.sys_id));


                                      this.getManager(String(gr.manager.sys_id));


                              }


                      }


              }


      },




      type: 'getWithinMyReportingHierarchy'


};



I hope that helps.



Mike


Thanks Michael!   Looks like it should work but I'm not getting any results when I use the dynamic filter with this script.   I'm impersonating users that have a reporting hierarchy.   I'm not even sure how to troubleshoot at this point.


Unfortunately you can't gs.log when you are calling the code from a filter. I'd recommend temporarily adding a call to this object's function from within an on-demand Scheduled Job that you can trigger by hand and observe gs.log results. Then you could add gs.log statements to display the contents of the heirarchy array.