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