diff options
Diffstat (limited to 'app/Model')
-rw-r--r-- | app/Model/Base.php | 1 | ||||
-rw-r--r-- | app/Model/Board.php | 10 | ||||
-rw-r--r-- | app/Model/Task.php | 256 | ||||
-rw-r--r-- | app/Model/TaskFinder.php | 83 |
4 files changed, 180 insertions, 170 deletions
diff --git a/app/Model/Base.php b/app/Model/Base.php index ea4afc07..72d91c3c 100644 --- a/app/Model/Base.php +++ b/app/Model/Base.php @@ -32,6 +32,7 @@ use PicoDb\Database; * @property \Model\SubtaskHistory $subtaskHistory * @property \Model\Task $task * @property \Model\TaskExport $taskExport + * @property \Model\TaskFinder $taskFinder * @property \Model\TaskHistory $taskHistory * @property \Model\TaskValidator $taskValidator * @property \Model\TimeTracking $timeTracking diff --git a/app/Model/Board.php b/app/Model/Board.php index 728d9d29..de47e6b9 100644 --- a/app/Model/Board.php +++ b/app/Model/Board.php @@ -234,14 +234,8 @@ class Board extends Base */ public function get($project_id, array $filters = array()) { - $this->db->startTransaction(); - $columns = $this->getColumns($project_id); - - $filters[] = array('column' => 'project_id', 'operator' => 'eq', 'value' => $project_id); - $filters[] = array('column' => 'is_active', 'operator' => 'eq', 'value' => Task::STATUS_OPEN); - - $tasks = $this->task->find($filters); + $tasks = $this->taskFinder->getOpenTasks($project_id); foreach ($columns as &$column) { @@ -254,8 +248,6 @@ class Board extends Base } } - $this->db->closeTransaction(); - return $columns; } diff --git a/app/Model/Task.php b/app/Model/Task.php index fe7bbdcd..4536ba5c 100644 --- a/app/Model/Task.php +++ b/app/Model/Task.php @@ -146,7 +146,7 @@ class Task extends Base } /** - * Count all tasks for a given project and status + * Get all tasks for a given project and status * * @access public * @param integer $project_id Project id @@ -199,166 +199,6 @@ class Task extends Base } /** - * Get tasks that match defined filters - * - * @access public - * @param array $filters Filters: [ ['column' => '...', 'operator' => '...', 'value' => '...'], ... ] - * @param array $sorting Sorting: [ 'column' => 'date_creation', 'direction' => 'asc'] - * @return array - */ - public function find(array $filters, array $sorting = array()) - { - $table = $this->db - ->table(self::TABLE) - ->columns( - '(SELECT count(*) FROM comments WHERE task_id=tasks.id) AS nb_comments', - '(SELECT count(*) FROM task_has_files WHERE task_id=tasks.id) AS nb_files', - '(SELECT count(*) FROM task_has_subtasks WHERE task_id=tasks.id) AS nb_subtasks', - '(SELECT count(*) FROM task_has_subtasks WHERE task_id=tasks.id AND status=2) AS nb_completed_subtasks', - 'tasks.id', - 'tasks.reference', - 'tasks.title', - 'tasks.description', - 'tasks.date_creation', - 'tasks.date_modification', - 'tasks.date_completed', - 'tasks.date_due', - 'tasks.color_id', - 'tasks.project_id', - 'tasks.column_id', - 'tasks.owner_id', - 'tasks.creator_id', - 'tasks.position', - 'tasks.is_active', - 'tasks.score', - 'tasks.category_id', - 'users.username AS assignee_username', - 'users.name AS assignee_name' - ) - ->join(User::TABLE, 'id', 'owner_id'); - - foreach ($filters as $key => $filter) { - - if ($key === 'or') { - - $table->beginOr(); - - foreach ($filter as $subfilter) { - $table->$subfilter['operator']($subfilter['column'], $subfilter['value']); - } - - $table->closeOr(); - } - else if (isset($filter['operator']) && isset($filter['column']) && isset($filter['value'])) { - $table->$filter['operator']($filter['column'], $filter['value']); - } - } - - if (empty($sorting)) { - $table->orderBy('tasks.position', 'ASC'); - } - else { - $table->orderBy($sorting['column'], $sorting['direction']); - } - - return $table->findAll(); - } - - /** - * Generic method to duplicate a task - * - * @access public - * @param array $task Task data - * @param array $override Task properties to override - * @return integer|boolean - */ - public function copy(array $task, array $override = array()) - { - // 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->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(self::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(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; - } - - /** - * Duplicate a task to the same project - * - * @access public - * @param array $task Task data - * @return integer|boolean - */ - public function duplicateSameProject($task) - { - return $this->copy($task); - } - - /** - * Duplicate a task to another project (always copy to the first column) - * - * @access public - * @param integer $project_id Destination project id - * @param array $task Task data - * @return integer|boolean - */ - public function duplicateToAnotherProject($project_id, array $task) - { - return $this->copy($task, array( - 'project_id' => $project_id, - 'column_id' => $this->board->getFirstColumn($project_id), - )); - } - - /** * Prepare data before task creation or modification * * @access public @@ -715,6 +555,100 @@ class Task extends Base } /** + * Generic method to duplicate a task + * + * @access public + * @param array $task Task data + * @param array $override Task properties to override + * @return integer|boolean + */ + public function copy(array $task, array $override = array()) + { + // 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->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; + } + + /** + * Duplicate a task to the same project + * + * @access public + * @param array $task Task data + * @return integer|boolean + */ + public function duplicateToSameProject($task) + { + return $this->copy($task); + } + + /** + * Duplicate a task to another project (always copy to the first column) + * + * @access public + * @param integer $project_id Destination project id + * @param array $task Task data + * @return integer|boolean + */ + public function duplicateToAnotherProject($project_id, array $task) + { + return $this->copy($task, array( + 'project_id' => $project_id, + 'column_id' => $this->board->getFirstColumn($project_id), + )); + } + + /** * Get a the task id from a text * * Example: "Fix bug #1234" will return 1234 diff --git a/app/Model/TaskFinder.php b/app/Model/TaskFinder.php new file mode 100644 index 00000000..43537e2d --- /dev/null +++ b/app/Model/TaskFinder.php @@ -0,0 +1,83 @@ +<?php + +namespace Model; + +/** + * Task Finder model + * + * @package model + * @author Frederic Guillot + */ +class TaskFinder extends Base +{ + private function prepareRequest() + { + return $this->db + ->table(Task::TABLE) + ->columns( + '(SELECT count(*) FROM comments WHERE task_id=tasks.id) AS nb_comments', + '(SELECT count(*) FROM task_has_files WHERE task_id=tasks.id) AS nb_files', + '(SELECT count(*) FROM task_has_subtasks WHERE task_id=tasks.id) AS nb_subtasks', + '(SELECT count(*) FROM task_has_subtasks WHERE task_id=tasks.id AND status=2) AS nb_completed_subtasks', + 'tasks.id', + 'tasks.reference', + 'tasks.title', + 'tasks.description', + 'tasks.date_creation', + 'tasks.date_modification', + 'tasks.date_completed', + 'tasks.date_due', + 'tasks.color_id', + 'tasks.project_id', + 'tasks.column_id', + 'tasks.owner_id', + 'tasks.creator_id', + 'tasks.position', + 'tasks.is_active', + 'tasks.score', + 'tasks.category_id', + 'users.username AS assignee_username', + 'users.name AS assignee_name' + ) + ->join(User::TABLE, 'id', 'owner_id'); + } + + public function search($project_id, $search, $offset = 0, $limit = 25, $column = 'tasks.id', $direction = 'DESC') + { + return $this->prepareRequest() + ->eq('project_id', $project_id) + ->like('title', '%'.$search.'%') + ->offset($offset) + ->limit($limit) + ->orderBy($column, $direction) + ->findAll(); + } + + public function countSearch($project_id, $search) + { + return $this->db->table(Task::TABLE) + ->eq('project_id', $project_id) + ->like('title', '%'.$search.'%') + ->count(); + } + + public function getClosedTasks($project_id, $offset = 0, $limit = 25, $column = 'tasks.date_completed', $direction = 'DESC') + { + return $this->prepareRequest() + ->eq('project_id', $project_id) + ->eq('is_active', Task::STATUS_CLOSED) + ->offset($offset) + ->limit($limit) + ->orderBy($column, $direction) + ->findAll(); + } + + public function getOpenTasks($project_id, $column = 'tasks.position', $direction = 'ASC') + { + return $this->prepareRequest() + ->eq('project_id', $project_id) + ->eq('is_active', Task::STATUS_OPEN) + ->orderBy($column, $direction) + ->findAll(); + } +} |