The Zurich release has arrived! Interested in new features and functionalities? Click here for more

Barcode value from cmdb_ci_peripheral is not showing up for non admins on catalog item

Jay N
Tera Contributor

Hi Experts,

 

We have an catalog item, when on change of value there should be a barcode image populated, this is working perfectly for admins, when logged as ITIL user, on change of value the barcode image is not populated. 

The logic is we are fetching the data from cmdb_ci_peripheral table. i have given ACL write permission adding ITIL role. Looks like for non admins the catalog on change script is not working, not sure how to debug this. Please help me with the solution.

We have Script include and onchange catalog client script.

 

Script include:

Name: GetRITMDetailsOnSubmitCatalogTask

 

var GetRITMDetailsOnSubmitCatalogTask = Class.create();
GetRITMDetailsOnSubmitCatalogTask.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    getDetails: function() {
        var ritmSysId = this.getParameter('sys_id');
        var barcodeimg = this.getParameter('sys_barCodeImage');
        var aID = this.getParameter('sys_assetID');
        var sNumber = this.getParameter('sys_serialNumber');
        var inStock = this.getParameter('sys_instock');
        // gs.addInfoMessage('ritmSysId: ' + barcodeimg);
        // gs.addInfoMessage('ritmSysId: ' + ritmSysId);
        // gs.addInfoMessage('aID: ' + aID);
        // gs.addInfoMessage('sNumber: ' + sNumber);
        var values = {};
        if (ritmSysId) {
            var ritm = new GlideRecord('sc_req_item');
            if (ritm.get(ritmSysId)) {
                // gs.addInfoMessage('Fetching RITM variables...');
                values.requester_name = ritm.variables.requester_name; // Requester Name
                values.requested_for = ritm.variables.requested_for; //Requested for
                values.asset_type = ritm.variables.asset_type.getDisplayValue(); //Asset Type
                values.requested_model = ritm.variables.requested_model.getDisplayValue(); //Requested Model
                values.storage_size = ritm.variables.storage_size.getDisplayValue(); //Storage Size
                values.required_location = ritm.variables.required_location; //Required Location
                // values.application_said = ritm.variables.application_said; // Application SAID
                // values.application_name = ritm.variables.application_name.getDisplayValue(); // Application Name
                values.u_cmdb_ci_assetnum = aID;
                values.serial_number = sNumber;
                // values.u_qs_cmdb_ci_application_id = ritm.variables.application_name.getDisplayValue();
                values.sys_created_by = ritm.variables.requester_name.getDisplayValue();
                values.sys_id = ritmSysId;
                values.u_asset_status = inStock;
                values.u_barcode = barcodeimg;
                values.asset_tag = aID + sNumber;
                // gs.info('RITM Variables: ' + JSON.stringify(values));
                // Check if the record already exists in cmdb_ci_peripheral using ritmSysId
                var cmdbRecord = new GlideRecord('cmdb_ci_peripheral');
                cmdbRecord.addQuery('u_ritm_id', ritmSysId); // Using RITM sys_id as the unique identifier
                cmdbRecord.query();
                if (cmdbRecord.next()) {
                    // gs.addInfoMessage('Existing record found. Updating...');
                    // cmdbRecord.sys_created_by = values.sys_created_by;
                    // cmdbRecord.u_asset_status = values.u_asset_status;
                    // cmdbRecord.u_ritm_id = values.sys_id; // Storing RITM sys_id for future updates
                    // cmdbRecord.u_requested_for = values.requested_for; // Requested for
                    // cmdbRecord.update();
                    // gs.addInfoMessage('Record updated in cmdb_ci_peripheral with Name: ' + JSON.stringify(values));
                    return;
                } else {
                    // gs.addInfoMessage('No existing record found. Inserting new record...');
                    cmdbRecord.initialize();
                    cmdbRecord.u_ritm_id = values.sys_id; // Storing RITM sys_id for future updates
                    // cmdbRecord.name = values.requester_name; // Requester Name
                    cmdbRecord.name = values.asset_tag; // Requester Name
                    cmdbRecord.u_requested_for = values.requested_for; // Requested for
                    cmdbRecord.u_asset_type = values.asset_type; // Asset Type
                    cmdbRecord.model_number = values.requested_model; //Requested Model
                    cmdbRecord.u_storage_size = values.storage_size; //Storage Size
                    cmdbRecord.location = values.required_location; //Required Location
                    cmdbRecord.serial_number = values.serial_number; //Serial Number
                    cmdbRecord.u_cmdb_ci_assetnum = values.u_cmdb_ci_assetnum; //Asset Number
                    // cmdbRecord.u_qs_cmdb_ci_application_id = values.application_said; // Application SAID
                    // cmdbRecord.u_application_name = values.application_name; // Application Name
                    // cmdbRecord.sys_created_by = values.sys_created_by;
                    cmdbRecord.sys_created_by = "USB Integration";
                    cmdbRecord.u_asset_status = values.u_asset_status; // Asset  Status
                    cmdbRecord.u_barcode = values.u_barcode;
                    cmdbRecord.asset_tag = values.asset_tag;
                    cmdbRecord.u_requestor_name = values.requester_name;
                    cmdbRecord.insert();
                    // gs.addInfoMessage('New record inserted into cmdb_ci_peripheral with Name: ' + JSON.stringify(cmdbRecord));
                }
            }
        }
        // gs.info('Returning values: ' + JSON.stringify(values)); // Debugging log
        return JSON.stringify(values); // Ensure this returns a string
    },
    checkExistingRecord: function() {
        var ritmSysId = this.getParameter('sys_id');
        var result = {
            found: false
        };
        if (ritmSysId) {
            var cmdbRecord = new GlideRecord('cmdb_ci_peripheral');
            cmdbRecord.addQuery('u_ritm_id', ritmSysId);
            cmdbRecord.query();

            if (cmdbRecord.next()) {
                result.found = true;
                result.sys_id = cmdbRecord.getUniqueValue();
                result.assetID = cmdbRecord.u_cmdb_ci_assetnum;
                result.serialNumber = cmdbRecord.serial_number;
                result.message = 'Existing record found';
            }
        }
        return JSON.stringify(result);
    },
    updateAssetState: function() {
        var ritmSysId = this.getParameter('sys_id'); // Get RITM sys_id from client script
        var aInUse = this.getParameter('sys_inuse'); // Get the asset state to update
        var assignTo = this.getParameter('sys_assigned_to'); // Get the asset state to update
        // gs.info('Existing record found for u_ritm_id: ' + ritmSysId);
        var result = {
            found: false
        };
        if (ritmSysId) {
            var cmdbRecord = new GlideRecord('cmdb_ci_peripheral');
            cmdbRecord.addQuery('u_ritm_id', ritmSysId);
            cmdbRecord.query();
            // gs.info('cmdbRecord record found for u_ritm_id: ' + ritmSysId);
            if (cmdbRecord.next()) {
                var cmdbSysId = cmdbRecord.getUniqueValue(); // Get the existing record's sys_id
                // gs.addInfoMessage('Existing record found for u_ritm_id: ' + ritmSysId + ' | cmdb_sys_id: ' + cmdbSysId);
                // Update u_asset_status to "In Use"
                cmdbRecord.setValue('u_asset_status', aInUse);
                cmdbRecord.setValue('assigned_to', assignTo);
                cmdbRecord.update();
                // gs.addInfoMessage('Updated u_asset_status to: ' + aInUse);
                result.found = true;
                result.sys_id = cmdbSysId;
                result.message = 'Existing record updated successfully.';
            } else {
                // gs.addInfoMessage('No existing record found for u_ritm_id: ' + ritmSysId);
                result.message = 'No existing record found.';
            }
        }
        return JSON.stringify(result);
    },
    checkRITM: function() {
        var ritmId = this.getParameter('sysparm_ritm_id');
        var gr = new GlideRecord('cmdb_ci_peripheral');
        gr.addQuery('u_ritm_id', ritmId);
        gr.query();
        if (gr.next()) {
            var result = {
                sys_id: gr.getUniqueValue(),
                asset_number: gr.getValue('u_cmdb_ci_assetnum'),
                serial_number: gr.getValue('serial_number')
            };
            return JSON.stringify(result); // Convert to JSON string for response
        }
        return JSON.stringify({
            sys_id: '',
            asset_number: '',
            serial_number: ''
        }); // Return empty values if no match
    },
    getNextBarcode: function() {
        var prefix = 'u';
        var highestSerial = -1;
        var gr = new GlideRecord('cmdb_ci_peripheral');
        gr.addQuery('asset_tag', 'STARTSWITH', prefix);
        gr.query();
        while (gr.next()) {
            var assetTag = gr.getValue('asset_tag'); // e.g., 'u000', 'u001'
            var serialPart = assetTag.substring(1); // remove prefix => '000'
            var serialNumber = parseInt(serialPart, 10);
            if (!isNaN(serialNumber) && serialNumber > highestSerial) {
                highestSerial = serialNumber;
            }
        }
        var nextSerial = (highestSerial + 1).toString().padStart(4, '0'); // '0000', '0001', etc.
        var result = {
            asset_id: prefix,
            serial_number: nextSerial
        };
        return JSON.stringify(result);
    },

    getExistingUSBDetails: function() {
        var ritmSysId = this.getParameter('sys_id');
        var usbInUse = this.getParameter('sys_inuse');
        var values = {};
        if (!ritmSysId) {
            gs.error('RITM Sys ID is missing');
            return JSON.stringify({
                error: 'RITM Sys ID missing'
            });
        }
        var ritm = new GlideRecord('sc_req_item');
        if (!ritm.get(ritmSysId)) {
            gs.error('Invalid RITM Sys ID: ' + ritmSysId);
            return JSON.stringify({
                error: 'Invalid RITM'
            });
        }
        // Fetch RITM Variables
        values.please_select_asset_tag = ritm.variables.please_select_asset_tag.getDisplayValue() + '';
        values.requested_for = ritm.variables.requested_for + '';
        values.requester_name = ritm.variables.requester_name + '';
        values.required_location = ritm.variables.required_location + '';
        // values.application_said = ritm.variables.application_said + '';
        // values.application_name = ritm.variables.application_name + '';
        values.u_asset_status = usbInUse;
        // Logging for debug
        // gs.info('Fetched Variables from RITM: ' + JSON.stringify(values));
        // Update cmdb_ci_peripheral based on correlation ID (asset tag)
        var cmdbRecord = new GlideRecord('cmdb_ci_peripheral');
        cmdbRecord.addQuery('asset_tag', values.please_select_asset_tag);
        cmdbRecord.query();

        if (cmdbRecord.next()) {
            cmdbRecord.assigned_to = values.requested_for;
            cmdbRecord.location = values.required_location;
            // cmdbRecord.u_qs_cmdb_ci_application_id = values.application_said;
            // cmdbRecord.u_application_name = values.application_name;
            cmdbRecord.u_requested_for = values.requested_for;
            cmdbRecord.u_asset_status = values.u_asset_status;
            cmdbRecord.u_requestor_name = values.requester_name;
            cmdbRecord.update();
            values.sys_id = cmdbRecord.getUniqueValue();
            // gs.info('Updated cmdb_ci_peripheral: ' + cmdbRecord.sys_id);
        } else {
            gs.warn('No cmdb_ci_peripheral record found with correlation ID: ' + values.please_select_asset_tag);
        }

        return JSON.stringify(values);
    },
    getExistingUSBSysID: function() {
        var ritmSysId = this.getParameter('sys_id');

        if (!ritmSysId) {
            gs.error('RITM Sys ID is missing');
            return JSON.stringify({
                error: 'RITM Sys ID missing'
            });
        }

        var ritm = new GlideRecord('sc_req_item');
        if (!ritm.get(ritmSysId)) {
            gs.error('Invalid RITM Sys ID: ' + ritmSysId);
            return JSON.stringify({
                error: 'Invalid RITM'
            });
        }

        var assetTag = ritm.variables.please_select_asset_tag.getDisplayValue() + '';

        var cmdbRecord = new GlideRecord('cmdb_ci_peripheral');
        cmdbRecord.addQuery('asset_tag', assetTag);
        cmdbRecord.query();

        if (cmdbRecord.next()) {
            return JSON.stringify({
                sys_id: cmdbRecord.getUniqueValue()
            });
        } else {
            return JSON.stringify({
                error: 'No matching record found for asset_tag: ' + assetTag
            });
        }
    },

    getPeripheralName: function() {
        var sysId = this.getParameter('sysparm_sys_id');

        if (!sysId) return '';

        var gr = new GlideRecord('cmdb_ci_peripheral');
        if (gr.get(sysId)) {
            return gr.getDisplayValue(); // or gr.getValue('name') if you want the raw name
        }
        return '';
    },

    type: 'GetRITMDetailsOnSubmitCatalogTask'
});
 
Catalog client script: 
Name: Fetch Barcode Image
Type: On Change
 
Script:
function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue == '') {
        return;
    }
    var ga = new GlideAjax('GetRITMDetailsOnSubmitCatalogTask');
    ga.addParam('sysparm_name', 'getPeripheralName');
    ga.addParam('sysparm_sys_id', newValue); // sys_id from the reference field
    ga.getXMLAnswer(function(response) {
        var name = response;
        if (name) {
            var gr = new GlideRecord('cmdb_ci_peripheral');
            gr.addQuery('asset_tag', name);
            gr.query(function(gr) { // Asynchronous callback function
                if (gr.next()) {
                    var barcodeBase64 = gr.getValue('u_barcode');
                    // alert('barcodeBase64: ' + barcodeBase64);
                    if (barcodeBase64) {
                        // var barcodeImg = '<img src="' + barcodeBase64 + '" width="380" height="100" id="barcodeImage"/>';
                        var barcodeImg = '<img src="' + barcodeBase64 + '" id="barcodeImage"/>';
                        g_form.setValue('barcode_image', barcodeImg);
                        g_form.setVisible('barcode_image', true);
                    } else {
                        g_form.setValue('barcode_image', '<span style="color:red; font-size: 16px;">No barcode data available.</span>');
                        g_form.setVisible('barcode_image', true);
                    }
                } else {
                    g_form.setValue('barcode_image', '<span style="color:red; font-size: 16px;">No barcode data available.</span>');
                    g_form.setVisible('barcode_image', true);
                }
            });
        }
    });

}
 
--------
 Non Admins view:
JayN_0-1752750541344.png

 

Admin view:

JayN_1-1752750682598.png

 

2 REPLIES 2

Brad Warman
Giga Sage

Have you got the ACL configured at both the table and the field level? Also check the ACLs on the attachment and image tables.

 

To pinpoint the cause of the issue, you can either use the access analyser, or enable debug security, impersonate an ITIL user and trigger the client script again. This will tell you whether it's an ACL issue or not. 

Harmeet2Singh
Tera Expert

you only need read acl on cmdb_ci_peripheral table, please also check if you have read access to field u_barcode.