1de02284cSSzymon Olewniczak<?php 2de02284cSSzymon Olewniczak 3de02284cSSzymon Olewniczaknamespace dokuwiki\plugin\bez\mdl; 4de02284cSSzymon Olewniczak 57fbf4c39SSzymon Olewniczakuse Assetic\Exception\Exception; 67fbf4c39SSzymon Olewniczak 7de02284cSSzymon Olewniczakclass ThreadFactory extends Factory { 8de02284cSSzymon Olewniczak 953df74e7SSzymon Olewniczak public function get_table_view() { 1053df74e7SSzymon Olewniczak return 'thread_view'; 11de02284cSSzymon Olewniczak } 12de02284cSSzymon Olewniczak 13de02284cSSzymon Olewniczak public function get_years_scope() { 14de02284cSSzymon Olewniczak $r = $this->model->sqlite->query('SELECT create_date FROM thread ORDER BY id LIMIT 1'); 15de02284cSSzymon Olewniczak $date = $this->model->sqlite->res2single($r); 16de02284cSSzymon Olewniczak 17de02284cSSzymon Olewniczak //get only year 18de02284cSSzymon Olewniczak $first = (int) substr($date, 0, strpos($date, '-')); 19de02284cSSzymon Olewniczak $last = (int) date('Y'); 20de02284cSSzymon Olewniczak 21de02284cSSzymon Olewniczak $years = array(); 22de02284cSSzymon Olewniczak for ($year = $first; $year <= $last; $year++) { 23de02284cSSzymon Olewniczak $years[] = (string) $year; 24de02284cSSzymon Olewniczak } 25de02284cSSzymon Olewniczak return $years; 26de02284cSSzymon Olewniczak } 277fbf4c39SSzymon Olewniczak 28b331b892SSzymon Olewniczak public function users_involvement($range=array()) { 29eb2e6be9SSzymon Olewniczak if (count($range) > 0) { 30eb2e6be9SSzymon Olewniczak $from = date('c ', strtotime($range[0])); 31eb2e6be9SSzymon Olewniczak if (count($range) == 1) { 32eb2e6be9SSzymon Olewniczak $to = date('c'); 33eb2e6be9SSzymon Olewniczak } else { 34eb2e6be9SSzymon Olewniczak $to = date('c', strtotime($range[1])); 35eb2e6be9SSzymon Olewniczak } 36eb2e6be9SSzymon Olewniczak $sql = "SELECT thread_participant.user_id, 37eb2e6be9SSzymon Olewniczak SUM(thread_participant.original_poster) AS original_poster_sum, 38eb2e6be9SSzymon Olewniczak SUM(thread_participant.coordinator) AS coordinator_sum, 39eb2e6be9SSzymon Olewniczak SUM(thread_participant.commentator) AS commentator_sum, 40eb2e6be9SSzymon Olewniczak SUM(thread_participant.task_assignee) AS task_assignee_sum 41eb2e6be9SSzymon Olewniczak FROM thread_participant JOIN thread ON thread_participant.thread_id = thread.id 42eb2e6be9SSzymon Olewniczak WHERE thread.create_date BETWEEN ? AND ? 43eb2e6be9SSzymon Olewniczak GROUP BY user_id 44eb2e6be9SSzymon Olewniczak ORDER BY user_id"; 45eb2e6be9SSzymon Olewniczak $r = $this->model->sqlite->query($sql, $from, $to); 46eb2e6be9SSzymon Olewniczak } else { 47eb2e6be9SSzymon Olewniczak $sql = "SELECT user_id, 48eb2e6be9SSzymon Olewniczak SUM(original_poster) AS original_poster_sum, 49eb2e6be9SSzymon Olewniczak SUM(coordinator) AS coordinator_sum, 50eb2e6be9SSzymon Olewniczak SUM(commentator) AS commentator_sum, 51eb2e6be9SSzymon Olewniczak SUM(task_assignee) AS task_assignee_sum 52ff14b107SSzymon Olewniczak FROM thread_participant 53ff14b107SSzymon Olewniczak GROUP BY user_id 54eb2e6be9SSzymon Olewniczak ORDER BY user_id"; 55ff14b107SSzymon Olewniczak 56ff14b107SSzymon Olewniczak $r = $this->model->sqlite->query($sql); 57eb2e6be9SSzymon Olewniczak } 58ff14b107SSzymon Olewniczak return $r; 59ff14b107SSzymon Olewniczak } 60ff14b107SSzymon Olewniczak 616fa92f54SSzymon Olewniczak public function kpi($range=array()) { 626fa92f54SSzymon Olewniczak if (count($range) > 0) { 636fa92f54SSzymon Olewniczak $from = date('c ', strtotime($range[0])); 646fa92f54SSzymon Olewniczak if (count($range) == 1) { 656fa92f54SSzymon Olewniczak $to = date('c'); 666fa92f54SSzymon Olewniczak } else { 676fa92f54SSzymon Olewniczak $to = date('c', strtotime($range[1])); 686fa92f54SSzymon Olewniczak } 696fa92f54SSzymon Olewniczak $sql = "SELECT COUNT(*)*1.0/COUNT(DISTINCT thread_id) AS kpi 706fa92f54SSzymon Olewniczak FROM thread_participant JOIN thread ON thread_participant.thread_id = thread.id 71a5de966aSSzymon Olewniczak WHERE thread.create_date BETWEEN ? AND ?"; 726fa92f54SSzymon Olewniczak $r = $this->model->sqlite->query($sql, $from, $to); 736fa92f54SSzymon Olewniczak } else { 746fa92f54SSzymon Olewniczak $sql = "SELECT COUNT(*)*1.0/COUNT(DISTINCT thread_id) AS kpi 756fa92f54SSzymon Olewniczak FROM thread_participant"; 766fa92f54SSzymon Olewniczak 776fa92f54SSzymon Olewniczak $r = $this->model->sqlite->query($sql); 786fa92f54SSzymon Olewniczak } 796fa92f54SSzymon Olewniczak 806fa92f54SSzymon Olewniczak return $r->fetchColumn(); 816fa92f54SSzymon Olewniczak } 826fa92f54SSzymon Olewniczak 83a5de966aSSzymon Olewniczak public function bez_activity($range=array()) { 84a5de966aSSzymon Olewniczak if (count($range) > 0) { 85a5de966aSSzymon Olewniczak $from = date('c ', strtotime($range[0])); 86a5de966aSSzymon Olewniczak if (count($range) == 1) { 87a5de966aSSzymon Olewniczak $to = date('c'); 88a5de966aSSzymon Olewniczak } else { 89a5de966aSSzymon Olewniczak $to = date('c', strtotime($range[1])); 90a5de966aSSzymon Olewniczak } 91a5de966aSSzymon Olewniczak $sql = "SELECT COUNT(DISTINCT user_id) 92a5de966aSSzymon Olewniczak FROM (SELECT user_id 93a5de966aSSzymon Olewniczak FROM thread_participant JOIN thread ON thread_participant.thread_id = thread.id 94a5de966aSSzymon Olewniczak WHERE create_date BETWEEN ? AND ? 95a5de966aSSzymon Olewniczak UNION 96a5de966aSSzymon Olewniczak SELECT user_id 97a5de966aSSzymon Olewniczak FROM task_participant JOIN task ON task_participant.task_id = task.id 98a5de966aSSzymon Olewniczak WHERE create_date BETWEEN ? AND ?)"; 99a5de966aSSzymon Olewniczak $r = $this->model->sqlite->query($sql, $from, $to, $from, $to); 100a5de966aSSzymon Olewniczak } else { 101a5de966aSSzymon Olewniczak $sql = "SELECT COUNT(DISTINCT user_id) 102a5de966aSSzymon Olewniczak FROM (SELECT user_id FROM thread_participant 103a5de966aSSzymon Olewniczak UNION 104a5de966aSSzymon Olewniczak SELECT user_id FROM task_participant)"; 105a5de966aSSzymon Olewniczak 106a5de966aSSzymon Olewniczak $r = $this->model->sqlite->query($sql); 107a5de966aSSzymon Olewniczak } 108a5de966aSSzymon Olewniczak $active_users = $r->fetchColumn(); 109a5de966aSSzymon Olewniczak $wiki_users = count($this->model->userFactory->get_all()); 110a5de966aSSzymon Olewniczak 111a5de966aSSzymon Olewniczak return $active_users/$wiki_users * 100; 112a5de966aSSzymon Olewniczak } 113a5de966aSSzymon Olewniczak 1148a638198SSzymon Olewniczak public function initial_save(Entity $thread, $data) { 1157fbf4c39SSzymon Olewniczak $label_ids = array(); 1167fbf4c39SSzymon Olewniczak if (isset($data['label_id']) && $data['label_id'] != '') { 1177fbf4c39SSzymon Olewniczak $label_ids[] = $data['label_id']; 1187fbf4c39SSzymon Olewniczak } 1197fbf4c39SSzymon Olewniczak try { 1207fbf4c39SSzymon Olewniczak $this->beginTransaction(); 121a0cd8c78SSzymon Olewniczak 12253df74e7SSzymon Olewniczak parent::initial_save($thread, $data); 1237fbf4c39SSzymon Olewniczak 1247fbf4c39SSzymon Olewniczak foreach($label_ids as $label_id) { 1257fbf4c39SSzymon Olewniczak $thread->add_label($label_id); 1267fbf4c39SSzymon Olewniczak } 1277fbf4c39SSzymon Olewniczak 1287fbf4c39SSzymon Olewniczak $thread->set_participant_flags($thread->original_poster, array('original_poster', 'subscribent')); 1297fbf4c39SSzymon Olewniczak if($thread->coordinator != null) { 1307fbf4c39SSzymon Olewniczak $thread->set_participant_flags($thread->coordinator, array('coordinator', 'subscribent')); 1317fbf4c39SSzymon Olewniczak } 1327fbf4c39SSzymon Olewniczak 133a0cd8c78SSzymon Olewniczak if ($this->model->get_level() >= BEZ_AUTH_LEADER) { 13453df74e7SSzymon Olewniczak $private = false; 13553df74e7SSzymon Olewniczak if (isset($data['private'])) { 13653df74e7SSzymon Olewniczak $private = true; 13753df74e7SSzymon Olewniczak } 13853df74e7SSzymon Olewniczak $thread->set_private_flag($private); 13953df74e7SSzymon Olewniczak } 14053df74e7SSzymon Olewniczak 1418a638198SSzymon Olewniczak $this->commitTransaction(); 1428a638198SSzymon Olewniczak 1438a638198SSzymon Olewniczak if ($thread->state != 'proposal' && $this->model->user_nick != $thread->coordinator) { 1448a638198SSzymon Olewniczak $thread->mail_inform_coordinator(); 145e09b232fSSzymon Olewniczak } elseif ($thread->state == 'proposal') { 146e09b232fSSzymon Olewniczak $thread->mail_inform_admins(); 1477fbf4c39SSzymon Olewniczak } 14814a1f0a4SSzymon Olewniczak 14914a1f0a4SSzymon Olewniczak } catch(Exception $exception) { 15014a1f0a4SSzymon Olewniczak $this->rollbackTransaction(); 15114a1f0a4SSzymon Olewniczak } 1527fbf4c39SSzymon Olewniczak } 1537fbf4c39SSzymon Olewniczak 154b90263acSSzymon Olewniczak protected function update(Entity $obj) { 155b90263acSSzymon Olewniczak if ($obj->state == 'done') { 156*5b88664dSSzymon Olewniczak $prev_state = $obj->state; 157b90263acSSzymon Olewniczak $reflectionClass = new \ReflectionClass('dokuwiki\plugin\bez\mdl\Thread'); 158b90263acSSzymon Olewniczak $reflectionProperty = $reflectionClass->getProperty('state'); 159b90263acSSzymon Olewniczak $reflectionProperty->setAccessible(true); 160b90263acSSzymon Olewniczak $reflectionProperty->setValue($obj, 'opened'); 161b90263acSSzymon Olewniczak } 162b90263acSSzymon Olewniczak try { 163b90263acSSzymon Olewniczak parent::update($obj); 164b90263acSSzymon Olewniczak } finally { 165*5b88664dSSzymon Olewniczak if (isset($prev_state)) { 166b90263acSSzymon Olewniczak $reflectionProperty->setValue($obj, $prev_state); 167b90263acSSzymon Olewniczak } 168b90263acSSzymon Olewniczak } 169*5b88664dSSzymon Olewniczak } 170b90263acSSzymon Olewniczak 1718a638198SSzymon Olewniczak public function update_save(Entity $thread, $data) { 1727fbf4c39SSzymon Olewniczak $prev_coordinator = $thread->coordinator; 17353df74e7SSzymon Olewniczak 1747fbf4c39SSzymon Olewniczak $label_ids = array(); 1757fbf4c39SSzymon Olewniczak if (isset($data['label_id']) && $data['label_id'] != '') { 1767fbf4c39SSzymon Olewniczak $label_ids[] = $data['label_id']; 1777fbf4c39SSzymon Olewniczak } 1787fbf4c39SSzymon Olewniczak try { 1797fbf4c39SSzymon Olewniczak $this->beginTransaction(); 18053df74e7SSzymon Olewniczak parent::update_save($thread, $data); 1817fbf4c39SSzymon Olewniczak 1827fbf4c39SSzymon Olewniczak $cur_label_ids = array_keys($thread->get_labels()); 1837fbf4c39SSzymon Olewniczak $labels_to_add = array_diff($label_ids, $cur_label_ids); 1847fbf4c39SSzymon Olewniczak $labels_to_rem = array_diff($cur_label_ids, $label_ids); 1857fbf4c39SSzymon Olewniczak 1867fbf4c39SSzymon Olewniczak foreach($labels_to_add as $label_id) { 1877fbf4c39SSzymon Olewniczak $thread->add_label($label_id); 1887fbf4c39SSzymon Olewniczak } 1897fbf4c39SSzymon Olewniczak 1907fbf4c39SSzymon Olewniczak foreach($labels_to_rem as $label_id) { 1917fbf4c39SSzymon Olewniczak $thread->remove_label($label_id); 1927fbf4c39SSzymon Olewniczak } 1937fbf4c39SSzymon Olewniczak 1947fbf4c39SSzymon Olewniczak if ($thread->coordinator != null && $thread->coordinator != $prev_coordinator) { 195eb2e6be9SSzymon Olewniczak if ($prev_coordinator != null) { 1967fbf4c39SSzymon Olewniczak $thread->remove_participant_flags($prev_coordinator, array('coordinator')); 197eb2e6be9SSzymon Olewniczak } 1987fbf4c39SSzymon Olewniczak $thread->set_participant_flags($thread->coordinator, array('subscribent', 'coordinator')); 1997fbf4c39SSzymon Olewniczak } 2007fbf4c39SSzymon Olewniczak 20153df74e7SSzymon Olewniczak if ($thread->acl_of('private') >= BEZ_PERMISSION_CHANGE) { 20253df74e7SSzymon Olewniczak $private = false; 20353df74e7SSzymon Olewniczak if (isset($data['private'])) { 20453df74e7SSzymon Olewniczak $private = true; 20553df74e7SSzymon Olewniczak } 20653df74e7SSzymon Olewniczak $thread->set_private_flag($private); 20753df74e7SSzymon Olewniczak } 20853df74e7SSzymon Olewniczak 2098a638198SSzymon Olewniczak $this->commitTransaction(); 2107fbf4c39SSzymon Olewniczak } catch(Exception $exception) { 2118a638198SSzymon Olewniczak $this->rollbackTransaction(); 2128a638198SSzymon Olewniczak } 2138a638198SSzymon Olewniczak 2148a638198SSzymon Olewniczak if ($thread->state != 'proposal' && $this->model->user_nick != $thread->coordinator) { 2158a638198SSzymon Olewniczak $thread->mail_inform_coordinator(); 2167fbf4c39SSzymon Olewniczak } 2177fbf4c39SSzymon Olewniczak } 218de02284cSSzymon Olewniczak} 219