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