xref: /plugin/bez/mdl/ThreadFactory.php (revision 6fa92f543f15922cfc8ce756fa03e751cd3ae28f)
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
61*6fa92f54SSzymon Olewniczak    public function kpi($range=array()) {
62*6fa92f54SSzymon Olewniczak        if (count($range) > 0) {
63*6fa92f54SSzymon Olewniczak            $from = date('c	', strtotime($range[0]));
64*6fa92f54SSzymon Olewniczak            if (count($range) == 1) {
65*6fa92f54SSzymon Olewniczak                $to = date('c');
66*6fa92f54SSzymon Olewniczak            } else {
67*6fa92f54SSzymon Olewniczak                $to = date('c', strtotime($range[1]));
68*6fa92f54SSzymon Olewniczak            }
69*6fa92f54SSzymon Olewniczak            $sql = "SELECT COUNT(*)*1.0/COUNT(DISTINCT thread_id) AS kpi
70*6fa92f54SSzymon Olewniczak                       FROM thread_participant JOIN thread ON thread_participant.thread_id = thread.id
71*6fa92f54SSzymon Olewniczak                       WHERE thread.create_date BETWEEN ? AND ?
72*6fa92f54SSzymon Olewniczak                       GROUP BY thread_id";
73*6fa92f54SSzymon Olewniczak            $r = $this->model->sqlite->query($sql, $from, $to);
74*6fa92f54SSzymon Olewniczak        } else {
75*6fa92f54SSzymon Olewniczak            $sql = "SELECT COUNT(*)*1.0/COUNT(DISTINCT thread_id) AS kpi
76*6fa92f54SSzymon Olewniczak                      FROM thread_participant";
77*6fa92f54SSzymon Olewniczak
78*6fa92f54SSzymon Olewniczak            $r = $this->model->sqlite->query($sql);
79*6fa92f54SSzymon Olewniczak        }
80*6fa92f54SSzymon Olewniczak
81*6fa92f54SSzymon Olewniczak        return $r->fetchColumn();
82*6fa92f54SSzymon Olewniczak    }
83*6fa92f54SSzymon Olewniczak
848a638198SSzymon Olewniczak    public function initial_save(Entity $thread, $data) {
857fbf4c39SSzymon Olewniczak        $label_ids = array();
867fbf4c39SSzymon Olewniczak        if (isset($data['label_id']) && $data['label_id'] != '') {
877fbf4c39SSzymon Olewniczak            $label_ids[] = $data['label_id'];
887fbf4c39SSzymon Olewniczak        }
897fbf4c39SSzymon Olewniczak        try {
907fbf4c39SSzymon Olewniczak            $this->beginTransaction();
91a0cd8c78SSzymon Olewniczak
9253df74e7SSzymon Olewniczak            parent::initial_save($thread, $data);
937fbf4c39SSzymon Olewniczak
947fbf4c39SSzymon Olewniczak            foreach($label_ids as $label_id) {
957fbf4c39SSzymon Olewniczak                $thread->add_label($label_id);
967fbf4c39SSzymon Olewniczak            }
977fbf4c39SSzymon Olewniczak
987fbf4c39SSzymon Olewniczak            $thread->set_participant_flags($thread->original_poster, array('original_poster', 'subscribent'));
997fbf4c39SSzymon Olewniczak            if($thread->coordinator != null) {
1007fbf4c39SSzymon Olewniczak                $thread->set_participant_flags($thread->coordinator, array('coordinator', 'subscribent'));
1017fbf4c39SSzymon Olewniczak            }
1027fbf4c39SSzymon Olewniczak
103a0cd8c78SSzymon Olewniczak            if ($this->model->get_level() >= BEZ_AUTH_LEADER) {
10453df74e7SSzymon Olewniczak                $private = false;
10553df74e7SSzymon Olewniczak                if (isset($data['private'])) {
10653df74e7SSzymon Olewniczak                    $private = true;
10753df74e7SSzymon Olewniczak                }
10853df74e7SSzymon Olewniczak                $thread->set_private_flag($private);
10953df74e7SSzymon Olewniczak            }
11053df74e7SSzymon Olewniczak
1118a638198SSzymon Olewniczak            $this->commitTransaction();
1128a638198SSzymon Olewniczak
1138a638198SSzymon Olewniczak            if ($thread->state != 'proposal' && $this->model->user_nick != $thread->coordinator) {
1148a638198SSzymon Olewniczak                $thread->mail_inform_coordinator();
115e09b232fSSzymon Olewniczak            } elseif ($thread->state == 'proposal') {
116e09b232fSSzymon Olewniczak                $thread->mail_inform_admins();
1177fbf4c39SSzymon Olewniczak            }
11814a1f0a4SSzymon Olewniczak
11914a1f0a4SSzymon Olewniczak        } catch(Exception $exception) {
12014a1f0a4SSzymon Olewniczak            $this->rollbackTransaction();
12114a1f0a4SSzymon Olewniczak        }
1227fbf4c39SSzymon Olewniczak    }
1237fbf4c39SSzymon Olewniczak
1248a638198SSzymon Olewniczak    public function update_save(Entity $thread, $data) {
1257fbf4c39SSzymon Olewniczak        $prev_coordinator = $thread->coordinator;
12653df74e7SSzymon Olewniczak
1277fbf4c39SSzymon Olewniczak        $label_ids = array();
1287fbf4c39SSzymon Olewniczak        if (isset($data['label_id']) && $data['label_id'] != '') {
1297fbf4c39SSzymon Olewniczak            $label_ids[] = $data['label_id'];
1307fbf4c39SSzymon Olewniczak        }
1317fbf4c39SSzymon Olewniczak        try {
1327fbf4c39SSzymon Olewniczak            $this->beginTransaction();
13353df74e7SSzymon Olewniczak            parent::update_save($thread, $data);
1347fbf4c39SSzymon Olewniczak
1357fbf4c39SSzymon Olewniczak            $cur_label_ids = array_keys($thread->get_labels());
1367fbf4c39SSzymon Olewniczak            $labels_to_add = array_diff($label_ids, $cur_label_ids);
1377fbf4c39SSzymon Olewniczak            $labels_to_rem = array_diff($cur_label_ids, $label_ids);
1387fbf4c39SSzymon Olewniczak
1397fbf4c39SSzymon Olewniczak            foreach($labels_to_add as $label_id) {
1407fbf4c39SSzymon Olewniczak                $thread->add_label($label_id);
1417fbf4c39SSzymon Olewniczak            }
1427fbf4c39SSzymon Olewniczak
1437fbf4c39SSzymon Olewniczak            foreach($labels_to_rem as $label_id) {
1447fbf4c39SSzymon Olewniczak                $thread->remove_label($label_id);
1457fbf4c39SSzymon Olewniczak            }
1467fbf4c39SSzymon Olewniczak
1477fbf4c39SSzymon Olewniczak            if ($thread->coordinator != null && $thread->coordinator != $prev_coordinator) {
148eb2e6be9SSzymon Olewniczak                if ($prev_coordinator != null) {
1497fbf4c39SSzymon Olewniczak                    $thread->remove_participant_flags($prev_coordinator, array('coordinator'));
150eb2e6be9SSzymon Olewniczak                }
1517fbf4c39SSzymon Olewniczak                $thread->set_participant_flags($thread->coordinator, array('subscribent', 'coordinator'));
1527fbf4c39SSzymon Olewniczak            }
1537fbf4c39SSzymon Olewniczak
15453df74e7SSzymon Olewniczak            if ($thread->acl_of('private') >= BEZ_PERMISSION_CHANGE) {
15553df74e7SSzymon Olewniczak                $private = false;
15653df74e7SSzymon Olewniczak                if (isset($data['private'])) {
15753df74e7SSzymon Olewniczak                    $private = true;
15853df74e7SSzymon Olewniczak                }
15953df74e7SSzymon Olewniczak                $thread->set_private_flag($private);
16053df74e7SSzymon Olewniczak            }
16153df74e7SSzymon Olewniczak
1628a638198SSzymon Olewniczak            $this->commitTransaction();
1637fbf4c39SSzymon Olewniczak        } catch(Exception $exception) {
1648a638198SSzymon Olewniczak            $this->rollbackTransaction();
1658a638198SSzymon Olewniczak        }
1668a638198SSzymon Olewniczak
1678a638198SSzymon Olewniczak        if ($thread->state != 'proposal' && $this->model->user_nick != $thread->coordinator) {
1688a638198SSzymon Olewniczak            $thread->mail_inform_coordinator();
1697fbf4c39SSzymon Olewniczak        }
1707fbf4c39SSzymon Olewniczak    }
171de02284cSSzymon Olewniczak}
172