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

Laveena-Agarwal
Kilo Sage

Hi @rajasekharteja 

It appears that your scripts might be conflicting with the out-of-the-box (OOB) scripts. I recommend reviewing the existing Business Rules on the following tables: sc_req_item, sc_request, sc_task, and task.

To pinpoint the conflicting Business Rule, use the "Actions" tab to add an info message. During testing, this message will surface at the top of the screen, clearly indicating which rule is executing.

Hi @Laveena-Agarwal ,

 

When we update the RITM the logs which we have given in the SCTASK business rules are showing

Ankur Bawiskar
Tera Patron
Tera Patron

@rajasekharteja 

so what debugging did you do?

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

Hi @Ankur Bawiskar / @Laveena-Agarwal ,

As mentioned above I have done debug by providing string text logs on sc_task table it's showing the messages (using addinfomessage i tested).

I have checked OOB business rules on sc_req_item and sc_task also, but I don't see any BR which is causing the issue .

Thanks,