/**
	 * Returns an unsaved copy of the task. Copies everything except open/closed state,
	 * anything that needs the task to have an id (like tags, properties, subtask),
	 * administrative info like who created the task and when, etc.
	 *
	 * @param ProjectTask $task
	 * @return ProjectTask
	 */
	function createTaskCopy(ProjectTask $task) {
		$new = new ProjectTask ();
		$new->setMilestoneId ( $task->getMilestoneId () );
		$new->setParentId ( $task->getParentId () );
		$new->setObjectName($task->getObjectName()) ;
		$new->setAssignedToContactId ( $task->getAssignedToContactId () );
		$new->setPriority ( $task->getPriority () );
		$new->setTimeEstimate ( $task->getTimeEstimate () );
		$new->setText ( $task->getText () );
		$new->setOrder ( ProjectTasks::maxOrder ( $new->getParentId (), $new->getMilestoneId () ) );
		$new->setStartDate ( $task->getStartDate () );
		$new->setDueDate ( $task->getDueDate () );
		return $new;
	}
 /**
  * Copy this template task to a project task
  *
  * @access public
  * @param void
  * @return null
  */
 function copyToProjectTask($instantiation_id = 0)
 {
     //$new_st_date='',$new_due_date='',$copy_status = false,$copy_repeat_options = true,$parent_subtask=0
     //param
     $parent_subtask = 0;
     $new_st_date = '';
     $new_due_date = '';
     $copy_status = false;
     $copy_repeat_options = true;
     $new_task = new ProjectTask();
     /*if($parent_subtask != 0){
     			$new_task->setParentId($parent_subtask);
     		}else{
     			$new_task->setParentId($this->getParentId());
     		}*/
     $new_task->setObjectName($this->getObjectName());
     $new_task->setText($this->getText());
     $new_task->setAssignedToContactId($this->getAssignedToContactId());
     $new_task->setAssignedOn($this->getAssignedOn());
     $new_task->setAssignedById($this->getAssignedById());
     $new_task->setTimeEstimate($this->getTimeEstimate());
     $new_task->setStartedOn($this->getStartedOn());
     $new_task->setStartedById($this->getStartedById());
     $new_task->setPriority($this->getPriority());
     $new_task->setState($this->getState());
     $new_task->setOrder($this->getOrder());
     $new_task->setMilestoneId($this->getMilestoneId());
     $new_task->setFromTemplateId($this->getTemplateId());
     $new_task->setUseStartTime($this->getUseStartTime());
     $new_task->setUseDueTime($this->getUseDueTime());
     $new_task->setTypeContent($this->getTypeContent());
     $new_task->setFromTemplateObjectId($this->getId());
     $new_task->setParentId($this->getParentId());
     $new_task->setOriginalTaskId(0);
     $new_task->setInstantiationId($instantiation_id);
     if ($this->getDueDate() instanceof DateTimeValue) {
         $new_task->setDueDate(new DateTimeValue($this->getDueDate()->getTimestamp()));
     }
     if ($this->getStartDate() instanceof DateTimeValue) {
         $new_task->setStartDate(new DateTimeValue($this->getStartDate()->getTimestamp()));
     }
     if ($copy_status) {
         $new_task->setCompletedById($this->getCompletedById());
         $new_task->setCompletedOn($this->getCompletedOn());
     }
     if ($copy_repeat_options) {
         $new_task->setRepeatEnd($this->getRepeatEnd());
         $new_task->setRepeatForever($this->getRepeatForever());
         $new_task->setRepeatNum($this->getRepeatNum());
         $new_task->setRepeatBy($this->getRepeatBy());
         $new_task->setRepeatD($this->getRepeatD());
         $new_task->setRepeatM($this->getRepeatM());
         $new_task->setRepeatY($this->getRepeatY());
     }
     if ($new_st_date != "") {
         if ($new_task->getStartDate() instanceof DateTimeValue) {
             $new_task->setStartDate($new_st_date);
         }
     }
     if ($new_due_date != "") {
         if ($new_task->getDueDate() instanceof DateTimeValue) {
             $new_task->setDueDate($new_due_date);
         }
     }
     $new_task->setDontMakeCalculations(true);
     $new_task->save();
     // Copy members, linked_objects, custom_properties, subscribers, reminders and comments
     copy_additional_object_data($this, $new_task);
     // Ensure that assigned user is subscribed
     if ($new_task->getAssignedTo() instanceof Contact) {
         $new_task->subscribeUser($new_task->getAssignedTo());
     }
     return $new_task;
 }
 /**
  * Save subtasks added in task form, at 'subtasks' tab
  * @param $parent_task: ProjectTask - The parent task to set in the subtasks to save
  * @param $subtasks_data: array - An array with all the subtasks data
  * @param $member_ids: array with the member ids to classify the subtasks
  * @return array with the application logs to generate
  */
 private function saveSubtasks($parent_task, $subtasks_data, $member_ids)
 {
     $to_log = array('add' => array(), 'edit' => array(), 'trash' => array(), 'assigned' => array());
     $subs = $parent_task->getSubscriberIds();
     $subs_array = array();
     foreach ($subs as $sid) {
         $subs_array['user_' . $sid] = 1;
     }
     if ($parent_task instanceof ProjectTask && is_array($subtasks_data)) {
         foreach ($subtasks_data as $stdata) {
             $st = null;
             if ($stdata['id'] > 0) {
                 $st = ProjectTasks::instance()->findById($stdata['id']);
                 // subtask has been deleted, delete object and continue with next subtask
                 if ($stdata['deleted'] == 1 && $st instanceof ProjectTask) {
                     /*$st->trash(false);
                     		$st->save();*/
                     DB::execute("UPDATE " . TABLE_PREFIX . "objects SET trashed_by_id=" . logged_user()->getId() . ", trashed_on=NOW() WHERE id=" . $st->getId());
                     $to_log['trash'][] = $st;
                     continue;
                 }
             }
             $new_subtask = false;
             // new subtask
             if (!$st instanceof ProjectTask) {
                 $st = new ProjectTask();
                 $new_subtask = true;
             }
             if (trim($stdata['name'] == '')) {
                 continue;
             }
             $changed = false;
             if ($st->getObjectName() != $stdata['name'] || $st->getAssignedToContactId() != $stdata['assigned_to']) {
                 $changed = true;
             }
             if ($new_subtask || $changed) {
                 if ($stdata['assigned_to'] > 0 && $stdata['assigned_to'] != $st->getAssignedToContactId()) {
                     $to_log['assigned'][] = $st;
                 }
                 $st->setParentId($parent_task->getId());
                 $st->setObjectName($stdata['name']);
                 $st->setAssignedToContactId($stdata['assigned_to']);
                 $st->setPriority(array_var($stdata, 'priority', ProjectTasks::PRIORITY_NORMAL));
                 $st->setTypeContent(config_option("wysiwyg_tasks") ? 'html' : 'text');
                 $st->save();
                 $object_controller = new ObjectController();
                 $object_controller->add_to_members($st, $member_ids);
                 $st_subs_array = $subs_array;
                 if ($stdata['assigned_to'] > 0 && !in_array($stdata['assigned_to'], $subs)) {
                     $st_subs_array['user_' . $stdata['assigned_to']] = 1;
                 }
                 $object_controller->add_subscribers($st, $st_subs_array);
                 if ($new_subtask) {
                     $to_log['add'][] = $st;
                 } else {
                     $to_log['edit'][] = $st;
                 }
             }
         }
     }
     return $to_log;
 }
	/**
	 * Attach subtask to thistask
	 *
	 * @param ProjectTask $task
	 * @return null
	 */
	function attachTask(ProjectTask $task) {
		if($task->getParentId() == $this->getId()) return;

		$task->setParentId($this->getId());
		$task->save();

		if($this->isCompleted()) $this->open();
	} // attachTask