xref: /plugin/bez/mdl/ThreadFactory.php (revision 5b88664dd9ec005af8cd559699bb8f20766e1ba0)
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