xref: /plugin/bez/mdl/Thread_commentFactory.php (revision 05651458f48e87d303384828d74f90f47c09d2d5)
18a638198SSzymon Olewniczak<?php
28a638198SSzymon Olewniczak
38a638198SSzymon Olewniczaknamespace dokuwiki\plugin\bez\mdl;
48a638198SSzymon Olewniczak
5a0cd8c78SSzymon Olewniczakuse dokuwiki\plugin\bez\meta\ConsistencyViolationException;
6a0cd8c78SSzymon Olewniczak
78a638198SSzymon Olewniczakclass Thread_commentFactory extends Factory {
88a638198SSzymon Olewniczak
953df74e7SSzymon Olewniczak    public function get_table_view() {
1053df74e7SSzymon Olewniczak        return 'thread_comment_view';
118a638198SSzymon Olewniczak    }
128a638198SSzymon Olewniczak
13038c5d4aSSzymon Olewniczak    public function get_from_thread(Thread $thread, $filters=array(), $orderby='', $limit=false) {
14e8827d73SSzymon Olewniczak        $filters['thread_id'] = $thread->id;
15038c5d4aSSzymon Olewniczak        return $this->get_all($filters, $orderby, array('thread' => $thread), $limit);
168a638198SSzymon Olewniczak    }
178a638198SSzymon Olewniczak
188a638198SSzymon Olewniczak    /**
198a638198SSzymon Olewniczak     * @param Thread_comment $thread_comment
208a638198SSzymon Olewniczak     * @param                $data
218a638198SSzymon Olewniczak     * @throws \Exception
228a638198SSzymon Olewniczak     */
238a638198SSzymon Olewniczak    public function initial_save(Entity $thread_comment, $data) {
248a638198SSzymon Olewniczak        try {
258a638198SSzymon Olewniczak            $this->beginTransaction();
268a638198SSzymon Olewniczak
27e8827d73SSzymon Olewniczak            if ($data['fn'] == 'comment_add' ||
28ff14b107SSzymon Olewniczak                $data['fn'] == 'thread_close' ||
29bf67f2caSSzymon Olewniczak                $data['fn'] == 'thread_reject' ||
30e8827d73SSzymon Olewniczak                $data['content'] != '') {
3153df74e7SSzymon Olewniczak                parent::initial_save($thread_comment, $data);
328a638198SSzymon Olewniczak                $thread_comment->thread->set_participant_flags($thread_comment->author, array('subscribent', 'commentator'));
3314a1f0a4SSzymon Olewniczak                $notify = 'comment_added';
34e8827d73SSzymon Olewniczak            }
35e8827d73SSzymon Olewniczak
36e8827d73SSzymon Olewniczak            if ($data['fn'] == 'thread_close') {
37e8827d73SSzymon Olewniczak                $thread_comment->thread->set_state('closed');
3814a1f0a4SSzymon Olewniczak                $notify = 'mail_thread_closed';
39e8827d73SSzymon Olewniczak            } elseif ($data['fn'] == 'thread_reject') {
40e8827d73SSzymon Olewniczak                $thread_comment->thread->set_state('rejected');
4114a1f0a4SSzymon Olewniczak                $notify = 'mail_thread_rejected';
42e8827d73SSzymon Olewniczak            } elseif ($data['fn'] == 'thread_reopen') {
43e8827d73SSzymon Olewniczak                $thread_comment->thread->set_state('opened');
4414a1f0a4SSzymon Olewniczak                $notify = 'mail_thread_reopened';
45e8827d73SSzymon Olewniczak            }
46e8827d73SSzymon Olewniczak
478a638198SSzymon Olewniczak            $thread_comment->thread->update_last_activity();
488a638198SSzymon Olewniczak
498a638198SSzymon Olewniczak            $this->commitTransaction();
5014a1f0a4SSzymon Olewniczak
5114a1f0a4SSzymon Olewniczak            if ($notify == 'comment_added') {
5214a1f0a4SSzymon Olewniczak                $thread_comment->mail_notify_add();
5314a1f0a4SSzymon Olewniczak            } elseif (isset($notify)) {
5414a1f0a4SSzymon Olewniczak                $thread_comment->thread->mail_notify_change_state($notify);
5514a1f0a4SSzymon Olewniczak            }
5614a1f0a4SSzymon Olewniczak
578a638198SSzymon Olewniczak        } catch(Exception $exception) {
588a638198SSzymon Olewniczak            $this->rollbackTransaction();
598a638198SSzymon Olewniczak        }
608a638198SSzymon Olewniczak    }
618a638198SSzymon Olewniczak
628a638198SSzymon Olewniczak    public function update_save(Entity $thread_comment, $data) {
638a638198SSzymon Olewniczak        try {
648a638198SSzymon Olewniczak            $this->beginTransaction();
659110c699SSzymon Olewniczak
669110c699SSzymon Olewniczak            $prev_type = $thread_comment->type;
679110c699SSzymon Olewniczak
6853df74e7SSzymon Olewniczak            parent::update_save($thread_comment, $data);
698a638198SSzymon Olewniczak
709110c699SSzymon Olewniczak            //update task types
719110c699SSzymon Olewniczak            if ($thread_comment->type != 'comment' && $thread_comment->type != $prev_type) {
72bf67f2caSSzymon Olewniczak                if ($thread_comment->type == 'cause') {
739110c699SSzymon Olewniczak                    $task_type = 'corrective';
749110c699SSzymon Olewniczak                } else {
759110c699SSzymon Olewniczak                    $task_type = 'preventive';
769110c699SSzymon Olewniczak                }
779110c699SSzymon Olewniczak                $this->model->sqlite->query('UPDATE task SET type=? WHERE thread_comment_id=?',
789110c699SSzymon Olewniczak                                            $task_type, $thread_comment->id);
799110c699SSzymon Olewniczak
809110c699SSzymon Olewniczak            }
819110c699SSzymon Olewniczak
828a638198SSzymon Olewniczak            $thread_comment->thread->update_last_activity();
838a638198SSzymon Olewniczak
848a638198SSzymon Olewniczak            $this->commitTransaction();
858a638198SSzymon Olewniczak        } catch(Exception $exception) {
868a638198SSzymon Olewniczak            $this->rollbackTransaction();
878a638198SSzymon Olewniczak        }
888a638198SSzymon Olewniczak    }
898a638198SSzymon Olewniczak
908a638198SSzymon Olewniczak    public function delete(Entity $obj) {
91a0cd8c78SSzymon Olewniczak
92a0cd8c78SSzymon Olewniczak        if ($obj->task_count > 0) {
93a0cd8c78SSzymon Olewniczak            throw new ConsistencyViolationException('cannot delete when task are assigned');
94a0cd8c78SSzymon Olewniczak        }
95a0cd8c78SSzymon Olewniczak
968a638198SSzymon Olewniczak        try {
978a638198SSzymon Olewniczak            $this->beginTransaction();
988a638198SSzymon Olewniczak
998a638198SSzymon Olewniczak            parent::delete($obj);
1008a638198SSzymon Olewniczak            $obj->thread->update_last_activity();
101f7519ef1SSzymon Olewniczak            //remove commentator flag
102f7519ef1SSzymon Olewniczak            if ($this->count(array('thread_id' => $obj->thread_id, 'author' => $obj->author)) == 0) {
103f7519ef1SSzymon Olewniczak                $obj->thread->remove_participant_flags($obj->author, array('commentator'));
104f7519ef1SSzymon Olewniczak            }
1058a638198SSzymon Olewniczak
1068a638198SSzymon Olewniczak            $this->commitTransaction();
1078a638198SSzymon Olewniczak        } catch(Exception $exception) {
1088a638198SSzymon Olewniczak            $this->rollbackTransaction();
1098a638198SSzymon Olewniczak        }
1108a638198SSzymon Olewniczak    }
111*05651458SSzymon Olewniczak
112*05651458SSzymon Olewniczak    public function report(\DatePeriod $period=NULL) {
113*05651458SSzymon Olewniczak        if ($period) {
114*05651458SSzymon Olewniczak            $from = $period->getStartDate()->format(\DateTime::ISO8601);
115*05651458SSzymon Olewniczak            $to = $period->getEndDate()->format(\DateTime::ISO8601);
116*05651458SSzymon Olewniczak
117*05651458SSzymon Olewniczak            $sql = "SELECT type, COUNT(type) AS 'cnt'
118*05651458SSzymon Olewniczak                        FROM thread_comment
119*05651458SSzymon Olewniczak                        WHERE type != 'comment'
120*05651458SSzymon Olewniczak                            AND create_date BETWEEN ? AND ?
121*05651458SSzymon Olewniczak                        GROUP BY type";
122*05651458SSzymon Olewniczak            $r = $this->model->sqlite->query($sql, $from, $to);
123*05651458SSzymon Olewniczak        } else {
124*05651458SSzymon Olewniczak            $sql = "SELECT type, COUNT(type) AS 'cnt'
125*05651458SSzymon Olewniczak                        FROM thread_comment
126*05651458SSzymon Olewniczak                        WHERE type != 'comment'
127*05651458SSzymon Olewniczak                        GROUP BY type";
128*05651458SSzymon Olewniczak            $r = $this->model->sqlite->query($sql);
129*05651458SSzymon Olewniczak        }
130*05651458SSzymon Olewniczak
131*05651458SSzymon Olewniczak        $counted = [
132*05651458SSzymon Olewniczak            'cause' => 0,
133*05651458SSzymon Olewniczak            'risk' => 0,
134*05651458SSzymon Olewniczak            'opportunity' => 0,
135*05651458SSzymon Olewniczak            'all' => 0
136*05651458SSzymon Olewniczak        ];
137*05651458SSzymon Olewniczak
138*05651458SSzymon Olewniczak        $result = $r->fetchAll();
139*05651458SSzymon Olewniczak        foreach ($result as $row) {
140*05651458SSzymon Olewniczak            $cnt = (int) $row['cnt'];
141*05651458SSzymon Olewniczak            $counted[$row['type']] += $cnt;
142*05651458SSzymon Olewniczak            $counted['all'] += $cnt;
143*05651458SSzymon Olewniczak        }
144*05651458SSzymon Olewniczak
145*05651458SSzymon Olewniczak        return $counted;
146*05651458SSzymon Olewniczak    }
1478a638198SSzymon Olewniczak}
148