Disabling order now button for the agent

is_12
Tera Contributor
Hello Community !..
 
When agent is ordering the item from configurable workspace then write a logic as follows. On change of primary contact, fetch the primary contact's account and then go to RITM table and check for the catalog item and the account fetched from primary contact. If there is an existing record then restrict the agent from ordering and also display the alert message "You are not allowed to order as there is an existing request for this customer"
 
already there is a UC for controlling the visibility for the items for customer.
 
Thanks,
 
 
2 ACCEPTED SOLUTIONS

SumanthDosapati
Mega Sage
Mega Sage

@is_12 

Try below approach.

  1. Write an onChange client script on primary contact as below"
    function onChange(control, oldValue, newValue, isLoading) {
        if (isLoading || newValue == '') {
            return;
        }
    
        // Call GlideAjax to check existing RITMs
        var ga = new GlideAjax('CheckUserRITMs');
        ga.addParam('sysparm_name', 'hasExistingRITM');
        ga.addParam('sysparm_user_id', newValue);
        ga.addParam('sysparm_catalog_item', g_form.getUniqueValue()); // catalog item sys_id
        ga.getXMLAnswer(function(response) {
            if (response == 'true') {
                g_form.showFieldMsg('primary_contact', 'This user has already requested this item.', 'error'); //check field name
            } else {
                g_form.hideFieldMsg('primary_contact', true); //check field name
            }
        });
    }
    ​
  2. Write a New Client callable script include as below
    Name: CheckUserRITMs
    Accessible from: All application scopes
    Client Callable: True
    var CheckUserRITMs = Class.create();
    CheckUserRITMs.prototype = Object.extendsObject(AbstractAjaxProcessor, {
        
        hasExistingRITM: function() {
            var userId = this.getParameter('sysparm_user_id');
            var catalogItemId = this.getParameter('sysparm_catalog_item');
    
            if (!userId || !catalogItemId) {
                return 'false';
            }
    
            var ritmGR = new GlideRecord('sc_req_item');
            ritmGR.addQuery('cat_item', catalogItemId);
            ritmGR.addQuery('u_primary_contact', userId); // replace with actual field name if different
            ritmGR.query();
    
            if (ritmGR.hasNext()) {
                return 'true';
            }
    
            return 'false';
        }
    
    });
    

This will show an error message at the field level and also user cannot submit even if they click the order button.

 

Accept the solution and mark as helpful if it does, to benefit future readers.
Regards,
Sumanth

View solution in original post

@is_12 

it seems script include is not getting called and hence the 3 parameters are coming as empty

a) account variable refers to which table?

b) the onChange is running on which table? that variable refers to which table?

Client Script:

1) pass the catalog item sysId as hard-coded value

    function onChange(control, oldValue, newValue, isLoading) {
        if (isLoading || newValue == '') {
            return;
        }
        if (g_user.hasRole('agent_workspace_user')) {
            alert('welcome');
            var ga = new GlideAjax('BT_CSR_SSR_CatalogUtils');
            ga.addParam('sysparm_name', 'hasExistingRITM');
            ga.addParam('sysparm_user_id', newValue);
            ga.addParam('sysparm_account', g_form.getValue('account'));
            ga.addParam('sysparm_catalog_item', 'catalogItemSysId'); // catalog item sys_id
            ga.getXMLAnswer(function(response) {
                alert(response);
                if (response == 'true') {
                    alert(true);
                    g_form.showFieldMsg('contact_name', 'This user has already requested this item.', 'error'); //check field name
                } else {
                    alert(false);
                    g_form.showFieldMsg('contact_name', 'This user has already nottttt requested this item.', 'error'); //check field name
                }
            });
        }
    }

Script Include: it should be client callable

1) pass the correct sysparm name

var BT_CSR_SSR_CatalogUtils = Class.create();
BT_CSR_SSR_CatalogUtils.prototype = Object.extendsObject(AbstractAjaxProcessor, {

    hasExistingRITM: function() {
        var checkingRITM;
        var userId = this.getParameter('sysparm_user_id');
        var catalogItemId = this.getParameter('sysparm_catalog_item');
        var userAccount = this.getParameter('sysparm_account');

        gs.info('agentIsh279 ' + userId);
        gs.info('agentIsh280 ' + catalogItemId);
        gs.info('agentIsh281 ' + userAccount);

        var ritmGR = new GlideRecord('sc_req_item');
        ritmGR.addEncodedQuery('cat_item.sys_id=' + catalogItemId + '^company.sys_id=' + userAccount + '^requested_for.sys_id=' + userId);
        ritmGR.setLimit(1);
        ritmGR.query();
        gs.info('agentIsh292 ' + ritmGR.getRowCount());
        return ritmGR.hasNext().toString();
    },

    type: 'BT_CSR_SSR_CatalogUtils'
});

AnkurBawiskar_0-1747144069548.png

 

If my response helped please mark it correct and close the thread so that it benefits future readers.

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

View solution in original post

31 REPLIES 31

@shantanu_patel8 in the client script Can't I disable the order button 

can you help me with script

 

Thanks,

@is_12 

You cannot disable the button in client script but you can write 'return false' in your onSubmit client script to restrict submission.

@is_12  No you can't disable the order button from client script. For script you can refer to the script shared by @SumanthDosapati . 

 

Please mark the answer helpful and correct if it helps the issue. Happy scripting 🙂

-Shantanu

 

SumanthDosapati
Mega Sage
Mega Sage

@is_12 

Try below approach.

  1. Write an onChange client script on primary contact as below"
    function onChange(control, oldValue, newValue, isLoading) {
        if (isLoading || newValue == '') {
            return;
        }
    
        // Call GlideAjax to check existing RITMs
        var ga = new GlideAjax('CheckUserRITMs');
        ga.addParam('sysparm_name', 'hasExistingRITM');
        ga.addParam('sysparm_user_id', newValue);
        ga.addParam('sysparm_catalog_item', g_form.getUniqueValue()); // catalog item sys_id
        ga.getXMLAnswer(function(response) {
            if (response == 'true') {
                g_form.showFieldMsg('primary_contact', 'This user has already requested this item.', 'error'); //check field name
            } else {
                g_form.hideFieldMsg('primary_contact', true); //check field name
            }
        });
    }
    ​
  2. Write a New Client callable script include as below
    Name: CheckUserRITMs
    Accessible from: All application scopes
    Client Callable: True
    var CheckUserRITMs = Class.create();
    CheckUserRITMs.prototype = Object.extendsObject(AbstractAjaxProcessor, {
        
        hasExistingRITM: function() {
            var userId = this.getParameter('sysparm_user_id');
            var catalogItemId = this.getParameter('sysparm_catalog_item');
    
            if (!userId || !catalogItemId) {
                return 'false';
            }
    
            var ritmGR = new GlideRecord('sc_req_item');
            ritmGR.addQuery('cat_item', catalogItemId);
            ritmGR.addQuery('u_primary_contact', userId); // replace with actual field name if different
            ritmGR.query();
    
            if (ritmGR.hasNext()) {
                return 'true';
            }
    
            return 'false';
        }
    
    });
    

This will show an error message at the field level and also user cannot submit even if they click the order button.

 

Accept the solution and mark as helpful if it does, to benefit future readers.
Regards,
Sumanth

@SumanthDosapati 

RITM is already there, it should return true but it is not working 

Script Include : 

    hasExistingRITM: function() {
        var userId = this.getParameter('sysparm_user_id');
        var catalogItemId = this.getParameter('sysparm_catalog_item');
        var userAccount = this.getParameter('sysparm_account');

        gs.info('agentIsh279', +userId);
        gs.info('agentIsh280', +catalogItemId);
        gs.info('agentIsh281', +userAccount);

        /*if (!userId || !catalogItemId || userAccount ) {
            gs.info('agentIsh280');
            return 'false';
        }*/

        var ritmGR = new GlideRecord('sc_req_item');
        ritmGRR.addQuery('company', userAccount);
        ritmGR.addQuery('cat_item', catalogItemId);
        ritmGR.addQuery('requestor_for', userId); // replace with actual field name if different
        ritmGR.query();

        if (ritmGR.hasNext()) {
            gs.info('agentIsh291');
            return 'true';
        }
       
        gs.info('agentIsh297');
        return 'false';
    },
 
Catalog item Script : 
function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue == '') {
        return;
    }
    if (g_user.hasRole('agent_workspace_user')) {
        alert('welcome');
        var ga = new GlideAjax('BT_CSR_SSR_CatalogUtils');
        ga.addParam('sysparm_name', 'hasExistingRITM');
        ga.addParam('sysparm_user_id', newValue);
        ga.addParam('sysparm_account', g_form.getValue('account'));
        ga.addParam('sysparm_catalog_item', g_form.getUniqueValue()); // catalog item sys_id
        ga.getXMLAnswer(function(response) {
            alert(response);
            if (response == 'true') {
                alert(true);
                g_form.showFieldMsg('contact_name', 'This user has already requested this item.', 'error'); //check field name
            } else {
                alert(false);
                g_form.showFieldMsg('contact_name', 'This user has already nottttt requested this item.', 'error'); //check field name
            }
        });
    }
}
    //Type appropriate comment here, and begin script below

is_12_0-1747134691183.png

 

        gs.info('agent279', +userId);
        gs.info('agentIsh280', +catalogItemId);
        gs.info('agentIsh281', +userAccount);
Thanks,