xref: /plugin/bez/mdl/TaskFactory.php (revision 8f69a4e63b9668d2f3a43571baca9b354c205ae8)
18a638198SSzymon Olewniczak<?php
28a638198SSzymon Olewniczak
38a638198SSzymon Olewniczaknamespace dokuwiki\plugin\bez\mdl;
48a638198SSzymon Olewniczak
58a638198SSzymon Olewniczakclass TaskFactory extends Factory {
6ff14b107SSzymon Olewniczak
7ff14b107SSzymon Olewniczak    public function get_table_view() {
8ff14b107SSzymon Olewniczak        return 'task_view';
98a638198SSzymon Olewniczak    }
108a638198SSzymon Olewniczak
1153df74e7SSzymon Olewniczak    public function get_years_scope() {
1253df74e7SSzymon Olewniczak        $r = $this->model->sqlite->query('SELECT
1353df74e7SSzymon Olewniczak                                        MIN(create_date),
1453df74e7SSzymon Olewniczak                                        MIN(plan_date),
1553df74e7SSzymon Olewniczak                                        DATE(),
1653df74e7SSzymon Olewniczak                                        MAX(close_date),
1753df74e7SSzymon Olewniczak                                        MAX(plan_date)
1853df74e7SSzymon Olewniczak                                        FROM task');
1953df74e7SSzymon Olewniczak        $data = $this->model->sqlite->res_fetch_array($r);
2053df74e7SSzymon Olewniczak
2153df74e7SSzymon Olewniczak        $min_date = min($data[0], $data[1], $data[2]);
2253df74e7SSzymon Olewniczak        $max_date = max($data[2], $data[3], $data[4]);
2353df74e7SSzymon Olewniczak
2453df74e7SSzymon Olewniczak        //get only year
2553df74e7SSzymon Olewniczak        $first =  (int) substr($min_date, 0, strpos($min_date, '-'));
2653df74e7SSzymon Olewniczak        $last = (int) substr($max_date, 0, strpos($max_date, '-'));
2753df74e7SSzymon Olewniczak
2853df74e7SSzymon Olewniczak        $years = array();
2953df74e7SSzymon Olewniczak        for ($year = $first; $year <= $last; $year++) {
3053df74e7SSzymon Olewniczak            $years[] = (string) $year;
3153df74e7SSzymon Olewniczak        }
3253df74e7SSzymon Olewniczak        return $years;
3353df74e7SSzymon Olewniczak    }
3453df74e7SSzymon Olewniczak
35e8827d73SSzymon Olewniczak    public function get_from_thread(Thread $thread) {
36e8827d73SSzymon Olewniczak        $tasks = $this->model->taskFactory->get_all(array('thread_id' => $thread->id),
37e8827d73SSzymon Olewniczak                                            'thread_comment_id', false, array('thread' => $thread));
38e8827d73SSzymon Olewniczak        $by_thread_comment = array('corrections' => array());
39e8827d73SSzymon Olewniczak        foreach ($tasks as $task) {
40e8827d73SSzymon Olewniczak            if ($task->thread_comment_id == null) {
41e8827d73SSzymon Olewniczak                $by_thread_comment['corrections'][$task->id] = $task;
42e8827d73SSzymon Olewniczak                continue;
43e8827d73SSzymon Olewniczak            }
44e8827d73SSzymon Olewniczak            if (!isset($by_thread_comment[$task->thread_comment_id])) {
45e8827d73SSzymon Olewniczak                $by_thread_comment[$task->thread_comment_id] = array();
46e8827d73SSzymon Olewniczak            }
47e8827d73SSzymon Olewniczak            $by_thread_comment[$task->thread_comment_id][$task->id] = $task;
48e8827d73SSzymon Olewniczak        }
49e8827d73SSzymon Olewniczak        return $by_thread_comment;
50e8827d73SSzymon Olewniczak    }
51e8827d73SSzymon Olewniczak
52076c315aSSzymon Olewniczak    public function get_with_closing_comment($thread) {
53dad2347cSSzymon Olewniczak        $sql = "SELECT task.id, task.type, task.content_html, task.state, task.cost, task.plan_date, task.close_date,
54*8f69a4e6SSzymon Olewniczak                        task_closing_comment.content_html AS task_comment_content_html, task.assignee
55*8f69a4e6SSzymon Olewniczak                        FROM task LEFT JOIN
56*8f69a4e6SSzymon Olewniczak                            (SELECT content_html, task_id FROM task_comment WHERE closing=1)
57*8f69a4e6SSzymon Olewniczak                                AS task_closing_comment ON task.id = task_closing_comment.task_id
58*8f69a4e6SSzymon Olewniczak                        WHERE task.thread_id = ?
592467512fSSzymon Olewniczak                        ORDER BY task.plan_date";
60dad2347cSSzymon Olewniczak        $stmt = $this->model->sqlite->query($sql, $thread->id);
61dad2347cSSzymon Olewniczak        $stmt->setFetchMode(\PDO::FETCH_OBJ);
62e8827d73SSzymon Olewniczak
63076c315aSSzymon Olewniczak        return $stmt;
64076c315aSSzymon Olewniczak    }
65076c315aSSzymon Olewniczak
66076c315aSSzymon Olewniczak    public function get_by_type($thread) {
678a222299SSzymon Olewniczak        $stmt = $this->get_with_closing_comment($thread);
68076c315aSSzymon Olewniczak
69e8827d73SSzymon Olewniczak        $by_type = array('correction' => array(), 'corrective' => array(), 'preventive' => array());
70dad2347cSSzymon Olewniczak        foreach ($stmt as $task) {
71e8827d73SSzymon Olewniczak            $by_type[$task->type][$task->id] = $task;
72e8827d73SSzymon Olewniczak        }
73e8827d73SSzymon Olewniczak
74e8827d73SSzymon Olewniczak        return $by_type;
75e8827d73SSzymon Olewniczak    }
76e8827d73SSzymon Olewniczak
77bc2653b0SSzymon Olewniczak    public function users_involvement(\DatePeriod $period=NULL) {
78bc2653b0SSzymon Olewniczak        if ($period) {
79bc2653b0SSzymon Olewniczak            $from = $period->getStartDate()->format(\DateTime::ISO8601);
80bc2653b0SSzymon Olewniczak            $to = $period->getEndDate()->format(\DateTime::ISO8601);
81bc2653b0SSzymon Olewniczak
82eb2e6be9SSzymon Olewniczak            $sql = "SELECT task_participant.user_id,
83eb2e6be9SSzymon Olewniczak                       SUM(task_participant.original_poster) AS original_poster_sum,
84eb2e6be9SSzymon Olewniczak                       SUM(task_participant.assignee) AS assignee_sum,
85eb2e6be9SSzymon Olewniczak                       SUM(task_participant.commentator) AS commentator_sum
86eb2e6be9SSzymon Olewniczak                       FROM task_participant JOIN task ON task_participant.task_id = task.id
87eb2e6be9SSzymon Olewniczak                       WHERE task.create_date BETWEEN ? AND ?
88eb2e6be9SSzymon Olewniczak                       GROUP BY user_id
89eb2e6be9SSzymon Olewniczak                       ORDER BY user_id";
90eb2e6be9SSzymon Olewniczak            $r = $this->model->sqlite->query($sql, $from, $to);
91eb2e6be9SSzymon Olewniczak        } else {
92eb2e6be9SSzymon Olewniczak            $sql = "SELECT user_id,
93eb2e6be9SSzymon Olewniczak                       SUM(original_poster) AS original_poster_sum,
94eb2e6be9SSzymon Olewniczak                       SUM(assignee) AS assignee_sum,
95eb2e6be9SSzymon Olewniczak                       SUM(commentator) AS commentator_sum
96ff14b107SSzymon Olewniczak                       FROM task_participant
97ff14b107SSzymon Olewniczak                       GROUP BY user_id
98eb2e6be9SSzymon Olewniczak                       ORDER BY user_id";
99ff14b107SSzymon Olewniczak            $r = $this->model->sqlite->query($sql);
100eb2e6be9SSzymon Olewniczak        }
101eb2e6be9SSzymon Olewniczak
102ff14b107SSzymon Olewniczak        return $r;
103ff14b107SSzymon Olewniczak    }
104ff14b107SSzymon Olewniczak
105bc2653b0SSzymon Olewniczak    public function report(\DatePeriod $period=NULL) {
106bc2653b0SSzymon Olewniczak        if ($period) {
107bc2653b0SSzymon Olewniczak            $from = $period->getStartDate()->format(\DateTime::ISO8601);
108bc2653b0SSzymon Olewniczak            $to = $period->getEndDate()->format(\DateTime::ISO8601);
109bc2653b0SSzymon Olewniczak
110bc2653b0SSzymon Olewniczak            $sql = "SELECT task_program_name,
111bc2653b0SSzymon Olewniczak                        COUNT(CASE WHEN state = 'opened' THEN 1 END) AS opened,
112bc2653b0SSzymon Olewniczak                        COUNT(CASE WHEN state = 'done' AND close_date <= plan_date THEN 1 END)
113bc2653b0SSzymon Olewniczak                          AS closed_on_time,
114bc2653b0SSzymon Olewniczak                        COUNT(CASE WHEN state = 'done' AND close_date > plan_date THEN 1 END)
115bc2653b0SSzymon Olewniczak                          AS closed_after_the_dedline,
116bc2653b0SSzymon Olewniczak                        SUM(cost) AS total_cost,
117bc2653b0SSzymon Olewniczak                        (CASE WHEN state = 'done' THEN
118bc2653b0SSzymon Olewniczak                            SUM(cost)
119bc2653b0SSzymon Olewniczak                            END) AS cost_of_closed,
120bc2653b0SSzymon Olewniczak                        COUNT(*) AS 'count_all'
121bc2653b0SSzymon Olewniczak                       FROM task_view
122bc2653b0SSzymon Olewniczak                       WHERE create_date BETWEEN ? AND ?
123bc2653b0SSzymon Olewniczak                       GROUP BY task_program_name
124bc2653b0SSzymon Olewniczak                       ORDER BY task_program_name";
125bc2653b0SSzymon Olewniczak            $r = $this->model->sqlite->query($sql, $from, $to);
126bc2653b0SSzymon Olewniczak        } else {
127bc2653b0SSzymon Olewniczak            $sql = "SELECT task_program_name,
128bc2653b0SSzymon Olewniczak                        COUNT(CASE WHEN state = 'opened' THEN 1 END) AS opened,
129bc2653b0SSzymon Olewniczak                        COUNT(CASE WHEN state = 'done' AND close_date <= plan_date THEN 1 END)
130bc2653b0SSzymon Olewniczak                          AS closed_on_time,
131bc2653b0SSzymon Olewniczak                        COUNT(CASE WHEN state = 'done' AND close_date > plan_date THEN 1 END)
132bc2653b0SSzymon Olewniczak                          AS closed_after_the_dedline,
133bc2653b0SSzymon Olewniczak                        SUM(cost) AS total_cost,
134bc2653b0SSzymon Olewniczak                        (CASE WHEN state = 'done' THEN
135bc2653b0SSzymon Olewniczak                            SUM(cost)
136bc2653b0SSzymon Olewniczak                            END) AS cost_of_closed,
137bc2653b0SSzymon Olewniczak                        COUNT(*) AS 'count_all'
138bc2653b0SSzymon Olewniczak                       FROM task_view
139bc2653b0SSzymon Olewniczak                       GROUP BY task_program_name
140bc2653b0SSzymon Olewniczak                       ORDER BY task_program_name";
141bc2653b0SSzymon Olewniczak            $r = $this->model->sqlite->query($sql);
142bc2653b0SSzymon Olewniczak        }
143bc2653b0SSzymon Olewniczak
144bc2653b0SSzymon Olewniczak        return $r;
145bc2653b0SSzymon Olewniczak    }
146bc2653b0SSzymon Olewniczak
1478a638198SSzymon Olewniczak    public function initial_save(Entity $task, $data) {
1488a638198SSzymon Olewniczak        try {
1498a638198SSzymon Olewniczak            $this->beginTransaction();
15053df74e7SSzymon Olewniczak            parent::initial_save($task, $data);
1518a638198SSzymon Olewniczak
15253df74e7SSzymon Olewniczak            $task->set_participant_flags($task->original_poster, array('subscribent', 'original_poster'));
15353df74e7SSzymon Olewniczak            $task->set_participant_flags($task->assignee, array('subscribent', 'assignee'));
15453df74e7SSzymon Olewniczak
15553df74e7SSzymon Olewniczak            if ($task->thread_id != '') {
1568a638198SSzymon Olewniczak                $task->thread->set_participant_flags($task->assignee, array('subscribent', 'task_assignee'));
1578a638198SSzymon Olewniczak                $task->thread->update_last_activity();
1588a638198SSzymon Olewniczak            }
1598a638198SSzymon Olewniczak
1608a638198SSzymon Olewniczak            $this->commitTransaction();
16114a1f0a4SSzymon Olewniczak
16214a1f0a4SSzymon Olewniczak            //notifications
16314a1f0a4SSzymon Olewniczak            if ($this->model->user_nick != $task->assignee) {
16414a1f0a4SSzymon Olewniczak                $task->mail_notify_assignee();
16514a1f0a4SSzymon Olewniczak            }
16614a1f0a4SSzymon Olewniczak            if ($task->thread_id != '') {
16714a1f0a4SSzymon Olewniczak                $task->thread->mail_notify_task_added($task);
16814a1f0a4SSzymon Olewniczak            }
1698a638198SSzymon Olewniczak        } catch(Exception $exception) {
1708a638198SSzymon Olewniczak            $this->rollbackTransaction();
1718a638198SSzymon Olewniczak        }
1728a638198SSzymon Olewniczak    }
1738a638198SSzymon Olewniczak
1748a638198SSzymon Olewniczak    public function update_save(Entity $task, $data) {
1758a638198SSzymon Olewniczak        try {
1768a638198SSzymon Olewniczak            $this->beginTransaction();
177a0cd8c78SSzymon Olewniczak            $prev_assignee = $task->assignee;
17853df74e7SSzymon Olewniczak            parent::update_save($task, $data);
1798a638198SSzymon Olewniczak
180b331b892SSzymon Olewniczak            if($task->assignee != $prev_assignee) {
181b331b892SSzymon Olewniczak                $task->remove_participant_flags($prev_assignee, array('assignee'));
182b331b892SSzymon Olewniczak                $task->set_participant_flags($task->assignee, array('subscribent', 'assignee'));
183b331b892SSzymon Olewniczak            }
184b331b892SSzymon Olewniczak
185a0cd8c78SSzymon Olewniczak            if ($task->thread_id != '' && $task->assignee != $prev_assignee) {
186a0cd8c78SSzymon Olewniczak                if ($this->model->taskFactory->count(array(
187a0cd8c78SSzymon Olewniczak                    'thread_id' => $task->thread_id,
188a0cd8c78SSzymon Olewniczak                    'assignee'  => $prev_assignee)) == 0) {
189a0cd8c78SSzymon Olewniczak                    $task->thread->remove_participant_flags($prev_assignee, array('task_assignee'));
190a0cd8c78SSzymon Olewniczak                }
191a0cd8c78SSzymon Olewniczak                $task->thread->set_participant_flags($task->assignee, array('subscribent', 'task_assignee'));
1928a638198SSzymon Olewniczak            }
1938a638198SSzymon Olewniczak
1948a638198SSzymon Olewniczak            $this->commitTransaction();
19514a1f0a4SSzymon Olewniczak            //notifications
19614a1f0a4SSzymon Olewniczak            if ($prev_assignee != $task->assignee && $this->model->user_nick != $task->assignee) {
19714a1f0a4SSzymon Olewniczak                $task->mail_notify_assignee();
19814a1f0a4SSzymon Olewniczak            }
1998a638198SSzymon Olewniczak        } catch(Exception $exception) {
2008a638198SSzymon Olewniczak            $this->rollbackTransaction();
2018a638198SSzymon Olewniczak        }
2028a638198SSzymon Olewniczak    }
2038a638198SSzymon Olewniczak}