Insert Approval BR

Utkarsha
Tera Contributor

Hey everyone,

I have an After Insert/Update Business Rule that is designed to:

  1. Insert approvals in the Review stage for users listed in the Reviewers field (which is a List type).
  2. When the Reviewers field value changes, insert new approvals accordingly.
  3. When the State changes from "Awaiting Approval" to "Review", insert new approvals and mark previously inserted approvals for the current reviewer as "Not Required."

However, the script is not working as expected. I’ve made some changes, but I’m still unable to get it to function correctly.

I’d really appreciate any insights into where I might be going wrong. 
Thank you in advance for your help!

 

After Insert/Update Business rule-
Condition- state is review OR reviewer changes OR state changesto review
(function executeRule(current, previous /*null when async*/ ) {
    var currentReviewer = current.reviewers.split(',');
    var previousReviewer = [];
    if (previous && previous.reviewers != '') {
        previousReviewer = previous.reviewers.split(',');
    }

    var changesToReview = previous.state != 'review' && current.state == 'review';
    var awaitingToReview = previous.state == 'awaiting_approval' && current.state == 'review';

    for (var i = 0; i < currentReviewer.length; i++) {
        if (previousReviewer.length == 0 || previousReviewer.indexOf(currentReviewer[i]) == -1 || changesToReview || awaitingToReview) {
            var approvalrecord = new GlideRecord('sysapproval_approver');
            approvalrecord.addQuery('approver', currentReviewer[i]);
            approvalrecord.addQuery('document_id', current.sys_id);
            approvalrecord.addEncodedQuery('stateNOT INrejected,not_required,approved,cancelled');
            approvalrecord.addQuery('u_reviewers', true);
            approvalrecord.query();

            if (!approvalrecord.next()) { // Add approval if not found
                approvalrecord.initialize();
                approvalrecord.approver = currentReviewer[i] + '';
                approvalrecord.source_table = 'sn_compliance_policy';
                approvalrecord.document_id = current.sys_id;
                approvalrecord.state = 'requested';
                approvalrecord.u_reviewers = true;
                approvalrecord.insert();
            } else {
                approvalrecord.state = 'requested';
                approvalrecord.update();
            }
        }
    }

    for (var j = 0; j < previousReviewer.length; j++) {
        if (currentReviewer.indexOf(previousReviewer[j]) == -1) {
            var approvalrecord2 = new GlideRecord('sysapproval_approver');
            approvalrecord2.addQuery('approver', previousReviewer[j]);
            approvalrecord2.addQuery('document_id', current.sys_id);
            approvalrecord2.addQuery('u_reviewers', true);
            approvalrecord2.addEncodedQuery('stateNOT INrejected,not_required');
            approvalrecord2.query();

            if (approvalrecord2.next()) {
                approvalrecord2.state = 'not_required';
                approvalrecord2.update();
            }
        }
    }

	//  Update approval records when state changes from "awaiting_approval" to "review"
    for (var k = 0; k < currentReviewer.length; k++) {
        if (awaitingToReview) {
            var approvalUpdate = new GlideRecord('sysapproval_approver');
            approvalUpdate.addQuery('approver', currentReviewer[k]);
            approvalUpdate.addQuery('document_id', current.sys_id);
            approvalUpdate.addQuery('u_reviewers', true);
            approvalUpdate.addEncodedQuery('stateNOT INrejected,not_required');
            approvalUpdate.query();

            if (approvalUpdate.next()) {
                approvalUpdate.state = 'not_required'; // Or any other appropriate state
                approvalUpdate.update();
            }
        }
    }

    
})(current, previous);

 

6 REPLIES 6

Hello @Tushar  ,

Still not working as expected ...same thing happening script is marking all approvals to 'not_required' stage

My bad @Utkarsha  I made some change now, can you please try -

 

(function executeRule(current, previous /*null when async*/) {
    gs.log('start approval BR ---', 'approval_rule');

    var currentReviewers = current.reviewers ? current.reviewers.split(',').map(r => r.trim()) : [];
    var previousReviewers = previous && previous.reviewers ? previous.reviewers.split(',').map(r => r.trim()) : [];

    var existingApprovals = {};
    var grApproval = new GlideRecord('sysapproval_approver');
    grApproval.addQuery('document_id', current.sys_id);
    grApproval.addQuery('u_reviewers', true);
    grApproval.addEncodedQuery('stateNOT INrejected,not_required,approved,cancelled');
    grApproval.query();

    while (grApproval.next()) {
        existingApprovals[grApproval.approver.toString()] = grApproval;
    }

    var stateChangedToReview = previous.state != 'review' && current.state == 'review';
    var stateChangedFromAwaitingToReview = previous.state == 'awaiting_approval' && current.state == 'review';

    // mark "not_required" for previous reviewers
    previousReviewers.forEach(prevReviewer => {
        if (!currentReviewers.includes(prevReviewer)) {
            var grRemoveApproval = new GlideRecord('sysapproval_approver');
            grRemoveApproval.addQuery('approver', prevReviewer);
            grRemoveApproval.addQuery('document_id', current.sys_id);
            grRemoveApproval.addQuery('u_reviewers', true);
            grRemoveApproval.addEncodedQuery('stateNOT INrejected,not_required');
            
            grRemoveApproval.query();
            while (grRemoveApproval.next()) {
                grRemoveApproval.state = 'not_required';
                grRemoveApproval.update();
                gs.log('marke approval as "not_required" for ' + prevReviewer, 'approval_rule');
            }
        }
    });

    // only missing approvals are created
    currentReviewers.forEach(reviewer => {
        var approvalRecord = existingApprovals[reviewer];
        
        if (!approvalRecord || stateChangedToReview || stateChangedFromAwaitingToReview) {
            approvalRecord = new GlideRecord('sysapproval_approver');
            approvalRecord.initialize();
            approvalRecord.approver = reviewer;
            approvalRecord.source_table = 'sn_compliance_policy';
            approvalRecord.document_id = current.sys_id;
            approvalRecord.state = 'requested';
            approvalRecord.u_reviewers = true;
            var result = approvalRecord.insert();
            
            gs.log('create or updated approval for ' + reviewer + ': ' + result, 'approval_rule');
        }
    });

    gs.log('--- end br ---', 'approval_rule');
})(current, previous);

Thanks.