Auto populate Manger Levels in incident form

Anandini
Tera Expert

In Incident form, i created three custom fields( le1,le2,le3) and based on 'caller_id' selection those fields has to automatically populate by caller manager, caller manager's manager, caller manager's manager's manager.

it should be like an hierarchy.

anyone know how to achieve this.. i think i have to write a client script on caller field. 

3 ACCEPTED SOLUTIONS

Yashsvi
Kilo Sage

Hi @Anandini,

try below script:

Client Script:

function onChange(control, oldValue, newValue, isLoading, isTemplate) {
    if (isLoading || newValue === '') {
        return;
    }

    var ga = new GlideAjax('UserHierarchyHelper');
    ga.addParam('sysparm_name', 'getHierarchy');
    ga.addParam('sysparm_user_id', newValue);
    ga.getXMLAnswer(function(response) {
        var result = response.responseText;
        if (result) {
            var hierarchy = JSON.parse(result);
            g_form.setValue('le1', hierarchy.manager || '');
            g_form.setValue('le2', hierarchy.manager_manager || '');
            g_form.setValue('le3', hierarchy.manager_manager_manager || '');
        }
    });
}

Script Include:

var UserHierarchyHelper = Class.create();
UserHierarchyHelper.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    getHierarchy: function() {
        var userId = this.getParameter('sysparm_user_id');
        var result = {};

        var user = new GlideRecord('sys_user');
        if (user.get(userId)) {
            result.manager = user.manager.getDisplayValue();
            
            if (user.manager) {
                var manager = new GlideRecord('sys_user');
                if (manager.get(user.manager.sys_id)) {
                    result.manager_manager = manager.manager.getDisplayValue();
                    
                    if (manager.manager) {
                        var manager_manager = new GlideRecord('sys_user');
                        if (manager_manager.get(manager.manager.sys_id)) {
                            result.manager_manager_manager = manager_manager.manager.getDisplayValue();
                        }
                    }
                }
            }
        }

        return JSON.stringify(result);
    }
});

please check below link:

https://www.servicenow.com/community/developer-forum/i-want-to-populate-the-manager-details-in-the-i...

Thank you, please make helpful if you accept the solution.

View solution in original post

Aditya02
Tera Guru

Hi @Anandini  ,

 

You can achieve this functionality by writing a Script Include and calling it from an onChange Client Script on the Caller field. Here are the scripts:

 

Script Include:

var levelofmanager = Class.create();
levelofmanager.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    managers: function() {
        //gs.addInfoMessage('started');
        var id = this.getParameter('callersysid');  // to get the passed parameters

        var obj = {};
        var l1 = new GlideRecord('sys_user');
        if (l1.get(id)) {
            obj.m1 = l1.manager.sys_id.toString();

            var l2 = new GlideRecord('sys_user');
            if (l2.get(l1.manager)) {
                obj.m2 = l2.manager.sys_id.toString();;
               
                var l3 = new GlideRecord('sys_user');
                if (l3.get(l2.manager)) {
                    obj.m3 = l3.manager.sys_id.toString();
                }
            }
        }
        return JSON.stringify(obj);
    },
    type: 'levelofmanager'
});


Client Script:

function onChange(control, oldValue, newValue, isLoading, isTemplate) {
    if (isLoading || newValue === '') {
        return;
    }
    var user = g_form.getValue('caller_id');
    var sys = new GlideAjax('levelofmanager');
    sys.addParam('sysparm_name', 'managers');
    sys.addParam('callersysid', user);
    sys.getXMLAnswer(handleResponse);     // Used for Array or Obj as Response.

    function handleResponse(response) {
        var res = JSON.parse(response);    // Used to get json formated response.
        g_form.setValue('u_le1', res.m1);
        g_form.setValue('u_le2', res.m2);
        g_form.setValue('u_le3', res.m3);
    }
}

If this solution resolves your task, please mark this as the 'correct answer' and give it a like.

 

Thanks,
Aditya

View solution in original post

Manikanta Kota
Mega Guru

Hi @Anandini ,

Try this script onload client script

var cal = g_form.getReference('caller_id'); {
        if (cal) {
            g_form.setValue('u_manager', caller.manager);


            g_form.setValue('u_manager2', caller.manager.manager);
                }

Should my answer prove to be helpful, kindly mark it as such by clicking "Accept as Solution" and "Helpful."

 

Regards,

Manikanta. Kota

View solution in original post

8 REPLIES 8

Valmik Patil1
Kilo Sage

Hello @Anandini ,

 

You. need to write onchange client script in field caller with GlideAjax

In GlideAjax you can user below script which returns the array of sys_id of managers levels.

Just passed caller id form client script using GlideAjax to script include.Don't forget to make your script include client callable

var manager_list = [];
var callerId = this.getParameter('sysparm_caller'); // caller id passed through client script
var getManagerHierarchy = new GlideRecord("sys_user");

getManagerHierarchy.addQuery("sys_id",callerId); // caller id from client script

getManagerHierarchy.query();

if(getManagerHierarchy.next()){

  var mngr = getManagerHierarchy.manager;
   while(mngr != '' && manager_list.indexOf(mngr.getValue("user_name")) == -1){

      manager_list.push(mngr.getValue("user_name"));

      mngr = mngr["manager"];   

    }

}

Please let me know if you need any other help

Thanks,

Valmik Patil

 

 

Sai Krishna6147
Mega Guru

Hi @Anandini 

You can try this script

function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue === '') {
        return;
    }

    // Get the caller reference
    var caller = g_form.getReference('caller_id', function(caller) {
        if (caller) {
            // Set the first level manager
            g_form.setValue('le1', caller.manager.getDisplayValue());

            // Get the manager's manager
            var manager = new GlideRecord('sys_user');
            if (manager.get(caller.manager)) {
                g_form.setValue('le2', manager.manager.getDisplayValue());

                // Get the manager's manager's manager
                var managersManager = new GlideRecord('sys_user');
                if (managersManager.get(manager.manager)) {
                    g_form.setValue('le3', managersManager.manager.getDisplayValue());
                }
            }
        }
    });
}

Thank you, please make helpful if you accept the solution.

VishaalRanS
Tera Guru

Hi @Anandini 

 

To automatically populate custom fields in the ServiceNow Incident form based on the selected caller_id , you can use an on Change Client Script. This script will fetch the caller's manager, the manager's manager, and populate the custom fields (le1,le2,le3) accordingly.

 

Please go through the following Link:

Solved: Caller field is not auto populated when call is ge... - ServiceNow Community

 

Thanks, and Regards

Vishaal

Please mark this response as correct or helpful if it assisted you with your question.

 

Manikanta Kota
Mega Guru

Hi @Anandini ,

Try this script onload client script

var cal = g_form.getReference('caller_id'); {
        if (cal) {
            g_form.setValue('u_manager', caller.manager);


            g_form.setValue('u_manager2', caller.manager.manager);
                }

Should my answer prove to be helpful, kindly mark it as such by clicking "Accept as Solution" and "Helpful."

 

Regards,

Manikanta. Kota