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

@Ankur Bawiskar 

is_12_0-1747119690745.pngis_12_1-1747119755308.png

one Uc is there to control the visibility on the support portal.

But now I need to control it on the workspace

 

Thanks,

@is_12 

that user criteria should work when you open the catalog from workspace also

Did it not work?

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

@Ankur Bawiskar For the visibility of item to the customer(for this we have a different logic). this is working fine

for agent we have this logic how to implement this

Thanks,

 

@is_12 

you can have catalog client script on your variable and use GlideAjax to validate

If already record exist then show error message on that variable and user won't be able to submit the form

what did you start with and where are you stuck?

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

shantanu_patel8
Mega Guru

@is_12 

 

You can write a on change catalog client script on primary contact variable.

 

In the script you can check if the RITM already exists for the combination. If the RITM exists then you can display an alert or message as per your need and clear the selected Primary contact. This way you wont have to deal with disabling the order now button.

 

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

-Shantanu