diff options
Diffstat (limited to 'app/Model/Task.php')
-rw-r--r-- | app/Model/Task.php | 444 |
1 files changed, 60 insertions, 384 deletions
diff --git a/app/Model/Task.php b/app/Model/Task.php index a0090641..71d973a4 100644 --- a/app/Model/Task.php +++ b/app/Model/Task.php @@ -30,212 +30,52 @@ class Task extends Base * * @var string */ + const EVENT_MOVE_PROJECT = 'task.move.project'; const EVENT_MOVE_COLUMN = 'task.move.column'; const EVENT_MOVE_POSITION = 'task.move.position'; + const EVENT_MOVE_SWIMLANE = 'task.move.swimlane'; const EVENT_UPDATE = 'task.update'; const EVENT_CREATE = 'task.create'; const EVENT_CLOSE = 'task.close'; const EVENT_OPEN = 'task.open'; const EVENT_CREATE_UPDATE = 'task.create_update'; const EVENT_ASSIGNEE_CHANGE = 'task.assignee_change'; + const EVENT_OVERDUE = 'task.overdue'; /** - * Prepare data before task creation or modification + * Recurrence: status * - * @access public - * @param array $values Form values - */ - public function prepare(array &$values) - { - $this->dateParser->convert($values, array('date_due', 'date_started')); - $this->removeFields($values, array('another_task', 'id')); - $this->resetFields($values, array('date_due', 'date_started', 'score', 'category_id', 'time_estimated', 'time_spent')); - $this->convertIntegerFields($values, array('is_active')); - } - - /** - * Prepare data before task creation - * - * @access public - * @param array $values Form values - */ - public function prepareCreation(array &$values) - { - $this->prepare($values); - - if (empty($values['column_id'])) { - $values['column_id'] = $this->board->getFirstColumn($values['project_id']); - } - - if (empty($values['color_id'])) { - $colors = $this->color->getList(); - $values['color_id'] = key($colors); - } - - $values['date_creation'] = time(); - $values['date_modification'] = $values['date_creation']; - $values['position'] = $this->taskFinder->countByColumnId($values['project_id'], $values['column_id']) + 1; - } - - /** - * Prepare data before task modification - * - * @access public - * @param array $values Form values - */ - public function prepareModification(array &$values) - { - $this->prepare($values); - $values['date_modification'] = time(); - } - - /** - * Create a task - * - * @access public - * @param array $values Form values - * @return boolean|integer - */ - public function create(array $values) - { - $this->db->startTransaction(); - - $this->prepareCreation($values); - - if (! $this->db->table(self::TABLE)->save($values)) { - $this->db->cancelTransaction(); - return false; - } - - $task_id = $this->db->getConnection()->getLastId(); - - $this->db->closeTransaction(); - - // Trigger events - $this->event->trigger(self::EVENT_CREATE_UPDATE, array('task_id' => $task_id) + $values); - $this->event->trigger(self::EVENT_CREATE, array('task_id' => $task_id) + $values); - - return $task_id; - } - - /** - * Update a task - * - * @access public - * @param array $values Form values - * @param boolean $trigger_Events Trigger events - * @return boolean + * @var integer */ - public function update(array $values, $trigger_events = true) - { - // Fetch original task - $original_task = $this->taskFinder->getById($values['id']); - - if (! $original_task) { - return false; - } - - // Prepare data - $updated_task = $values; - $this->prepareModification($updated_task); - - $result = $this->db->table(self::TABLE)->eq('id', $values['id'])->update($updated_task); - - if ($result && $trigger_events) { - $this->triggerUpdateEvents($original_task, $updated_task); - } - - return true; - } + const RECURRING_STATUS_NONE = 0; + const RECURRING_STATUS_PENDING = 1; + const RECURRING_STATUS_PROCESSED = 2; /** - * Trigger events for task modification + * Recurrence: trigger * - * @access public - * @param array $original_task Original task data - * @param array $updated_task Updated task data + * @var integer */ - public function triggerUpdateEvents(array $original_task, array $updated_task) - { - $events = array(); - - if (isset($updated_task['owner_id']) && $original_task['owner_id'] != $updated_task['owner_id']) { - $events[] = self::EVENT_ASSIGNEE_CHANGE; - } - else if (isset($updated_task['column_id']) && $original_task['column_id'] != $updated_task['column_id']) { - $events[] = self::EVENT_MOVE_COLUMN; - } - else if (isset($updated_task['position']) && $original_task['position'] != $updated_task['position']) { - $events[] = self::EVENT_MOVE_POSITION; - } - else { - $events[] = self::EVENT_CREATE_UPDATE; - $events[] = self::EVENT_UPDATE; - } - - $event_data = array_merge($original_task, $updated_task); - $event_data['task_id'] = $original_task['id']; - - foreach ($events as $event) { - $this->event->trigger($event, $event_data); - } - } + const RECURRING_TRIGGER_FIRST_COLUMN = 0; + const RECURRING_TRIGGER_LAST_COLUMN = 1; + const RECURRING_TRIGGER_CLOSE = 2; /** - * Mark a task closed + * Recurrence: timeframe * - * @access public - * @param integer $task_id Task id - * @return boolean + * @var integer */ - public function close($task_id) - { - if (! $this->taskFinder->exists($task_id)) { - return false; - } - - $result = $this->db - ->table(self::TABLE) - ->eq('id', $task_id) - ->update(array( - 'is_active' => 0, - 'date_completed' => time() - )); - - if ($result) { - $this->event->trigger(self::EVENT_CLOSE, array('task_id' => $task_id) + $this->taskFinder->getById($task_id)); - } - - return $result; - } + const RECURRING_TIMEFRAME_DAYS = 0; + const RECURRING_TIMEFRAME_MONTHS = 1; + const RECURRING_TIMEFRAME_YEARS = 2; /** - * Mark a task open + * Recurrence: base date used to calculate new due date * - * @access public - * @param integer $task_id Task id - * @return boolean + * @var integer */ - public function open($task_id) - { - if (! $this->taskFinder->exists($task_id)) { - return false; - } - - $result = $this->db - ->table(self::TABLE) - ->eq('id', $task_id) - ->update(array( - 'is_active' => 1, - 'date_completed' => 0 - )); - - if ($result) { - $this->event->trigger(self::EVENT_OPEN, array('task_id' => $task_id) + $this->taskFinder->getById($task_id)); - } - - return $result; - } + const RECURRING_BASEDATE_DUEDATE = 0; + const RECURRING_BASEDATE_TRIGGERDATE = 1; /** * Remove a task @@ -256,242 +96,78 @@ class Task extends Base } /** - * Move a task to another column or to another position - * - * @access public - * @param integer $project_id Project id - * @param integer $task_id Task id - * @param integer $column_id Column id - * @param integer $position Position (must be >= 1) - * @return boolean - */ - public function movePosition($project_id, $task_id, $column_id, $position) - { - // The position can't be lower than 1 - if ($position < 1) { - return false; - } - - $board = $this->db->table(Board::TABLE)->eq('project_id', $project_id)->asc('position')->findAllByColumn('id'); - $columns = array(); - - // Prepare the columns - foreach ($board as $board_column_id) { - - $columns[$board_column_id] = $this->db->table(self::TABLE) - ->eq('is_active', 1) - ->eq('project_id', $project_id) - ->eq('column_id', $board_column_id) - ->neq('id', $task_id) - ->asc('position') - ->findAllByColumn('id'); - } - - // The column must exists - if (! isset($columns[$column_id])) { - return false; - } - - // We put our task to the new position - array_splice($columns[$column_id], $position - 1, 0, $task_id); // print_r($columns); - - // We save the new positions for all tasks - return $this->savePositions($task_id, $columns); - } - - /** - * Save task positions + * Get a the task id from a text * - * @access private - * @param integer $moved_task_id Id of the moved task - * @param array $columns Sorted tasks - * @return boolean - */ - private function savePositions($moved_task_id, array $columns) - { - $this->db->startTransaction(); - - foreach ($columns as $column_id => $column) { - - $position = 1; - - foreach ($column as $task_id) { - - if ($task_id == $moved_task_id) { - - // Events will be triggered only for that task - $result = $this->update(array( - 'id' => $task_id, - 'position' => $position, - 'column_id' => $column_id - )); - } - else { - $result = $this->db->table(self::TABLE)->eq('id', $task_id)->update(array( - 'position' => $position, - 'column_id' => $column_id - )); - } - - $position++; - - if (! $result) { - $this->db->cancelTransaction(); - return false; - } - } - } - - $this->db->closeTransaction(); - - return true; - } - - /** - * Move a task to another project + * Example: "Fix bug #1234" will return 1234 * * @access public - * @param integer $project_id Project id - * @param array $task Task data - * @return boolean + * @param string $message Text + * @return integer */ - public function moveToAnotherProject($project_id, array $task) + public function getTaskIdFromText($message) { - $values = array(); - - // Clear values (categories are different for each project) - $values['category_id'] = 0; - $values['owner_id'] = 0; - - // Check if the assigned user is allowed for the new project - if ($task['owner_id'] && $this->projectPermission->isUserAllowed($project_id, $task['owner_id'])) { - $values['owner_id'] = $task['owner_id']; - } - - // We use the first column of the new project - $values['column_id'] = $this->board->getFirstColumn($project_id); - $values['position'] = $this->taskFinder->countByColumnId($project_id, $values['column_id']) + 1; - $values['project_id'] = $project_id; - - // The task will be open (close event binding) - $values['is_active'] = 1; - - if ($this->db->table(self::TABLE)->eq('id', $task['id'])->update($values)) { - return $task['id']; + if (preg_match('!#(\d+)!i', $message, $matches) && isset($matches[1])) { + return $matches[1]; } - return false; + return 0; } /** - * Generic method to duplicate a task + * Return the list user selectable recurrence status * * @access public - * @param array $task Task data - * @param array $override Task properties to override - * @return integer|boolean + * @return array */ - public function copy(array $task, array $override = array()) + public function getRecurrenceStatusList() { - // Values to override - if (! empty($override)) { - $task = $override + $task; - } - - $this->db->startTransaction(); - - // Assign new values - $values = array(); - $values['title'] = $task['title']; - $values['description'] = $task['description']; - $values['date_creation'] = time(); - $values['date_modification'] = $values['date_creation']; - $values['date_due'] = $task['date_due']; - $values['color_id'] = $task['color_id']; - $values['project_id'] = $task['project_id']; - $values['column_id'] = $task['column_id']; - $values['owner_id'] = 0; - $values['creator_id'] = $task['creator_id']; - $values['position'] = $this->taskFinder->countByColumnId($values['project_id'], $values['column_id']) + 1; - $values['score'] = $task['score']; - $values['category_id'] = 0; - - // Check if the assigned user is allowed for the new project - if ($task['owner_id'] && $this->projectPermission->isUserAllowed($values['project_id'], $task['owner_id'])) { - $values['owner_id'] = $task['owner_id']; - } - - // Check if the category exists - if ($task['category_id'] && $this->category->exists($task['category_id'], $task['project_id'])) { - $values['category_id'] = $task['category_id']; - } - - // Save task - if (! $this->db->table(Task::TABLE)->save($values)) { - $this->db->cancelTransaction(); - return false; - } - - $task_id = $this->db->getConnection()->getLastId(); - - // Duplicate subtasks - if (! $this->subTask->duplicate($task['id'], $task_id)) { - $this->db->cancelTransaction(); - return false; - } - - $this->db->closeTransaction(); - - // Trigger events - $this->event->trigger(Task::EVENT_CREATE_UPDATE, array('task_id' => $task_id) + $values); - $this->event->trigger(Task::EVENT_CREATE, array('task_id' => $task_id) + $values); - - return $task_id; + return array ( + Task::RECURRING_STATUS_NONE => t('No'), + Task::RECURRING_STATUS_PENDING => t('Yes'), + ); } /** - * Duplicate a task to the same project + * Return the list recurrence triggers * * @access public - * @param array $task Task data - * @return integer|boolean + * @return array */ - public function duplicateToSameProject($task) + public function getRecurrenceTriggerList() { - return $this->copy($task); + return array ( + Task::RECURRING_TRIGGER_FIRST_COLUMN => t('When task is moved from first column'), + Task::RECURRING_TRIGGER_LAST_COLUMN => t('When task is moved to last column'), + Task::RECURRING_TRIGGER_CLOSE => t('When task is closed'), + ); } /** - * Duplicate a task to another project (always copy to the first column) + * Return the list options to calculate recurrence due date * * @access public - * @param integer $project_id Destination project id - * @param array $task Task data - * @return integer|boolean + * @return array */ - public function duplicateToAnotherProject($project_id, array $task) + public function getRecurrenceBasedateList() { - return $this->copy($task, array( - 'project_id' => $project_id, - 'column_id' => $this->board->getFirstColumn($project_id), - )); + return array ( + Task::RECURRING_BASEDATE_DUEDATE => t('Existing due date'), + Task::RECURRING_BASEDATE_TRIGGERDATE => t('Action date'), + ); } /** - * Get a the task id from a text - * - * Example: "Fix bug #1234" will return 1234 + * Return the list recurrence timeframes * * @access public - * @param string $message Text - * @return integer + * @return array */ - public function getTaskIdFromText($message) + public function getRecurrenceTimeframeList() { - if (preg_match('!#(\d+)!i', $message, $matches) && isset($matches[1])) { - return $matches[1]; - } - - return 0; + return array ( + Task::RECURRING_TIMEFRAME_DAYS => t('Day(s)'), + Task::RECURRING_TIMEFRAME_MONTHS => t('Month(s)'), + Task::RECURRING_TIMEFRAME_YEARS => t('Year(s)'), + ); } } |