18a638198SSzymon Olewniczak<?php 28a638198SSzymon Olewniczak 38a638198SSzymon Olewniczaknamespace dokuwiki\plugin\bez\mdl; 48a638198SSzymon Olewniczak 58a638198SSzymon Olewniczakclass TaskFactory extends Factory { 6ff14b107SSzymon Olewniczak 7ff14b107SSzymon Olewniczak public function get_table_view() { 8ff14b107SSzymon Olewniczak return 'task_view'; 98a638198SSzymon Olewniczak } 108a638198SSzymon Olewniczak 1153df74e7SSzymon Olewniczak public function get_years_scope() { 1253df74e7SSzymon Olewniczak $r = $this->model->sqlite->query('SELECT 1353df74e7SSzymon Olewniczak MIN(create_date), 1453df74e7SSzymon Olewniczak MIN(plan_date), 1553df74e7SSzymon Olewniczak DATE(), 1653df74e7SSzymon Olewniczak MAX(close_date), 1753df74e7SSzymon Olewniczak MAX(plan_date) 1853df74e7SSzymon Olewniczak FROM task'); 1953df74e7SSzymon Olewniczak $data = $this->model->sqlite->res_fetch_array($r); 2053df74e7SSzymon Olewniczak 2153df74e7SSzymon Olewniczak $min_date = min($data[0], $data[1], $data[2]); 2253df74e7SSzymon Olewniczak $max_date = max($data[2], $data[3], $data[4]); 2353df74e7SSzymon Olewniczak 2453df74e7SSzymon Olewniczak //get only year 2553df74e7SSzymon Olewniczak $first = (int) substr($min_date, 0, strpos($min_date, '-')); 2653df74e7SSzymon Olewniczak $last = (int) substr($max_date, 0, strpos($max_date, '-')); 2753df74e7SSzymon Olewniczak 2853df74e7SSzymon Olewniczak $years = array(); 2953df74e7SSzymon Olewniczak for ($year = $first; $year <= $last; $year++) { 3053df74e7SSzymon Olewniczak $years[] = (string) $year; 3153df74e7SSzymon Olewniczak } 3253df74e7SSzymon Olewniczak return $years; 3353df74e7SSzymon Olewniczak } 3453df74e7SSzymon Olewniczak 35e8827d73SSzymon Olewniczak public function get_from_thread(Thread $thread) { 36e8827d73SSzymon Olewniczak $tasks = $this->model->taskFactory->get_all(array('thread_id' => $thread->id), 37e8827d73SSzymon Olewniczak 'thread_comment_id', false, array('thread' => $thread)); 38e8827d73SSzymon Olewniczak $by_thread_comment = array('corrections' => array()); 39e8827d73SSzymon Olewniczak foreach ($tasks as $task) { 40e8827d73SSzymon Olewniczak if ($task->thread_comment_id == null) { 41e8827d73SSzymon Olewniczak $by_thread_comment['corrections'][$task->id] = $task; 42e8827d73SSzymon Olewniczak continue; 43e8827d73SSzymon Olewniczak } 44e8827d73SSzymon Olewniczak if (!isset($by_thread_comment[$task->thread_comment_id])) { 45e8827d73SSzymon Olewniczak $by_thread_comment[$task->thread_comment_id] = array(); 46e8827d73SSzymon Olewniczak } 47e8827d73SSzymon Olewniczak $by_thread_comment[$task->thread_comment_id][$task->id] = $task; 48e8827d73SSzymon Olewniczak } 49e8827d73SSzymon Olewniczak return $by_thread_comment; 50e8827d73SSzymon Olewniczak } 51e8827d73SSzymon Olewniczak 52076c315aSSzymon Olewniczak public function get_with_closing_comment($thread) { 53dad2347cSSzymon Olewniczak $sql = "SELECT task.id, task.type, task.content_html, task.state, task.cost, task.plan_date, task.close_date, 54*8f69a4e6SSzymon Olewniczak task_closing_comment.content_html AS task_comment_content_html, task.assignee 55*8f69a4e6SSzymon Olewniczak FROM task LEFT JOIN 56*8f69a4e6SSzymon Olewniczak (SELECT content_html, task_id FROM task_comment WHERE closing=1) 57*8f69a4e6SSzymon Olewniczak AS task_closing_comment ON task.id = task_closing_comment.task_id 58*8f69a4e6SSzymon Olewniczak WHERE task.thread_id = ? 592467512fSSzymon Olewniczak ORDER BY task.plan_date"; 60dad2347cSSzymon Olewniczak $stmt = $this->model->sqlite->query($sql, $thread->id); 61dad2347cSSzymon Olewniczak $stmt->setFetchMode(\PDO::FETCH_OBJ); 62e8827d73SSzymon Olewniczak 63076c315aSSzymon Olewniczak return $stmt; 64076c315aSSzymon Olewniczak } 65076c315aSSzymon Olewniczak 66076c315aSSzymon Olewniczak public function get_by_type($thread) { 678a222299SSzymon Olewniczak $stmt = $this->get_with_closing_comment($thread); 68076c315aSSzymon Olewniczak 69e8827d73SSzymon Olewniczak $by_type = array('correction' => array(), 'corrective' => array(), 'preventive' => array()); 70dad2347cSSzymon Olewniczak foreach ($stmt as $task) { 71e8827d73SSzymon Olewniczak $by_type[$task->type][$task->id] = $task; 72e8827d73SSzymon Olewniczak } 73e8827d73SSzymon Olewniczak 74e8827d73SSzymon Olewniczak return $by_type; 75e8827d73SSzymon Olewniczak } 76e8827d73SSzymon Olewniczak 77bc2653b0SSzymon Olewniczak public function users_involvement(\DatePeriod $period=NULL) { 78bc2653b0SSzymon Olewniczak if ($period) { 79bc2653b0SSzymon Olewniczak $from = $period->getStartDate()->format(\DateTime::ISO8601); 80bc2653b0SSzymon Olewniczak $to = $period->getEndDate()->format(\DateTime::ISO8601); 81bc2653b0SSzymon Olewniczak 82eb2e6be9SSzymon Olewniczak $sql = "SELECT task_participant.user_id, 83eb2e6be9SSzymon Olewniczak SUM(task_participant.original_poster) AS original_poster_sum, 84eb2e6be9SSzymon Olewniczak SUM(task_participant.assignee) AS assignee_sum, 85eb2e6be9SSzymon Olewniczak SUM(task_participant.commentator) AS commentator_sum 86eb2e6be9SSzymon Olewniczak FROM task_participant JOIN task ON task_participant.task_id = task.id 87eb2e6be9SSzymon Olewniczak WHERE task.create_date BETWEEN ? AND ? 88eb2e6be9SSzymon Olewniczak GROUP BY user_id 89eb2e6be9SSzymon Olewniczak ORDER BY user_id"; 90eb2e6be9SSzymon Olewniczak $r = $this->model->sqlite->query($sql, $from, $to); 91eb2e6be9SSzymon Olewniczak } else { 92eb2e6be9SSzymon Olewniczak $sql = "SELECT user_id, 93eb2e6be9SSzymon Olewniczak SUM(original_poster) AS original_poster_sum, 94eb2e6be9SSzymon Olewniczak SUM(assignee) AS assignee_sum, 95eb2e6be9SSzymon Olewniczak SUM(commentator) AS commentator_sum 96ff14b107SSzymon Olewniczak FROM task_participant 97ff14b107SSzymon Olewniczak GROUP BY user_id 98eb2e6be9SSzymon Olewniczak ORDER BY user_id"; 99ff14b107SSzymon Olewniczak $r = $this->model->sqlite->query($sql); 100eb2e6be9SSzymon Olewniczak } 101eb2e6be9SSzymon Olewniczak 102ff14b107SSzymon Olewniczak return $r; 103ff14b107SSzymon Olewniczak } 104ff14b107SSzymon Olewniczak 105bc2653b0SSzymon Olewniczak public function report(\DatePeriod $period=NULL) { 106bc2653b0SSzymon Olewniczak if ($period) { 107bc2653b0SSzymon Olewniczak $from = $period->getStartDate()->format(\DateTime::ISO8601); 108bc2653b0SSzymon Olewniczak $to = $period->getEndDate()->format(\DateTime::ISO8601); 109bc2653b0SSzymon Olewniczak 110bc2653b0SSzymon Olewniczak $sql = "SELECT task_program_name, 111bc2653b0SSzymon Olewniczak COUNT(CASE WHEN state = 'opened' THEN 1 END) AS opened, 112bc2653b0SSzymon Olewniczak COUNT(CASE WHEN state = 'done' AND close_date <= plan_date THEN 1 END) 113bc2653b0SSzymon Olewniczak AS closed_on_time, 114bc2653b0SSzymon Olewniczak COUNT(CASE WHEN state = 'done' AND close_date > plan_date THEN 1 END) 115bc2653b0SSzymon Olewniczak AS closed_after_the_dedline, 116bc2653b0SSzymon Olewniczak SUM(cost) AS total_cost, 117bc2653b0SSzymon Olewniczak (CASE WHEN state = 'done' THEN 118bc2653b0SSzymon Olewniczak SUM(cost) 119bc2653b0SSzymon Olewniczak END) AS cost_of_closed, 120bc2653b0SSzymon Olewniczak COUNT(*) AS 'count_all' 121bc2653b0SSzymon Olewniczak FROM task_view 122bc2653b0SSzymon Olewniczak WHERE create_date BETWEEN ? AND ? 123bc2653b0SSzymon Olewniczak GROUP BY task_program_name 124bc2653b0SSzymon Olewniczak ORDER BY task_program_name"; 125bc2653b0SSzymon Olewniczak $r = $this->model->sqlite->query($sql, $from, $to); 126bc2653b0SSzymon Olewniczak } else { 127bc2653b0SSzymon Olewniczak $sql = "SELECT task_program_name, 128bc2653b0SSzymon Olewniczak COUNT(CASE WHEN state = 'opened' THEN 1 END) AS opened, 129bc2653b0SSzymon Olewniczak COUNT(CASE WHEN state = 'done' AND close_date <= plan_date THEN 1 END) 130bc2653b0SSzymon Olewniczak AS closed_on_time, 131bc2653b0SSzymon Olewniczak COUNT(CASE WHEN state = 'done' AND close_date > plan_date THEN 1 END) 132bc2653b0SSzymon Olewniczak AS closed_after_the_dedline, 133bc2653b0SSzymon Olewniczak SUM(cost) AS total_cost, 134bc2653b0SSzymon Olewniczak (CASE WHEN state = 'done' THEN 135bc2653b0SSzymon Olewniczak SUM(cost) 136bc2653b0SSzymon Olewniczak END) AS cost_of_closed, 137bc2653b0SSzymon Olewniczak COUNT(*) AS 'count_all' 138bc2653b0SSzymon Olewniczak FROM task_view 139bc2653b0SSzymon Olewniczak GROUP BY task_program_name 140bc2653b0SSzymon Olewniczak ORDER BY task_program_name"; 141bc2653b0SSzymon Olewniczak $r = $this->model->sqlite->query($sql); 142bc2653b0SSzymon Olewniczak } 143bc2653b0SSzymon Olewniczak 144bc2653b0SSzymon Olewniczak return $r; 145bc2653b0SSzymon Olewniczak } 146bc2653b0SSzymon Olewniczak 1478a638198SSzymon Olewniczak public function initial_save(Entity $task, $data) { 1488a638198SSzymon Olewniczak try { 1498a638198SSzymon Olewniczak $this->beginTransaction(); 15053df74e7SSzymon Olewniczak parent::initial_save($task, $data); 1518a638198SSzymon Olewniczak 15253df74e7SSzymon Olewniczak $task->set_participant_flags($task->original_poster, array('subscribent', 'original_poster')); 15353df74e7SSzymon Olewniczak $task->set_participant_flags($task->assignee, array('subscribent', 'assignee')); 15453df74e7SSzymon Olewniczak 15553df74e7SSzymon Olewniczak if ($task->thread_id != '') { 1568a638198SSzymon Olewniczak $task->thread->set_participant_flags($task->assignee, array('subscribent', 'task_assignee')); 1578a638198SSzymon Olewniczak $task->thread->update_last_activity(); 1588a638198SSzymon Olewniczak } 1598a638198SSzymon Olewniczak 1608a638198SSzymon Olewniczak $this->commitTransaction(); 16114a1f0a4SSzymon Olewniczak 16214a1f0a4SSzymon Olewniczak //notifications 16314a1f0a4SSzymon Olewniczak if ($this->model->user_nick != $task->assignee) { 16414a1f0a4SSzymon Olewniczak $task->mail_notify_assignee(); 16514a1f0a4SSzymon Olewniczak } 16614a1f0a4SSzymon Olewniczak if ($task->thread_id != '') { 16714a1f0a4SSzymon Olewniczak $task->thread->mail_notify_task_added($task); 16814a1f0a4SSzymon Olewniczak } 1698a638198SSzymon Olewniczak } catch(Exception $exception) { 1708a638198SSzymon Olewniczak $this->rollbackTransaction(); 1718a638198SSzymon Olewniczak } 1728a638198SSzymon Olewniczak } 1738a638198SSzymon Olewniczak 1748a638198SSzymon Olewniczak public function update_save(Entity $task, $data) { 1758a638198SSzymon Olewniczak try { 1768a638198SSzymon Olewniczak $this->beginTransaction(); 177a0cd8c78SSzymon Olewniczak $prev_assignee = $task->assignee; 17853df74e7SSzymon Olewniczak parent::update_save($task, $data); 1798a638198SSzymon Olewniczak 180b331b892SSzymon Olewniczak if($task->assignee != $prev_assignee) { 181b331b892SSzymon Olewniczak $task->remove_participant_flags($prev_assignee, array('assignee')); 182b331b892SSzymon Olewniczak $task->set_participant_flags($task->assignee, array('subscribent', 'assignee')); 183b331b892SSzymon Olewniczak } 184b331b892SSzymon Olewniczak 185a0cd8c78SSzymon Olewniczak if ($task->thread_id != '' && $task->assignee != $prev_assignee) { 186a0cd8c78SSzymon Olewniczak if ($this->model->taskFactory->count(array( 187a0cd8c78SSzymon Olewniczak 'thread_id' => $task->thread_id, 188a0cd8c78SSzymon Olewniczak 'assignee' => $prev_assignee)) == 0) { 189a0cd8c78SSzymon Olewniczak $task->thread->remove_participant_flags($prev_assignee, array('task_assignee')); 190a0cd8c78SSzymon Olewniczak } 191a0cd8c78SSzymon Olewniczak $task->thread->set_participant_flags($task->assignee, array('subscribent', 'task_assignee')); 1928a638198SSzymon Olewniczak } 1938a638198SSzymon Olewniczak 1948a638198SSzymon Olewniczak $this->commitTransaction(); 19514a1f0a4SSzymon Olewniczak //notifications 19614a1f0a4SSzymon Olewniczak if ($prev_assignee != $task->assignee && $this->model->user_nick != $task->assignee) { 19714a1f0a4SSzymon Olewniczak $task->mail_notify_assignee(); 19814a1f0a4SSzymon Olewniczak } 1998a638198SSzymon Olewniczak } catch(Exception $exception) { 2008a638198SSzymon Olewniczak $this->rollbackTransaction(); 2018a638198SSzymon Olewniczak } 2028a638198SSzymon Olewniczak } 2038a638198SSzymon Olewniczak}