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!

0 REPLIES 0