/** * 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; }
static function getArrayInfo($raw_data, $full = false){ if(config_option("wysiwyg_tasks")){ if($raw_data['type_content'] == "text"){ $desc = nl2br(htmlspecialchars($raw_data['text'])); }else{ $desc = purify_html(nl2br($raw_data['text'])); } }else{ if($raw_data['type_content'] == "text"){ $desc = htmlspecialchars($raw_data['text']); }else{ $desc = html_to_text(html_entity_decode(nl2br($raw_data['text']), null, "UTF-8")); } } $member_ids = ObjectMembers::instance()->getCachedObjectMembers($raw_data['id']); $tmp_task = new ProjectTask(); $tmp_task->setObjectId($raw_data['id']); $tmp_task->setId($raw_data['id']); $tmp_task->setAssignedToContactId($raw_data['assigned_to_contact_id']); $result = array( 'id' => $raw_data['id'], 't' => $raw_data['name'], 'desc' => $desc, 'members' => $member_ids, 'c' => strtotime($raw_data['created_on']), 'cid' => (int)$raw_data['created_by_id'], 'otype' => $raw_data['object_subtype'], 'pc' => (int)$raw_data['percent_completed'], 'memPath' => str_replace('"',"'", str_replace("'", "\'", json_encode($tmp_task->getMembersToDisplayPath($member_ids)))) ); if ($full) { $result['description'] = $raw_data['text']; } $result['mas'] = (int)array_var($raw_data, 'multi_assignment'); if ($raw_data['completed_by_id'] > 0) { $result['s'] = 1; } if ($raw_data['parent_id'] > 0) { $result['pid'] = (int)$raw_data['parent_id']; } //if ($this->getPriority() != 200) $result['pr'] = (int)$raw_data['priority']; if ($raw_data['milestone_id'] > 0) { $result['mid'] = (int)$raw_data['milestone_id']; } if ($raw_data['assigned_to_contact_id'] > 0) { $result['atid'] = (int)$raw_data['assigned_to_contact_id']; } $result['atName'] = $tmp_task->getAssignedToName(); if ($raw_data['completed_by_id'] > 0) { $result['cbid'] = (int)$raw_data['completed_by_id']; $result['con'] = strtotime($raw_data['completed_on']);; } if ($raw_data['due_date'] != EMPTY_DATETIME) { $result['dd'] = strtotime($raw_data['due_date']) + logged_user()->getTimezone() * 3600; $result['udt'] = $raw_data['use_due_time'] ? 1 : 0; } if ($raw_data['start_date'] != EMPTY_DATETIME) { $result['sd'] = strtotime($raw_data['start_date']) + logged_user()->getTimezone() * 3600; $result['ust'] = $raw_data['use_start_time'] ? 1 : 0; } $time_estimate = $raw_data['time_estimate']; $result['te'] = $raw_data['time_estimate']; if ($time_estimate > 0) $result['et'] = DateTimeValue::FormatTimeDiff(new DateTimeValue(0), new DateTimeValue($time_estimate * 60), 'hm', 60) ; $result['tz'] = logged_user()->getTimezone() * 3600; $ot = $tmp_task->getOpenTimeslots(); if ($ot){ $users = array(); $time = array(); $paused = array(); foreach ($ot as $t){ if (!$t instanceof Timeslot) continue; $time[] = $t->getSeconds(); $users[] = $t->getContactId(); $paused[] = $t->isPaused()?1:0; if ($t->isPaused() && $t->getContactId() == logged_user()->getId()) { $result['wpt'] = $t->getPausedOn()->getTimestamp(); } } $result['wt'] = $time; $result['wid'] = $users; $result['wp'] = $paused; } if ($raw_data['repeat_forever'] > 0 || $raw_data['repeat_num'] > 0 || $raw_data['repeat_end'] != EMPTY_DATETIME) { $result['rep'] = 1; } return $result; }
/** * 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; }
private function save_object($request) { $response = false; if (!empty($request['args'])) { $service = $request['srv']; switch ($service) { case "task": if ($request['args']['id']) { $object = ProjectTasks::instance()->findByid($request['args']['id']); } else { $object = new ProjectTask(); } if ($object instanceof ProjectTask) { if (!empty($request['args']['title'])) { $object->setObjectName($request['args']['title']); } if (!empty($request['args']['description'])) { $object->setText($request['args']['description']); } if (!empty($request['args']['due_date'])) { if ($request['args']['due_date'] != '' && $request['args']['due_date'] != date_format_tip('dd/mm/yyyy')) { $date_format = 'dd/mm/yyyy'; $object->setDueDate(DateTimeValueLib::dateFromFormatAndString($date_format, $value)); } } if (!empty($request['args']['completed'])) { $object->setPercentCompleted($request['args']['completed']); } if (!empty($request['args']['assign_to'])) { $object->setAssignedToContactId($request['args']['assign_to']); } if (!empty($request['args']['priority'])) { $object->setPriority($request['args']['priority']); } } break; case 'note': if ($request['args']['id']) { $object = ProjectMessages::instance()->findByid($request['args']['id']); } else { $object = new ProjectMessage(); } if ($object instanceof ProjectMessage) { if (!empty($request['args']['title'])) { $object->setObjectName($request['args']['title']); } if (!empty($request['args']['title'])) { $object->setText($request['args']['text']); } } break; } // END SWITCH if ($object) { try { $context = array(); $members = array(); if (!empty($request['args']['members'])) { $members = $request['args']['members']; $context = get_context_from_array($members); } //Check permissions: if ($request['args']['id'] && $object->canEdit(logged_user()) || !$request['args']['id'] && $object->canAdd(logged_user(), $context)) { DB::beginWork(); $object->save(); $object_controller = new ObjectController(); if (!$request['args']['id']) { $object_controller->add_to_members($object, $members); } DB::commit(); $response = true; } } catch (Exception $e) { DB::rollback(); return false; } } } return $this->response('json', $response); }
/** * 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; }
static function getArrayInfo($raw_data, $full = false) { $desc = ""; if ($full) { if (config_option("wysiwyg_tasks")) { if ($raw_data['type_content'] == "text") { $desc = nl2br(htmlspecialchars($raw_data['text'])); } else { $desc = purify_html(nl2br($raw_data['text'])); } } else { if ($raw_data['type_content'] == "text") { $desc = htmlspecialchars($raw_data['text']); } else { $desc = html_to_text(html_entity_decode(nl2br($raw_data['text']), null, "UTF-8")); } } } $member_ids = ObjectMembers::instance()->getCachedObjectMembers($raw_data['id']); $tmp_task = new ProjectTask(); $tmp_task->setObjectId($raw_data['id']); $tmp_task->setId($raw_data['id']); $tmp_task->setAssignedToContactId($raw_data['assigned_to_contact_id']); $result = array('id' => (int) $raw_data['id'], 'name' => $raw_data['name'], 'description' => $desc, 'members' => $member_ids, 'createdOn' => strtotime($raw_data['created_on']), 'createdById' => (int) $raw_data['created_by_id'], 'otype' => $raw_data['object_subtype'], 'percentCompleted' => (int) $raw_data['percent_completed'], 'memPath' => str_replace('"', "'", escape_character(json_encode($tmp_task->getMembersIdsToDisplayPath())))); if (isset($raw_data['isread'])) { $result['isread'] = $raw_data['isread']; } $result['multiAssignment'] = (int) array_var($raw_data, 'multi_assignment'); if ($raw_data['completed_by_id'] > 0) { $result['status'] = 1; } if ($raw_data['parent_id'] > 0) { $result['parentId'] = (int) $raw_data['parent_id']; } $result['subtasksIds'] = $tmp_task->getSubTasksIds(); //if ($this->getPriority() != 200) $result['priority'] = (int) $raw_data['priority']; if ($raw_data['milestone_id'] > 0) { $result['milestoneId'] = (int) $raw_data['milestone_id']; } if ($raw_data['assigned_by_id'] > 0) { $result['assignedById'] = (int) $raw_data['assigned_by_id']; } if ($raw_data['assigned_to_contact_id'] > 0) { $result['assignedToContactId'] = (int) $raw_data['assigned_to_contact_id']; } $result['atName'] = $tmp_task->getAssignedToName(); if ($raw_data['completed_by_id'] > 0) { $result['completedById'] = (int) $raw_data['completed_by_id']; $result['completedOn'] = strtotime($raw_data['completed_on']); } if ($raw_data['due_date'] != EMPTY_DATETIME) { $result['useDueTime'] = $raw_data['use_due_time'] ? 1 : 0; if ($result['useDueTime']) { $result['dueDate'] = strtotime($raw_data['due_date']) + logged_user()->getTimezone() * 3600; } else { $result['dueDate'] = strtotime($raw_data['due_date']); } } if ($raw_data['start_date'] != EMPTY_DATETIME) { $result['useStartTime'] = $raw_data['use_start_time'] ? 1 : 0; if ($result['useStartTime']) { $result['startDate'] = strtotime($raw_data['start_date']) + logged_user()->getTimezone() * 3600; } else { $result['startDate'] = strtotime($raw_data['start_date']); } } $time_estimate = $raw_data['time_estimate']; $result['timeEstimate'] = $raw_data['time_estimate']; if ($time_estimate > 0) { $result['timeEstimateString'] = str_replace(',', ',<br>', DateTimeValue::FormatTimeDiff(new DateTimeValue(0), new DateTimeValue($time_estimate * 60), 'hm', 60)); } $result['timeZone'] = logged_user()->getTimezone() * 3600; $ot = $tmp_task->getOpenTimeslots(); if ($ot) { $users = array(); $time = array(); $paused = array(); foreach ($ot as $t) { if (!$t instanceof Timeslot) { continue; } $time[] = $t->getSeconds(); $users[] = $t->getContactId(); $paused[] = $t->isPaused() ? 1 : 0; if ($t->isPaused() && $t->getContactId() == logged_user()->getId()) { $result['pauseTime'] = $t->getPausedOn()->getTimestamp(); } } $result['workingOnTimes'] = $time; $result['workingOnIds'] = $users; $result['workingOnPauses'] = $paused; } $total_minutes = $tmp_task->getTotalMinutes(); if ($total_minutes > 0) { $result['worked_time'] = $total_minutes; $result['worked_time_string'] = str_replace(',', ',<br>', DateTimeValue::FormatTimeDiff(new DateTimeValue(0), new DateTimeValue($total_minutes * 60), 'hm', 60)); } else { $result['worked_time'] = 0; } $pending_time = $time_estimate - $total_minutes; if ($pending_time > 0) { $result['pending_time'] = $pending_time; $result['pending_time_string'] = str_replace(',', ',<br>', DateTimeValue::FormatTimeDiff(new DateTimeValue(0), new DateTimeValue($pending_time * 60), 'hm', 60)); } else { $result['pending_time'] = 0; } if ($raw_data['repeat_forever'] > 0 || $raw_data['repeat_num'] > 0 || $raw_data['repeat_end'] != EMPTY_DATETIME && $raw_data['repeat_end'] != '') { $result['repetitive'] = 1; } $tmp_members = array(); if (count($member_ids) > 0) { $tmp_members = Members::findAll(array("conditions" => "id IN (" . implode(',', $member_ids) . ")")); } $result['can_add_timeslots'] = can_add_timeslots(logged_user(), $tmp_members); //tasks dependencies if (config_option('use tasks dependencies')) { //get all dependant tasks ids, not completed yet $pending_tasks_ids = ProjectTaskDependencies::getDependenciesForTaskOnlyPendingIds($tmp_task->getId()); //get the total of previous tasks $result['dependants'] = $pending_tasks_ids; $result['previous_tasks_total'] = ProjectTaskDependencies::countPendingPreviousTasks($tmp_task->getId()); } return $result; }
/** * Add subtask to this list * * @param string $text * @param Contact $assigned_to_user * @param Company $assigned_to_company * @return ProjectTask * @throws DAOValidationError */ function addSubTask($text, $assigned_to = null) { $task = new ProjectTask(); $task->setText($text); if($assigned_to instanceof Contact) $task->setAssignedToContactId($assigned_to->getId()); $this->attachTask($task); // this one will save task return $task; } // addTask