xref: /plugin/bez/mdl/ThreadFactory.php (revision a5de966a2ff9d2700e6588cf9ce0c0397bd92581)
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
71*a5de966aSSzymon 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
83*a5de966aSSzymon Olewniczak    public function bez_activity($range=array()) {
84*a5de966aSSzymon Olewniczak        if (count($range) > 0) {
85*a5de966aSSzymon Olewniczak            $from = date('c	', strtotime($range[0]));
86*a5de966aSSzymon Olewniczak            if (count($range) == 1) {
87*a5de966aSSzymon Olewniczak                $to = date('c');
88*a5de966aSSzymon Olewniczak            } else {
89*a5de966aSSzymon Olewniczak                $to = date('c', strtotime($range[1]));
90*a5de966aSSzymon Olewniczak            }
91*a5de966aSSzymon Olewniczak            $sql = "SELECT COUNT(DISTINCT user_id)
92*a5de966aSSzymon Olewniczak                      FROM (SELECT user_id
93*a5de966aSSzymon Olewniczak                              FROM thread_participant JOIN thread ON thread_participant.thread_id = thread.id
94*a5de966aSSzymon Olewniczak                              WHERE create_date BETWEEN ? AND ?
95*a5de966aSSzymon Olewniczak                            UNION
96*a5de966aSSzymon Olewniczak                            SELECT user_id
97*a5de966aSSzymon Olewniczak                              FROM task_participant JOIN task ON task_participant.task_id = task.id
98*a5de966aSSzymon Olewniczak                              WHERE create_date BETWEEN ? AND ?)";
99*a5de966aSSzymon Olewniczak            $r = $this->model->sqlite->query($sql, $from, $to, $from, $to);
100*a5de966aSSzymon Olewniczak        } else {
101*a5de966aSSzymon Olewniczak            $sql = "SELECT COUNT(DISTINCT user_id)
102*a5de966aSSzymon Olewniczak                      FROM (SELECT user_id FROM thread_participant
103*a5de966aSSzymon Olewniczak                            UNION
104*a5de966aSSzymon Olewniczak                            SELECT user_id FROM task_participant)";
105*a5de966aSSzymon Olewniczak
106*a5de966aSSzymon Olewniczak            $r = $this->model->sqlite->query($sql);
107*a5de966aSSzymon Olewniczak        }
108*a5de966aSSzymon Olewniczak        $active_users = $r->fetchColumn();
109*a5de966aSSzymon Olewniczak        $wiki_users = count($this->model->userFactory->get_all());
110*a5de966aSSzymon Olewniczak
111*a5de966aSSzymon Olewniczak        return $active_users/$wiki_users * 100;
112*a5de966aSSzymon Olewniczak    }
113*a5de966aSSzymon 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
1548a638198SSzymon Olewniczak    public function update_save(Entity $thread, $data) {
1557fbf4c39SSzymon Olewniczak        $prev_coordinator = $thread->coordinator;
15653df74e7SSzymon Olewniczak
1577fbf4c39SSzymon Olewniczak        $label_ids = array();
1587fbf4c39SSzymon Olewniczak        if (isset($data['label_id']) && $data['label_id'] != '') {
1597fbf4c39SSzymon Olewniczak            $label_ids[] = $data['label_id'];
1607fbf4c39SSzymon Olewniczak        }
1617fbf4c39SSzymon Olewniczak        try {
1627fbf4c39SSzymon Olewniczak            $this->beginTransaction();
16353df74e7SSzymon Olewniczak            parent::update_save($thread, $data);
1647fbf4c39SSzymon Olewniczak
1657fbf4c39SSzymon Olewniczak            $cur_label_ids = array_keys($thread->get_labels());
1667fbf4c39SSzymon Olewniczak            $labels_to_add = array_diff($label_ids, $cur_label_ids);
1677fbf4c39SSzymon Olewniczak            $labels_to_rem = array_diff($cur_label_ids, $label_ids);
1687fbf4c39SSzymon Olewniczak
1697fbf4c39SSzymon Olewniczak            foreach($labels_to_add as $label_id) {
1707fbf4c39SSzymon Olewniczak                $thread->add_label($label_id);
1717fbf4c39SSzymon Olewniczak            }
1727fbf4c39SSzymon Olewniczak
1737fbf4c39SSzymon Olewniczak            foreach($labels_to_rem as $label_id) {
1747fbf4c39SSzymon Olewniczak                $thread->remove_label($label_id);
1757fbf4c39SSzymon Olewniczak            }
1767fbf4c39SSzymon Olewniczak
1777fbf4c39SSzymon Olewniczak            if ($thread->coordinator != null && $thread->coordinator != $prev_coordinator) {
178eb2e6be9SSzymon Olewniczak                if ($prev_coordinator != null) {
1797fbf4c39SSzymon Olewniczak                    $thread->remove_participant_flags($prev_coordinator, array('coordinator'));
180eb2e6be9SSzymon Olewniczak                }
1817fbf4c39SSzymon Olewniczak                $thread->set_participant_flags($thread->coordinator, array('subscribent', 'coordinator'));
1827fbf4c39SSzymon Olewniczak            }
1837fbf4c39SSzymon Olewniczak
18453df74e7SSzymon Olewniczak            if ($thread->acl_of('private') >= BEZ_PERMISSION_CHANGE) {
18553df74e7SSzymon Olewniczak                $private = false;
18653df74e7SSzymon Olewniczak                if (isset($data['private'])) {
18753df74e7SSzymon Olewniczak                    $private = true;
18853df74e7SSzymon Olewniczak                }
18953df74e7SSzymon Olewniczak                $thread->set_private_flag($private);
19053df74e7SSzymon Olewniczak            }
19153df74e7SSzymon Olewniczak
1928a638198SSzymon Olewniczak            $this->commitTransaction();
1937fbf4c39SSzymon Olewniczak        } catch(Exception $exception) {
1948a638198SSzymon Olewniczak            $this->rollbackTransaction();
1958a638198SSzymon Olewniczak        }
1968a638198SSzymon Olewniczak
1978a638198SSzymon Olewniczak        if ($thread->state != 'proposal' && $this->model->user_nick != $thread->coordinator) {
1988a638198SSzymon Olewniczak            $thread->mail_inform_coordinator();
1997fbf4c39SSzymon Olewniczak        }
2007fbf4c39SSzymon Olewniczak    }
201de02284cSSzymon Olewniczak}
202