diff options
Diffstat (limited to 'app/Export/TaskExport.php')
-rw-r--r-- | app/Export/TaskExport.php | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/app/Export/TaskExport.php b/app/Export/TaskExport.php new file mode 100644 index 00000000..b98582aa --- /dev/null +++ b/app/Export/TaskExport.php @@ -0,0 +1,148 @@ +<?php + +namespace Kanboard\Export; + +use Kanboard\Core\Base; +use Kanboard\Core\DateParser; +use Kanboard\Model\Task; +use PDO; + +/** + * Task Export + * + * @package export + * @author Frederic Guillot + */ +class TaskExport extends Base +{ + /** + * Fetch tasks and return the prepared CSV + * + * @access public + * @param integer $project_id Project id + * @param mixed $from Start date (timestamp or user formatted date) + * @param mixed $to End date (timestamp or user formatted date) + * @return array + */ + public function export($project_id, $from, $to) + { + $tasks = $this->getTasks($project_id, $from, $to); + $swimlanes = $this->swimlane->getList($project_id); + $results = array($this->getColumns()); + + foreach ($tasks as &$task) { + $results[] = array_values($this->format($task, $swimlanes)); + } + + return $results; + } + + /** + * Get the list of tasks for a given project and date range + * + * @access public + * @param integer $project_id Project id + * @param mixed $from Start date (timestamp or user formatted date) + * @param mixed $to End date (timestamp or user formatted date) + * @return array + */ + public function getTasks($project_id, $from, $to) + { + $sql = ' + SELECT + tasks.id, + projects.name AS project_name, + tasks.is_active, + project_has_categories.name AS category_name, + tasks.swimlane_id, + columns.title AS column_title, + tasks.position, + tasks.color_id, + tasks.date_due, + creators.username AS creator_username, + users.username AS assignee_username, + users.name AS assignee_name, + tasks.score, + tasks.title, + tasks.date_creation, + tasks.date_modification, + tasks.date_completed, + tasks.date_started, + tasks.time_estimated, + tasks.time_spent + FROM tasks + LEFT JOIN users ON users.id = tasks.owner_id + LEFT JOIN users AS creators ON creators.id = tasks.creator_id + LEFT JOIN project_has_categories ON project_has_categories.id = tasks.category_id + LEFT JOIN columns ON columns.id = tasks.column_id + LEFT JOIN projects ON projects.id = tasks.project_id + WHERE tasks.date_creation >= ? AND tasks.date_creation <= ? AND tasks.project_id = ? + ORDER BY tasks.id ASC + '; + + if (! is_numeric($from)) { + $from = $this->dateParser->removeTimeFromTimestamp($this->dateParser->getTimestamp($from)); + } + + if (! is_numeric($to)) { + $to = $this->dateParser->removeTimeFromTimestamp(strtotime('+1 day', $this->dateParser->getTimestamp($to))); + } + + $rq = $this->db->execute($sql, array($from, $to, $project_id)); + return $rq->fetchAll(PDO::FETCH_ASSOC); + } + + /** + * Format the output of a task array + * + * @access public + * @param array $task Task properties + * @param array $swimlanes List of swimlanes + * @return array + */ + public function format(array &$task, array &$swimlanes) + { + $colors = $this->color->getList(); + + $task['is_active'] = $task['is_active'] == Task::STATUS_OPEN ? e('Open') : e('Closed'); + $task['color_id'] = $colors[$task['color_id']]; + $task['score'] = $task['score'] ?: 0; + $task['swimlane_id'] = isset($swimlanes[$task['swimlane_id']]) ? $swimlanes[$task['swimlane_id']] : '?'; + + $task = $this->dateParser->format($task, array('date_due', 'date_modification', 'date_creation', 'date_started', 'date_completed'), DateParser::DATE_FORMAT); + + return $task; + } + + /** + * Get column titles + * + * @access public + * @return string[] + */ + public function getColumns() + { + return array( + e('Task Id'), + e('Project'), + e('Status'), + e('Category'), + e('Swimlane'), + e('Column'), + e('Position'), + e('Color'), + e('Due date'), + e('Creator'), + e('Assignee Username'), + e('Assignee Name'), + e('Complexity'), + e('Title'), + e('Creation date'), + e('Modification date'), + e('Completion date'), + e('Start date'), + e('Time estimated'), + e('Time spent'), + ); + } +} |