Copy UI Action

kunal16
Tera Expert

Hi,

I am trying to create a copy UI action on Project form. With the use of the UI action, the user should be able to create a copy of a project and its task.

UI Action:

Name: Project Support Services

Table: Project (pm_project)

Action name: copy_project

Onclick: createCopy()

Condition: gs.getUser().isMemberOf( ­"Project Support Services") && current.isValidRecord()

Script

function createCopy()

{

  var a1 = g_form.getUniqueValue();

  gr = new GlideRecord('pm_project');

  gr.get(a1);

  var sysid = gr.sys_id;

  var ga = new GlideAjax('cloneproject');

  ga.addParam('sysparm_name','Copyproject');

  ga.addParam('sysparm_projtask',sysid);

  ga.getXMLWait();

  var prj_sysid = ga.getAnswer();

  window.location= "/pm_project.do?sys_id="+prj_sysid;

}

Script Include:

var cloneproject = Class.create();

cloneproject.prototype = Object.extendsObject(AbstractAjaxProcessor, {

  Copyproject: function() {

  var proj_sysid = this.getParameter('sysparm_projtask');

  var gr = new GlideRecord('pm_project');

  gr.get(proj_sysid);

  var task1 = new GlideRecord('pm_project');

  //task1.initialize();

  task1.u_financially_closed = 'false';

  task1.description = "Copy from: " + gr.number + ' - ' + current.description;

  task1.phase = 'planning';

  //gr.work_start = current.work_start;

  task1.state = '-5';

  task1.work_cost = '';

  task1.percent_complete = '0';

  task1.effort = '0';

  task1.insert();

  if (gr.hasAttachments()) {

  GlideSysAttachment.copy('pm_project', gr.sys_id, 'pm_project', task1.sys_id);

  // task1.update();

  }

  gs.addInfoMessage('New Project ' +"'"+ task1.number +"'"+ ' has been created');

  // Copy Project task

  var ptask = new GlideRecord('pm_project_task');

  ptask.addQuery('parent',gr.sys_id);

  ptask.query();

  while(ptask.next())

  {

  var fields = ptask.getFields();

  var nptask = new GlideRecord('pm_project_task');

  //Copy all fields except

  nptask.initialize();

  for (var j = 0; j < fields.size(); j++)

  {

  var ele = fields.get(j);

  if (ele.hasValue() && ele.getName() != 'number' && ele.getName() != 'opened_by' && ele.getName() != 'assigned_to' && ele.getName() != 'assignment_group' && ele.getName() != 'opened_at' && ele.getName() != 'sys_updated_by' && ele.getName() != 'time_constraint' && ele.getName() != 'start_date' && ele.getName() != 'end_date' && ele.getName() != 'u_task_capitalization_tag' && ele.getName() != 'comments')

  {

  var itm = ele.getName();

  nptask[itm] = ele;

  }

  }

  nptask.setValue('parent',gr.sys_id);

  nptask.setValue('state',-5);

  nptask.setValue('duration', 0);

  nptask.setValue('effort', 0);

  nptask.setValue('percent_complete', 0);

  nptask.setValue('work_cost', 0);

  nptask.setValue('work_effort', 0);

  nptask.insert();

  gs.addInfoMessage('New Project task ' +"'"+ nptask.number +"'"+ ' has been created');

  }

  },

  type: 'createCopy'

});

With the script include and UI action, I am unable to implement the functionality?

Any leads will be appreciated.

5 REPLIES 5

sergiu_panaite
ServiceNow Employee
ServiceNow Employee

Have a look at one post about cloning change requests, as it might help you:



Re: Re: Can you clone/copy a change request?



Regards,
Sergiu


Hi Sergie,


Thanks for the link. But I am still unable to implement this copy functionality. Below is my code:



copyProject();


function copyProject()


{


  //Get the current sys_id value for querying


  var prjID = current.sys_id.toString();


  //Initialize new change for insertion


  var newProj = current;


  //newProj.number = getNextObjNumberPadded(); //Gethttps://kwiktripdev.service-now.com/images/icons/full_screen.gifx next change number


  newProj.u_financially_closed = 'false';


  newProj.description = "Copy from: " + gr.number + ' - ' + current.description;


  newProj.phase = 'planning';


  newProj.state = '-5';


  newProj.work_cost = '';


  newProj.percent_complete = '0';


  newProj.effort = '0';


  current.insert();




  //Copy attachments for this change


  if (typeof GlideSysAttachment != 'undefined')


      GlideSysAttachment.copy('pm_project', prjID, 'pm_project', newProj.sys_id);


  else


      Packages.com.glide.ui.SysAttachment.copy('pm_project', prjID, 'pm_project', newProj.sys_id);




  //Copy associated tasks and CIs


  copyTask(prjID);


  copyCI(prjID);


  gs.addInfoMessage('Project ticket ' + newProj.number + ' created.');


  action.setRedirectURL(newProj);


}




  function copyTask(prjID)


  {


  //Find the current change tasks and copy them


  var tasks = new GlideRecord('pm_project_task');


  tasks.addQuery('parent', prjID);


  tasks.query();


  while(tasks.next()){


  var taskID = tasks.sys_id.toString();


  var newTask = tasks;


  if (typeof GlideNumberManager != 'undefined')


      newTask.number = GlideNumberManager.getNumber('pm_project_task');


  else


      newTask.number = Packages.com.glide.db.NumberManager.getNumber('pm_project_task'); //Get next change task number


  newTask.parent = current.sys_id;


  //newTask.setValue('parent',gr.sys_id);


  newTask.setValue('state',-5);


  newTask.setValue('duration', 0);


  newTask.setValue('effort', 0);


  newTask.setValue('percent_complete', 0);


  newTask.setValue('work_cost', 0);


  newTask.setValue('work_effort', 0);


  tasks.insert();




  //Copy attachments for this task


  if (typeof GlideSysAttachment != 'undefined')


      GlideSysAttachment.copy('pm_project_task', taskID, 'pm_project_task', tasks.sys_id);


  else


      Packages.com.glide.ui.SysAttachment.copy('pm_project_task', taskID, 'pm_project_task', tasks.sys_id);


  }


}


Hi Kunal Kumar,



Please try with the below Changes,



Line 16: var newProj_sys_id = newProj.insert(); //Insert new project record


Line 38: tasks.addQuery('parent', newProj_sys_id ); //Assign new project task to new project record


Line 42: var newTask = new GlideRecord('pm_project_task'); //Initialize new task gliderecord


Line 47: newTask.parent = newProj_sys_id;   //Assign parent of new project task record as new project record


Line 55: var newTask_sys_id = newTask.insert();   //Insert new project task record


Line 60: GlideSysAttachment.copy('pm_project_task', taskID, 'pm_project_task', newTask_sys_id);


Line 62: Packages.com.glide.ui.SysAttachment.copy('pm_project_task', taskID, 'pm_project_task', newTask_sys_id);



The records have not been inserted with correct variable in your code snippet.



I changed that and should probably let you create records successfully.


Hi Maheshwar,


Thanks for the update on script but I am still unable to create new records.