1de02284cSSzymon Olewniczak<?php 2de02284cSSzymon Olewniczak 3de02284cSSzymon Olewniczaknamespace dokuwiki\plugin\bez\mdl; 4de02284cSSzymon Olewniczak 5de02284cSSzymon Olewniczak//if(!defined('DOKU_INC')) die(); 6de02284cSSzymon Olewniczak 7de02284cSSzymon Olewniczak//require_once 'factory.php'; 8de02284cSSzymon Olewniczak//require_once 'thread.php'; 9de02284cSSzymon Olewniczak 10de02284cSSzymon Olewniczak 11de02284cSSzymon Olewniczak 127fbf4c39SSzymon Olewniczakuse Assetic\Exception\Exception; 137fbf4c39SSzymon Olewniczak 14de02284cSSzymon Olewniczakclass ThreadFactory extends Factory { 15de02284cSSzymon Olewniczak 16de02284cSSzymon Olewniczak// public function __construct($model) { 17de02284cSSzymon Olewniczak// parent::__construct($model); 18de02284cSSzymon Olewniczak 19de02284cSSzymon Olewniczak /* state_string: 20de02284cSSzymon Olewniczak 0 -> opened 21de02284cSSzymon Olewniczak 1 -> closed 22de02284cSSzymon Olewniczak 2 -> rejected 23de02284cSSzymon Olewniczak if state = 0 and all tasks are done -> done 24de02284cSSzymon Olewniczak */ 25de02284cSSzymon Olewniczak// $this->select_query = "SELECT *, 26de02284cSSzymon Olewniczak// (CASE 27de02284cSSzymon Olewniczak// WHEN state = 2 28de02284cSSzymon Olewniczak// THEN '".$this->model->action->getLang('state_rejected')."' 29de02284cSSzymon Olewniczak// WHEN coordinator = '-proposal' 30de02284cSSzymon Olewniczak// THEN '".$this->model->action->getLang('state_proposal')."' 31de02284cSSzymon Olewniczak// WHEN state = 0 AND assigned_tasks_count > 0 32de02284cSSzymon Olewniczak// AND opened_tasks_count = 0 33de02284cSSzymon Olewniczak// THEN '".$this->model->action->getLang('state_done')."' 34de02284cSSzymon Olewniczak// WHEN state = 0 35de02284cSSzymon Olewniczak// THEN '".$this->model->action->getLang('state_opened')."' 36de02284cSSzymon Olewniczak// WHEN state = 1 37de02284cSSzymon Olewniczak// THEN '".$this->model->action->getLang('state_closed')."' 38de02284cSSzymon Olewniczak// END) AS state_string, 39de02284cSSzymon Olewniczak// 40de02284cSSzymon Olewniczak// (CASE 41de02284cSSzymon Olewniczak// WHEN state = 2 42de02284cSSzymon Olewniczak// THEN '2' 43de02284cSSzymon Olewniczak// WHEN coordinator = '-proposal' 44de02284cSSzymon Olewniczak// THEN '-proposal' 45de02284cSSzymon Olewniczak// WHEN state = 0 AND assigned_tasks_count > 0 46de02284cSSzymon Olewniczak// AND opened_tasks_count = 0 47de02284cSSzymon Olewniczak// THEN '-done' 48de02284cSSzymon Olewniczak// WHEN state = 0 49de02284cSSzymon Olewniczak// THEN '0' 50de02284cSSzymon Olewniczak// WHEN state = 1 51de02284cSSzymon Olewniczak// THEN '1' 52de02284cSSzymon Olewniczak// END) AS full_state, 53de02284cSSzymon Olewniczak// 54de02284cSSzymon Olewniczak// (CASE WHEN state = 2 then '3' 55de02284cSSzymon Olewniczak// WHEN task_priority IS NULL THEN 'None' 56de02284cSSzymon Olewniczak// ELSE task_priority 57de02284cSSzymon Olewniczak// END) AS priority 58de02284cSSzymon Olewniczak// 59de02284cSSzymon Olewniczak// FROM (SELECT issues.*, 60de02284cSSzymon Olewniczak// (SELECT COUNT(*) FROM tasks 61de02284cSSzymon Olewniczak// WHERE tasks.issue = issues.id) 62de02284cSSzymon Olewniczak// AS assigned_tasks_count, 63de02284cSSzymon Olewniczak// (SELECT COUNT(*) FROM tasks 64de02284cSSzymon Olewniczak// WHERE tasks.issue = issues.id AND tasks.state = 0) 65de02284cSSzymon Olewniczak// AS opened_tasks_count, 66de02284cSSzymon Olewniczak// (SELECT MIN((CASE WHEN tasks.state > 0 THEN '3' 67de02284cSSzymon Olewniczak// WHEN tasks.plan_date >= date('now', '+1 month') THEN '2' 68de02284cSSzymon Olewniczak// WHEN tasks.plan_date >= date('now') THEN '1' 69de02284cSSzymon Olewniczak// ELSE '0' END)) FROM tasks WHERE tasks.issue = issues.id) 70de02284cSSzymon Olewniczak// AS task_priority, 71de02284cSSzymon Olewniczak// (SELECT SUM(tasks.cost) FROM tasks 72de02284cSSzymon Olewniczak// WHERE tasks.issue = issues.id) 73de02284cSSzymon Olewniczak// AS cost, 74de02284cSSzymon Olewniczak// issuetypes.".$this->model->conf['lang']." AS type_string 75de02284cSSzymon Olewniczak// FROM issues 76de02284cSSzymon Olewniczak// LEFT JOIN issuetypes ON issues.type = issuetypes.id)"; 77de02284cSSzymon Olewniczak// } 78de02284cSSzymon Olewniczak 79de02284cSSzymon Olewniczak protected function select_query() { 80fe5d6d1eSSzymon Olewniczak return "SELECT thread.*, label.id AS label_id, label.name AS label_name FROM thread 81de02284cSSzymon Olewniczak LEFT JOIN thread_label ON thread.id = thread_label.thread_id 82de02284cSSzymon Olewniczak LEFT JOIN label ON label.id = thread_label.label_id"; 83de02284cSSzymon Olewniczak } 84de02284cSSzymon Olewniczak 85de02284cSSzymon Olewniczak public function get_years_scope() { 86de02284cSSzymon Olewniczak $r = $this->model->sqlite->query('SELECT create_date FROM thread ORDER BY id LIMIT 1'); 87de02284cSSzymon Olewniczak $date = $this->model->sqlite->res2single($r); 88de02284cSSzymon Olewniczak 89de02284cSSzymon Olewniczak //get only year 90de02284cSSzymon Olewniczak $first = (int) substr($date, 0, strpos($date, '-')); 91de02284cSSzymon Olewniczak $last = (int) date('Y'); 92de02284cSSzymon Olewniczak 93de02284cSSzymon Olewniczak $years = array(); 94de02284cSSzymon Olewniczak for ($year = $first; $year <= $last; $year++) { 95de02284cSSzymon Olewniczak $years[] = (string) $year; 96de02284cSSzymon Olewniczak } 97de02284cSSzymon Olewniczak return $years; 98de02284cSSzymon Olewniczak } 997fbf4c39SSzymon Olewniczak 100*ff14b107SSzymon Olewniczak public function users_involvement() { 101*ff14b107SSzymon Olewniczak $sql = 'SELECT user_id, 102*ff14b107SSzymon Olewniczak SUM(original_poster), 103*ff14b107SSzymon Olewniczak SUM(coordinator), 104*ff14b107SSzymon Olewniczak SUM(commentator), 105*ff14b107SSzymon Olewniczak SUM(task_assignee), 106*ff14b107SSzymon Olewniczak COUNT(*) 107*ff14b107SSzymon Olewniczak FROM thread_participant 108*ff14b107SSzymon Olewniczak GROUP BY user_id 109*ff14b107SSzymon Olewniczak ORDER BY user_id'; 110*ff14b107SSzymon Olewniczak 111*ff14b107SSzymon Olewniczak $r = $this->model->sqlite->query($sql); 112*ff14b107SSzymon Olewniczak return $r; 113*ff14b107SSzymon Olewniczak } 114*ff14b107SSzymon Olewniczak 1158a638198SSzymon Olewniczak public function initial_save(Entity $thread, $data) { 1168a638198SSzymon Olewniczak parent::initial_save($thread, $data); 1177fbf4c39SSzymon Olewniczak 1187fbf4c39SSzymon Olewniczak $thread->set_data($data); 1197fbf4c39SSzymon Olewniczak $label_ids = array(); 1207fbf4c39SSzymon Olewniczak if (isset($data['label_id']) && $data['label_id'] != '') { 1217fbf4c39SSzymon Olewniczak $label_ids[] = $data['label_id']; 1227fbf4c39SSzymon Olewniczak } 1237fbf4c39SSzymon Olewniczak try { 1247fbf4c39SSzymon Olewniczak $this->beginTransaction(); 1258a638198SSzymon Olewniczak $this->save($thread); 1267fbf4c39SSzymon Olewniczak 1277fbf4c39SSzymon Olewniczak foreach($label_ids as $label_id) { 1287fbf4c39SSzymon Olewniczak $thread->add_label($label_id); 1297fbf4c39SSzymon Olewniczak } 1307fbf4c39SSzymon Olewniczak 1317fbf4c39SSzymon Olewniczak $thread->set_participant_flags($thread->original_poster, array('original_poster', 'subscribent')); 1327fbf4c39SSzymon Olewniczak if($thread->coordinator != null) { 1337fbf4c39SSzymon Olewniczak $thread->set_participant_flags($thread->coordinator, array('coordinator', 'subscribent')); 1347fbf4c39SSzymon Olewniczak } 1357fbf4c39SSzymon Olewniczak 1368a638198SSzymon Olewniczak $this->commitTransaction(); 1377fbf4c39SSzymon Olewniczak } catch(Exception $exception) { 1388a638198SSzymon Olewniczak $this->rollbackTransaction(); 1398a638198SSzymon Olewniczak } 1408a638198SSzymon Olewniczak 1418a638198SSzymon Olewniczak if ($thread->state != 'proposal' && $this->model->user_nick != $thread->coordinator) { 1428a638198SSzymon Olewniczak $thread->mail_inform_coordinator(); 1437fbf4c39SSzymon Olewniczak } 1447fbf4c39SSzymon Olewniczak } 1457fbf4c39SSzymon Olewniczak 1468a638198SSzymon Olewniczak public function update_save(Entity $thread, $data) { 1478a638198SSzymon Olewniczak parent::update_save($thread, $data); 1487fbf4c39SSzymon Olewniczak 1497fbf4c39SSzymon Olewniczak $prev_coordinator = $thread->coordinator; 1507fbf4c39SSzymon Olewniczak $thread->set_data($data); 1517fbf4c39SSzymon Olewniczak $label_ids = array(); 1527fbf4c39SSzymon Olewniczak if (isset($data['label_id']) && $data['label_id'] != '') { 1537fbf4c39SSzymon Olewniczak $label_ids[] = $data['label_id']; 1547fbf4c39SSzymon Olewniczak } 1557fbf4c39SSzymon Olewniczak try { 1567fbf4c39SSzymon Olewniczak $this->beginTransaction(); 1578a638198SSzymon Olewniczak $this->save($thread); 1587fbf4c39SSzymon Olewniczak 1597fbf4c39SSzymon Olewniczak $cur_label_ids = array_keys($thread->get_labels()); 1607fbf4c39SSzymon Olewniczak $labels_to_add = array_diff($label_ids, $cur_label_ids); 1617fbf4c39SSzymon Olewniczak $labels_to_rem = array_diff($cur_label_ids, $label_ids); 1627fbf4c39SSzymon Olewniczak 1637fbf4c39SSzymon Olewniczak foreach($labels_to_add as $label_id) { 1647fbf4c39SSzymon Olewniczak $thread->add_label($label_id); 1657fbf4c39SSzymon Olewniczak } 1667fbf4c39SSzymon Olewniczak 1677fbf4c39SSzymon Olewniczak foreach($labels_to_rem as $label_id) { 1687fbf4c39SSzymon Olewniczak $thread->remove_label($label_id); 1697fbf4c39SSzymon Olewniczak } 1707fbf4c39SSzymon Olewniczak 1717fbf4c39SSzymon Olewniczak if($thread->coordinator != null && $thread->coordinator != $prev_coordinator) { 1727fbf4c39SSzymon Olewniczak $thread->remove_participant_flags($prev_coordinator, array('coordinator')); 1737fbf4c39SSzymon Olewniczak $thread->set_participant_flags($thread->coordinator, array('subscribent', 'coordinator')); 1747fbf4c39SSzymon Olewniczak } 1757fbf4c39SSzymon Olewniczak 1768a638198SSzymon Olewniczak $this->commitTransaction(); 1777fbf4c39SSzymon Olewniczak } catch(Exception $exception) { 1788a638198SSzymon Olewniczak $this->rollbackTransaction(); 1798a638198SSzymon Olewniczak } 1808a638198SSzymon Olewniczak 1818a638198SSzymon Olewniczak if ($thread->state != 'proposal' && $this->model->user_nick != $thread->coordinator) { 1828a638198SSzymon Olewniczak $thread->mail_inform_coordinator(); 1837fbf4c39SSzymon Olewniczak } 1847fbf4c39SSzymon Olewniczak } 185de02284cSSzymon Olewniczak} 186