How to clone RITM with all variables

sam1212
Mega Expert

Hi All,

I was trying to clone a RITM with all its variable what ever is entered . Like a clone button which creates a new RITM with all the variables. I am stuck with the copy of variables.

I heard their is OOB   clone available in some discussions but did not pointed exactly what it   do and how to use it.

Any help is appreciated .

1 ACCEPTED SOLUTION

sam1212
Mega Expert

Hi Guys here is the code to copy the RITM with all variables to new RITM without workflow issues ,




var user=current.request.requested_for;


deleteCart();



var realCart = getCart();


var cartID = realCart.sys_id;


gs.log("cartID..",cartID);


addToCart(cartID, current.cat_item, 1);


addOptions(cartID);


doOrder();


deleteCart();



function addToCart(cartid, cat_item, quantity) {


      var gr = new GlideRecord('sc_cart_item');


      gr.initialize();


      gr.cart = cartid;


      gr.cat_item = cat_item;


      gr.quantity = quantity;


      gr.insert();


}


function addOptions(cartID) {


     


     


      var kids = new GlideRecord('sc_cart_item');


      kids.addQuery('cart', cartID);


      kids.query();


      if (kids.next()) {


              gs.log("kids",kids.sys_id);


              var sc_item_option_mtom = new GlideRecord('sc_item_option_mtom');


             


              sc_item_option_mtom.addQuery('request_item', current.sys_id);


             


              sc_item_option_mtom.query();


             


     


              while(sc_item_option_mtom.next()){


                     


                      var sc_item_option = new GlideRecord('sc_item_option');


                     


                      sc_item_option.addQuery('sys_id', sc_item_option_mtom.sc_item_option);


                     


                      sc_item_option.query();


                     


                     


                      if(sc_item_option.next()){


                             


                              var sc_item_option_insert = new GlideRecord('sc_item_option');


                             


                              sc_item_option_insert.initialize();


                             


                              sc_item_option_insert.item_option_new=sc_item_option.item_option_new;


                             


                              sc_item_option_insert.value=sc_item_option.value;


                              sc_item_option_insert.cart_item.setValue(kids.sys_id);


                              sc_item_option_insert.insert();


                     


                      }


                     


                     


              }


             


             


      }


}


function deleteCart() {


     


      var cart = getCart();


      var id = cart.sys_id;


      var kids = new GlideRecord('sc_cart_item');


      kids.addQuery('cart', cart.sys_id);


      kids.deleteMultiple();


}


function getCart() {


     


      var cart = new GlideRecord('sc_cart');


     


      var userid = user;


      cart.addQuery('user', userid);


      cart.query();


      if (cart.next()) {


              // we already have a cart all is well


      }


      else {


              cart.initialize();


              cart.user = userid;


              cart.insert();


      }


      return cart;


}


function doOrder() {


      var req = new GlideappRequestNew();


      var result=   req.copyCart(null,user);


     


}


View solution in original post

13 REPLIES 13

jaytee
Kilo Contributor

Michael Ritchie 's   suggestion works for me. Thank you.


Sam can you breakdown what this script is doing?



I'm trying to use it in a BR, and need to know if I can essentially force a variable value to be blank instead of what it is in the original RITM.   I don't know where in this script I could do that.


Sai Kumar Pampa
Kilo Contributor

Hi,

 

We can use Cart API to achieve the requirement. Initiate the cart api and set the variable values from the RITM to be copied.

If you have a variable pointing towards RITM table and bulk of RITMs are to be created with same variable values, you may use the below script in WF runscript :

 

var cart,id;
cart = new Cart();
var item = cart.addItem(current.variables.ritm.cat_item);
var catVariables = new GlideRecord('sc_item_option_mtom');
catVariables.addQuery('request_item',current.variables.ritm);
catVariables.query();
while(catVariables.next()){
var obj ={};
gs.info('ques '+catVariables.sc_item_option.item_option_new.name.toString() + ' val '+catVariables.sc_item_option.value.toString());
obj.ques = catVariables.sc_item_option.item_option_new.name.toString();
obj.value = catVariables.sc_item_option.value.toString();
var k = new JSON().encode(obj);
arr.push(k);
}
for(var j=0;j<arr.length;j++)
{
var d = new JSON().decode(arr[j]);
cart.setVariable(item,d.ques,d.value);
}

var rc = cart.placeOrder();

 

 Note : Put the script in a loop to create N number of RITMs as required.

variable Arr is not declared