We're reclaiming inactive PDIs to keep them available for active builders. Learn what's changing, who's affected, and how to protect your work. Read More

triggering subflow from script include.

YashasM
Tera Contributor
var triggerServiceOptionFlow = Class.create();
triggerServiceOptionFlow.prototype = Object.extendsObject(AbstractAjaxProcessor, {

    bulkSubscribers: function () {
        try {
            // --- Read parameters (support both plain and sysparm_* names)
            var sysIdList = this._getParam('sys_id_list') || this._getParam('sysparm_sys_id_list');
            var targetServiceSysId = this._getParam('target_service_sys_id') || this._getParam('sysparm_target_service_sys_id');

            if (!sysIdList || !targetServiceSysId) {
                return JSON.stringify({
                    success: false,
                    message: 'Missing required parameters.'
                });
            }

            // --- Parse and sanitize subscriber sys_ids
            var sysIds = sysIdList.split(',').map(function (id) {
                return (id || '').trim();
            }).filter(function (id) {
                return id.length > 0;
            });

            if (sysIds.length === 0) {
                return JSON.stringify({
                    success: false,
                    message: 'No valid subscriber sys_ids provided.'
                });
            }

            // --- Validate target service option
            var targetService = new GlideRecord('u_service_option');
            if (!targetService.get(targetServiceSysId)) {
                return JSON.stringify({
                    success: false,
                    message: 'Target service option not found.'
                });
            }
            var targetServiceName = targetService.getValue('name') || targetServiceSysId;

            // --- Collect ACTIVE users from the subscriber list
            var userSet = {}; // de-dupe
            var activeUserSysIds = [];
            var subscriberGR = new GlideRecord('cmdb_subscriber');
            subscriberGR.addQuery('sys_id', 'IN', sysIds.join(','));
            subscriberGR.addQuery('u_active', true);
            subscriberGR.query();
            while (subscriberGR.next()) {
                var u = subscriberGR.getValue('user');
                if (u && !userSet[u]) {
                    userSet[u] = true;
                    activeUserSysIds.push(u);
                }
            }

            if (activeUserSysIds.length === 0) {
                return JSON.stringify({
                    success: false,
                    message: 'No active subscribers found to process.'
                });
            }

            // --- Prepare Subflow inputs (NOTE: using new names)
            var inputs = {
                // Subflow input name: Array.String of user sys_ids
                user_id: activeUserSysIds,
                // Subflow input name: String (service option sys_id)
                service_option: targetServiceSysId
            };

            // --- Execute Subflow
            // To run asynchronously in the background, replace inForeground() with inBackground()
            var result = sn_fd.FlowAPI
                .getRunner()
                .subflow('global.service_option_subflow')
                .inForeground()
                .withInputs(inputs)
                .run();

            // If the subflow ever returns outputs later:
            // var outputs = result.getOutputs();

            return JSON.stringify({
                success: true,
                message: activeUserSysIds.length + ' users successfully processed for service option: ' + targetServiceName
            });

        } catch (ex) {
            var msg = (ex && ex.message) ? ex.message : ex.toString();
            gs.error('Bulk Subscriber Flow Error: ' + msg);
            return JSON.stringify({
                success: false,
                message: 'Error triggering subflow: ' + msg
            });
        }
    },

    // --- Helper to read both plain and sysparm_* names safely
    _getParam: function (name) {
        return this.getParameter(name) || this.getParameter('sysparm_' + name) || '';
    },

    type: 'triggerServiceOptionFlow'
}); this is the script include .
function okButton() {
    var service = gel('service').value;

    if (!service) {
        alert("Please select a service option.");
        return;
    }

    var gdw = GlideDialogWindow.get();
    var selectedSubscribers = gdw.getPreference('selected_subscriber');

    if (!selectedSubscribers) {
        alert("No subscribers selected.");
        return;
    }

    var userArray = selectedSubscribers.split(',');

    if (userArray.length > 1000) {
        alert("You cannot process more than 1000 users at once.");
        return;
    }

    // Single GlideAjax call
    var ga = new GlideAjax('triggerServiceOptionFlow'); // Script Include name
    ga.addParam('sysparm_name', 'bulkSubscribers');      // Function name
    ga.addParam('sys_id_list', selectedSubscribers);
    ga.addParam('target_service_sys_id', service);

    ga.getXMLAnswer(function(answer) {
        alert(answer);
        if (answer) {
            alert(answer); // Now will show the server-returned message
            if (typeof g_list !== 'undefined') {
                g_list.refresh();
            }
        } else {
            alert("No response from server.");
        }

        closeWindow();
    });
} this is client script of ui page 
I am getting error  when i try to trigger this subflow  "{"success":false,"message":"Error triggering subflow: flow object does not exist"". Please help me to fix this
1 REPLY 1

Craig Gruwell
Mega Sage

Hi @YashasM ,

 

Have you tried to trigger the subflow directly using the Test functionality?  If so, what happens?