Copy RITM comments and state to SC Task , copy comments on SC Task to RITM

rajasekharteja
Tera Guru

Hi All,

I got a requirement,

 

For SCTASK: Whenever the requested for responds to the requests, the state has to automatically move from Pending to Work In Progress(This is Done).

For Sequential SCTASK: If the state is pending, then the RITM should be in Pending and the Pending Reason should copy from SCTASK to RITM(This is Done)
For Parallel SCTASK: If any one of the SCTASK is in Pending , then the RITM should be in Pending and the Pending Reason should copy from SCTASK to RITM(This is Done)

All the comments should be copied from RITM to SCTASK and vice-versa. ( When comments are added on RITM by Requested for or Ticket Worker comments are getting duplicated on RITM and activities also shown duplicates i.e., State changes activity, but comments from RITM to SCTASK copying only once which is expected behavior.)

When 'Requested for' comments on RITM on front end the state is changing and comments are going to SCTASK but if 'Requested for' only adds additional comments comment's are not copying to SCTASK

 

All SCTASK comments should be copied to RITM only when SCTask's are in active states.

 

I have written below business rules on RITM and sc_task please help me with your inputs to achive the required functionality.

 

Business rule on RITM:

rajasekharteja_0-1753817064493.png

 

 

Script Section :

(function executeRule(current, previous /*null when async*/ ) {

    // Add your code here
    var userID = gs.getUserID();
    if (userID == current.requested_for.toString() ||
        userID == current.opened_by.toString()) {
        current.state = '2'; // WIP
        var sctask = new GlideRecord('sc_task');
        sctask.addQuery('request_item', current.sys_id);
        sctask.query();
        var count = sctask.getRowCount();
        if (count == '1') {
            while (sctask.next())
            {
                sctask.state = current.state;
                sctask.comments = current.comments;
                sctask.u_pending_reason = current.u_pending_reason;
                sctask.update();
            }
        }
    }


})(current, previous);
 
 
Business rule on SC_Task:
rajasekharteja_1-1753817252415.png

 

 

Script on sc_task table:

(function executeRule(current, previous /*null when async*/ ) {
    // Add your code here

    var ritmRecord = current.request_item.getRefRecord();

    ritmRecord.state = current.state;

    if (current.state == '-5') {
        ritmRecord.u_pending_reason = current.u_pending_reason;
    }
    if(previous.state== '-5' && current.state != '-5'){
        ritmRecord.u_pending_reason = '';
    }
    ritmRecord.comments = current.comments;
    ritmRecord.update();
    ritmRecord.setWorkflow(false);


})(current, previous);
 
 
 
There is one more Business rule on sc_task to map task status to ritm state if atleast one task is in pending then we are setting the ritm state to pending this is parallel sc tasks.
rajasekharteja_0-1753817447671.png

 

Script:

(function executeRule(current, previous /*null when async*/ ) {

        // Add your code here

        var ritm = current.request_item;

        var taskpending = checkTaskStatus('state=-5^request_item=' + ritm);
        var taskclosed = checkTaskStatus('stateIN3,4,7^request_item=' + ritm);

        if (taskpending == true) {
            updateritmstate('-5');
        } else if (taskclosed == true) {
            updateritmstate('3');
        }


        function checkTaskStatus(query) {
            var task = new GlideRecord('sc_task');
            task.addEncodedQuery(query);
            task.query();

            if (task.hasNext()) {
                return true;
            }
        }

        function updateritmstate(state) {
            var grritm = new GlideRecord('sc_req_item');

            if (grritm.get(ritm)) {
                    grritm.state = state;
                    grritm.update();
                    grritm.setWorkflow(false);
                    gs.addInfoMessage('ritm update');
                }

            }

        })(current, previous);
Thanks,
Rajasekhar

 

1 ACCEPTED SOLUTION

@rajasekharteja 

it's setting with hard-coded state value then it should work fine,

use this to fetch the comments

Did you print state value in logs?

sctask.comments = current.comments.getJournalEntry(1);

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

View solution in original post

15 REPLIES 15

@Ankur Bawiskar 

Yes the State choices are same, it's not updating comments and pending reason also not only State.

 

Also when I gave logs as below it's not holding current.comments value

 

 var sctask = new GlideRecord('sc_task');
        sctask.addQuery('request_item', current.sys_id);
        sctask.query();
        var count = sctask.getRowCount();
        if (count == '1') {
            gs.addInfoMessage('cur task if ' + sctask.number);
            while (sctask.next()) {
                gs.addInfoMessage('cur task while ' + sctask.number);
                gs.addInfoMessage('cur state ' +  current.state);
                gs.addInfoMessage('cur comments ' + current.comments);
                gs.addInfoMessage('cur pending reason ' + current.u_pending_reason);
                sctask.state = current.state;
                sctask.comments = current.comments;
                sctask.u_pending_reason = current.u_pending_reason;
                sctask.update();
            }

@rajasekharteja 

any before update business rule is blocking?

Try this and see if it works

var sctask = new GlideRecord('sc_task');
        sctask.addQuery('request_item', current.sys_id);
        sctask.query();
        var count = sctask.getRowCount();
        if (count == '1') {
            gs.addInfoMessage('cur task if ' + sctask.number);
            while (sctask.next()) {
                gs.addInfoMessage('cur task while ' + sctask.number);
                gs.addInfoMessage('cur state ' +  current.state);
                gs.addInfoMessage('cur comments ' + current.comments);
                gs.addInfoMessage('cur pending reason ' + current.u_pending_reason);
                sctask.state = '2';
                sctask.comments = 'Hello';
                sctask.u_pending_reason = current.u_pending_reason;
                sctask.setWorkflow(false);
                sctask.update();
            }

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

@Ankur Bawiskar  

I used the code provided above its setting the state and comments on sctask but when we give dynamically as current.  it's not setting the values, also comments are not coming in the logs when we give current.comments

@rajasekharteja 

it's setting with hard-coded state value then it should work fine,

use this to fetch the comments

Did you print state value in logs?

sctask.comments = current.comments.getJournalEntry(1);

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

@Ankur Bawiskar 

yes, you're right it's setting the values on sctask and comments value is coming when i use 

 

sctask.comments = current.comments.getJournalEntry(1);

 

But one issue is instead of getting the WIP state from RITM once Requester updates the comments it's getting pending state on to sctask i.e., it's setting with the previous state value not current state value.

 

I have updated the code as below,

 

(function executeRule(current, previous /*null when async*/ ) {

    // Add your code here
    var userID = gs.getUserID();
    if (userID == current.requested_for.toString() ||
        userID == current.opened_by.toString()) {
        var latestcomment = current.comments.getJournalEntry(1);
        if (!latestcomment) {
            return;
        }
        var ritm = new GlideRecord('sc_req_item');
        if (ritm.get(current.sys_id)) {
            ritm.state = '2'; // WIP
            ritm.update();
        }

        var sctask = new GlideRecord('sc_task');
        sctask.addQuery('request_item', current.sys_id);
        sctask.query();
        var count = sctask.getRowCount();
        if (count == '1') {
            while (sctask.next()) {
                sctask.state = current.state;
                sctask.comments = current.comments.getJournalEntry(1);
                sctask.u_pending_reason = current.u_pending_reason;
                sctask.setWorkflow(false);
                sctask.update();
            }
        }
    }


})(current, previous);