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

Ankur Bawiskar
Tera Patron
Tera Patron

@Utkarsha  

try this and add logs and debug

(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';

    // Insert new approvals
    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();
            }
        }
    }

    // Mark previous approvals as "not_required"
    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);

If my response helped please mark it correct and close the thread so that it benefits future readers.

Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader

Hello @Ankur Bawiskar ,
I’ve made changes in my script as suggested by you but can’t get it to function correctly. The script is marking all newly inserted approvals for the current reviewers as "Not Required," which means no approvals remain in the "Review" stage.

@Utkarsha  

what debugging did you perform?

Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader

Tushar
Kilo Sage
Kilo Sage

Hi @Utkarsha  - this should work -

 

 

(function executeRule(current, previous /*null when async*/ ) {
    // Log initial state
    gs.log('start approval business rule', 'approval_rule');
    gs.log('Current state: ' + current.state, 'approval_rule');
    gs.log('Previous state: ' + (previous ? previous.state : 'null'), 'approval_rule');
    
    // Get reviewers arrays with logging
    var currentReviewer = current.reviewers.split(',');
    var previousReviewer = [];
    if (previous && previous.reviewers != '') {
        previousReviewer = previous.reviewers.split(',');
    }
    
    gs.log('current reviewer: ' + currentReviewer.join('|'), 'approval_rule');
    gs.log('previous reviewers: ' + previousReviewer.join('|'), 'approval_rule');
    
    // State change flags with logging
    var changesToReview = previous.state != 'review' && current.state == 'review';
    var awaitingToReview = previous.state == 'awaiting_approval' && current.state == 'review';
    
    gs.log('state to review: ' + changesToReview, 'approval_rule');
    gs.log('awaiting to review: ' + awaitingToReview, 'approval_rule');
    
    // Insert new approvals with logging
    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();
            
            gs.log('processing reviewer: ' + currentReviewer[i], 'approval_rule');
            
            if (!approvalrecord.next()) {
                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;
                
                var result = approvalrecord.insert();
                gs.log('create new approval for ' + currentReviewer[i] + ': ' + result, 'approval_rule');
            } else {
                approvalrecord.state = 'requested';
                var result = approvalrecord.update();
                gs.log('Updated existing approval for ' + currentReviewer[i] + ': ' + result, 'approval_rule');
            }
        }
    }
    
    // Mark previous approvals as "not_required" with logging
    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';
                var result = approvalrecord2.update();
                gs.log('mark approval as not_required for ' + previousReviewer[j] + ': ' + result, 'approval_rule');
            }
        }
    }
    
    // Update approval records when state changes from "awaiting_approval" to "review"
    if (awaitingToReview) {
        for (var k = 0; k < currentReviewer.length; k++) {
            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';
                var result = approvalUpdate.update();
                gs.log('updated approval state for ' + currentReviewer[k] + ': ' + result, 'approval_rule');
            }
        }
    }
    
    gs.log('complete approval business rule execution', 'approval_rule');
})(current, previous);

 

Thanks.