We've updated the ServiceNow Community Code of Conduct, adding guidelines around AI usage, professionalism, and content violations. Read more

Assessment is not populating when State is Submitted on Demand

shrutijibhekar
Tera Contributor

Hello @all 

I have requirement where assessment should populate on state is submitted,

I have modified OOB script,

Script include = DemandUtils

/**
 * JavaScript utility functions for Demand Management
 *
 */

var DemandUtil = Class.create();


DemandUtil.prototype = {
   
    checkIfAssessmentExists : function(current) {
        var gr = new GlideRecord('asmt_assessment_instance_question');
        gr.addEncodedQuery('source_id=' + current.demand.sys_id + '^instance.user.sys_id=' + current.stakeholder.user.sys_id + '^instance.state!=canceled');
        gr.query();
       
        if (gr.next())
            return true;
        return false;
    },
// -----------------------------
    // Create assessments for first submit of a demand
    // -----------------------------
    createAssessmentsForFirstSubmit: function(demandGr) {
        if (!demandGr || !demandGr.isValidRecord())
            return;

        // 1️⃣ Ensure at least one stakeholder exists
        var stakeholderGR = new GlideRecord('dmn_m2m_demand_stakeholder');
        stakeholderGR.addQuery('demand', demandGr.sys_id);
        stakeholderGR.query();
        if (!stakeholderGR.hasNext()) {
            stakeholderGR.initialize();
            stakeholderGR.demand = demandGr.sys_id;
            stakeholderGR.stakeholder = gs.getUserID(); // auto-assign submitter
            stakeholderGR.assessment = true;
            stakeholderGR.insert();
        }

        // 2️⃣ Create assessments
        this.createAssessments(demandGr);

        // 3️⃣ Link latest assessment group to demand (Live Feed)
        var ai = new GlideRecord('asmt_assessment_instance');
        ai.addQuery('source_id', demandGr.sys_id);
        ai.orderByDesc('sys_created_on');
        ai.setLimit(1);
        ai.query();
        if (ai.next()) {
            this.setAssessmentDetails(ai.assessment_group, demandGr.sys_id, demandGr.sys_class_name);
        }

        gs.info('Live Feed group linked for first submit demand: ' + demandGr.sys_id);
    },

   
    checkAndUpdateDemandIfAssessmentsComplete : function(instanceSysId) {
        var gr = new GlideRecord('asmt_assessment_instance_question');
        gr.addQuery('instance', instanceSysId);
        gr.query();
        if (gr.next()) {
            var questionGR = new GlideAggregate('asmt_assessment_instance_question');
            questionGR.addQuery('source_id', gr.getValue('source_id'));
            questionGR.groupBy('instance');
            questionGR.query();
            while (questionGR.next()) {
                if (!(questionGR.instance.state == 'complete' || questionGR.instance.state == 'canceled'))
                    return false;
            }
            // All assessments completed
            var demandGR = new GlideRecord('dmn_demand');
            if (demandGR.get(gr.getValue('source_id')) && demandGR.state == 3) {
                demandGR.state = -4;
                demandGR.update();
//          if (demandGR.get(gr.getValue('source_id')) &&
//    (demandGR.state == 3 || demandGR.state == 2)) {

//     demandGR.state = -4; // Qualified
//     demandGR.update();
}

            return true;
        }
        return false;
    },
   
    populateScores : function(demandGr) {

        var groupGr = new GlideRecord("asmt_category_result");
        groupGr.addQuery("metric_type", "0556fa9a8f12110040f82ab2f0f923f8");
        groupGr.addQuery("source_id", demandGr.sys_id);
        groupGr.orderByDesc("sys_created_on");
        groupGr.query();
        var assessmentGroup;
        if (groupGr.next())
            assessmentGroup = groupGr.getValue('assessment_group');

        if (!gs.nil(assessmentGroup)){
            var gr = new GlideAggregate("asmt_category_result");
            gr.addQuery("metric_type", "0556fa9a8f12110040f82ab2f0f923f8");
            gr.addQuery("source_id", demandGr.sys_id);
            gr.addQuery('assessment_group',assessmentGroup);
            gr.addAggregate('AVG', 'rating');
            gr.groupBy('category');
            gr.query();

            var demand = new GlideRecord("dmn_demand");
            demand.get(demandGr.sys_id);

            while(gr.next()){

                var scoreValue = gr.getAggregate('AVG', 'rating');
                var asmtCategory = gr.getValue('category');

                if(asmtCategory == "07f328108f32110040f82ab2f0f9236c")
                    demand.setValue("score_size", scoreValue);
                else if(asmtCategory == "99b63e9a8f12110040f82ab2f0f923b3")
                    demand.setValue("score_value", scoreValue);
                else if(asmtCategory == "84a3c7da8f12110040f82ab2f0f92368")
                    demand.setValue("score_risk", scoreValue);
                else if(asmtCategory == "1a3107da8f12110040f82ab2f0f9233b")
                    demand.setValue("score_strategic_allignment", scoreValue);
                else if(asmtCategory == "cb8e72da8f12110040f82ab2f0f9230c")
                    demand.setValue("score_cost", scoreValue);

            }
            demand.update();
        }

    },
   
    updateAssessmentScore : function(demandGr) {
   
        var gr = new GlideRecord('asmt_category_result');
        gr.addQuery('source_id', demandGr.sys_id);
        gr.addQuery('metric_type', '0556fa9a8f12110040f82ab2f0f923f8');
        gr.orderByDesc('sys_created_on');
        gr.query();
        if (gr.getRowCount() >= 1) {
            gr.next();
            var assessmentDetails = (new SNC.AssessmentCreation()).createAssessments('0556fa9a8f12110040f82ab2f0f923f8', demandGr.sys_id, gs.getUser().getRecord().getValue("sys_id"), false, gr.getValue('assessment_group'), false, "", "", true);
            if ( demandGr.state != 1 && demandGr.state != 2  && demandGr.state != 3)// Till screening scores will not be populated.
            //  if ( demandGr.state != 1 && demandGr.state != 2 )// Till screening scores will not be populated.
                this.populateScores(demandGr);

        }

    },
   
    setAssessmentDetails: function(assessmentGroupId, demandId, demandClass) {
        if (assessmentGroupId) {
            var asmtInstances = new GlideRecord('asmt_assessment_instance');
            asmtInstances.addQuery('assessment_group', assessmentGroupId);
            asmtInstances.query();      
            asmtInstances.setValue('trigger_id', demandId);
            asmtInstances.setValue('trigger_table', demandClass);
            asmtInstances.setValue('task_id', demandId);
            asmtInstances.setWorkflow(false);
            asmtInstances.updateMultiple();
        } else {
            gs.warn('Unable to fetch assessment group details, demand assessment trigger details are not set');
        }
    },
   
    createAssessments : function(demandGr){
   
        var gr = new GlideRecord('dmn_m2m_demand_stakeholder');
        var encodedQuery = "demand=" + demandGr.sys_id + "^assessment=yes";
        gr.addEncodedQuery(encodedQuery, true);
        gr.query();
        var userIds = "";
        while (gr.next()) {
            if (!JSUtil.nil(userIds))
                userIds += ",";
            userIds += gr.stakeholder.user.sys_id;
        }

        if (!JSUtil.nil(userIds)) {
            //create assessments for the list of users
            this.createAssessmentInternal('0556fa9a8f12110040f82ab2f0f923f8', demandGr.sys_id, userIds, false, "",false,"","",!demandGr.assessment_required, demandGr.sys_class_name);
            // this.createAssessmentInternal('0556fa9a8f12110040f82ab2f0f923f8', demandGr.sys_id, userIds, false, "",false,"","",false, demandGr.sys_class_name);
        }
        else
            this.createAssessmentInternal('0556fa9a8f12110040f82ab2f0f923f8', demandGr.sys_id, gs.getUser().getRecord().getValue("sys_id"), false, "", false, "", "", !demandGr.assessment_required, demandGr.sys_class_name);
            // this.createAssessmentInternal('0556fa9a8f12110040f82ab2f0f923f8', demandGr.sys_id, gs.getUser().getRecord().getValue("sys_id"), false, "", false, "", "", false, demandGr.sys_class_name);
       
    },
   
    createAssessmentInternal: function(type, sourceId, userIds, urlEntry, isxistingGroup, isPreview, conditionId, recordId, skipAssessments, triggerTable) {
    //  var assessmentDetails = (new SNC.AssessmentCreation()).createAssessments(type, sourceId, userIds, urlEntry, isxistingGroup, isPreview, conditionId, recordId, skipAssessments);
    //  this.setAssessmentDetails(assessmentDetails.split(',')[2], sourceId, triggerTable);
        var assessmentDetails = (new SNC.AssessmentCreation())
    .createAssessments(type, sourceId, userIds, urlEntry, isxistingGroup, isPreview, conditionId, recordId, skipAssessments);

if (!gs.nil(assessmentDetails)) {
    var parts = assessmentDetails.split(',');
    if (parts.length >= 3) {
        var assessmentGroupId = parts[2];

       
            // 🔥 THIS IS WHAT YOU WERE MISSING
            this.setAssessmentDetails(
                assessmentGroupId,
                sourceId,
                triggerTable || 'dmn_demand'
            );
    }
}

       
    },
   
    QualifyDemandIfAssessmentNotRequired : function(demandGr) {
   
        if (!demandGr.assessment_required){
            demandGr.state = -4;
            demandGr.update();
        }
    },
   
    assignedToRefQual: function(taskGr) {
        var users = [];
        var demandRole = SNC.PPMConfig.getDemandRole('user', taskGr.getValue('sys_class_name'));
        var projectRole = SNC.PPMConfig.getProjectRole('user', taskGr.getValue('sys_class_name'));
        var demandRoleId = this.roleId(demandRole);
        var projectRoleId = this.roleId(projectRole);
        var userHasRole = new GlideRecord('sys_user_has_role');
        var subQuery = userHasRole.addQuery('role', demandRoleId);
        if (projectRoleId != null) {
            subQuery.addOrCondition('role', projectRoleId);
        }
        userHasRole.query();
        while (userHasRole.next()) {
            users.push(userHasRole.getValue('user'));
        }
        var returnValue = "sys_idIN" + users.join(",");
        return returnValue;
    },
   
    roleId: function(roleName) {
        var gr = new GlideRecord("sys_user_role");
        gr.get("name", roleName);
        return gr.getValue("sys_id");
    },
   
    type : 'DemandUtil'
};

DemandUtil.getDemandRole = function(suffix, tableName /* Stripped table name */){
    var role = 'it_demand_'+suffix;
    if(GlidePluginManager.isActive('com.snc.project_management_v3')){
        role = SNC.PPMConfig.getDemandRole(suffix,tableName);
    }
    return role;
};

DemandUtil.getDemandWorkbenchId = function(sysClassName, sysId) {
    var workbenchId;
    var gr = new GlideRecord("bubble_chart_workbench");

    // Default to the base table when both parameters are not sent
    if (gs.nil(sysClassName) && gs.nil(sysId))
        sysClassName = 'dmn_demand';

    if (!gs.nil(sysClassName)) {
        /* Get TeamSpace specific demand table name */
        var demandTable = SNC.PPMConfig.getDemandTable(sysClassName);
        gr.addQuery("table", demandTable);
    }
    if (!gs.nil(sysId))
        gr.addQuery('sys_id', sysId);
    else
        gr.addQuery("isdefault", true);
    gr.query();
    if (gr.next()) {
        var dmnGr = new GlideRecord(gr.getValue("table"));
        if(dmnGr.canRead())
            workbenchId = gr.getValue("sys_id");
    }
    return workbenchId;
};


DemandUtil.isValidWorkbenchParams = function(sysClassName, workbenchId) {
    return JSUtil.notNil(DemandUtil.getDemandWorkbenchId(sysClassName, workbenchId));
};

DemandUtil.isValidStakeHolder = function(demand) {
   
var gr = new GlideRecord('dmn_m2m_demand_stakeholder');
gr.addQuery('stakeholder.user', gs.getUserID());
gr.addQuery('demand',demand);
gr.setLimit(1);
gr.query();

var answer = gr.getRowCount() > 0;
   
return answer;
};

DemandUtil.getDemandURL = function(sysId) {
      var url = new GlideURL('dmn_demand.do');
      url.set('sys_id', sysId);
   
         return gs.getProperty('glide.servlet.uri') + url;
};

DemandUtil.checkAndCloseDemand = function(sysId){
    if (JSUtil.nil(sysId))
        return;
    var gr = new GlideRecord('dmn_demand');
    gr.get(sysId);
    if (gr.isValidRecord() && gr.getValue('close_demand') == 'on_closing_project'  && gr.getValue('state') != '9'){
        gr.setValue('state', '9');
        gr.update();
    }  
};

DemandUtil.checkAndCloseDemandForProjects = function(topTaskSysId){
    var gr = new GlideRecord('dmn_demand');
    gr.addEncodedQuery("state!=9^close_demand=on_closing_project^project.top_task="+topTaskSysId);
    gr.query();
    while (gr.next()){
        gr.setValue('state', '9');
        gr.update();
    }
};

DemandUtil.checkAndCloseDemandForProjectIds = function(sysIds){
    var gr = new GlideRecord('dmn_demand');
    gr.addEncodedQuery("state!=9^close_demand=on_closing_project^projectIN"+sysIds);
    gr.query();
    while (gr.next()){
        gr.setValue('state', '9');
        gr.update();
    }
};

DemandUtil.getCloseDemandOption = function(current){
    if (JSUtil.nil(current.type))
        return 'on_creating_project';
};

DemandUtil.getProjectCalculationDefault = function(current){
    if (current.type == 'project')
        return 'automatic';

};


Business rule - Create Ondemand assessment 

shrutijibhekar_0-1771269372443.png

 



However, it is not working as expected. Could you please help me review this or suggest what might be missing?

Thank you!

1 REPLY 1

Tanushree Maiti
Giga Sage
 

Hi  shrutijibhekar

Did you try this.
. Configuring trigger condition of Demand Assessment type.
 
 
 
Please mark this response as Helpful & Accept it as solution if it assisted you with your question.
Regards
Tanushree Maiti
ServiceNow Technical Architect
Linkedin: