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 12*7fbf4c39SSzymon Olewniczakuse Assetic\Exception\Exception; 13*7fbf4c39SSzymon 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 } 99*7fbf4c39SSzymon Olewniczak 100*7fbf4c39SSzymon Olewniczak public function initial_save(Thread $thread, $data, $label_ids=array()) { 101*7fbf4c39SSzymon Olewniczak if ($thread->id != NULL) { 102*7fbf4c39SSzymon Olewniczak throw new \Exception('row already saved. use update_save'); 103*7fbf4c39SSzymon Olewniczak } 104*7fbf4c39SSzymon Olewniczak 105*7fbf4c39SSzymon Olewniczak $thread->set_data($data); 106*7fbf4c39SSzymon Olewniczak $label_ids = array(); 107*7fbf4c39SSzymon Olewniczak if (isset($data['label_id']) && $data['label_id'] != '') { 108*7fbf4c39SSzymon Olewniczak $label_ids[] = $data['label_id']; 109*7fbf4c39SSzymon Olewniczak } 110*7fbf4c39SSzymon Olewniczak try { 111*7fbf4c39SSzymon Olewniczak $this->beginTransaction(); 112*7fbf4c39SSzymon Olewniczak parent::save($thread); 113*7fbf4c39SSzymon Olewniczak 114*7fbf4c39SSzymon Olewniczak foreach($label_ids as $label_id) { 115*7fbf4c39SSzymon Olewniczak $thread->add_label($label_id); 116*7fbf4c39SSzymon Olewniczak } 117*7fbf4c39SSzymon Olewniczak 118*7fbf4c39SSzymon Olewniczak $thread->set_participant_flags($thread->original_poster, array('original_poster', 'subscribent')); 119*7fbf4c39SSzymon Olewniczak if($thread->coordinator != null) { 120*7fbf4c39SSzymon Olewniczak $thread->set_participant_flags($thread->coordinator, array('coordinator', 'subscribent')); 121*7fbf4c39SSzymon Olewniczak } 122*7fbf4c39SSzymon Olewniczak 123*7fbf4c39SSzymon Olewniczak $this->model->threadFactory->commitTransaction(); 124*7fbf4c39SSzymon Olewniczak } catch(Exception $exception) { 125*7fbf4c39SSzymon Olewniczak $this->model->threadFactory->rollbackTransaction(); 126*7fbf4c39SSzymon Olewniczak } 127*7fbf4c39SSzymon Olewniczak } 128*7fbf4c39SSzymon Olewniczak 129*7fbf4c39SSzymon Olewniczak public function update_save(Thread $thread, $data, $label_ids=array()) { 130*7fbf4c39SSzymon Olewniczak if ($thread->id == NULL) { 131*7fbf4c39SSzymon Olewniczak throw new \Exception('row not saved. use initial_save()'); 132*7fbf4c39SSzymon Olewniczak } 133*7fbf4c39SSzymon Olewniczak 134*7fbf4c39SSzymon Olewniczak $prev_coordinator = $thread->coordinator; 135*7fbf4c39SSzymon Olewniczak $thread->set_data($data); 136*7fbf4c39SSzymon Olewniczak $label_ids = array(); 137*7fbf4c39SSzymon Olewniczak if (isset($data['label_id']) && $data['label_id'] != '') { 138*7fbf4c39SSzymon Olewniczak $label_ids[] = $data['label_id']; 139*7fbf4c39SSzymon Olewniczak } 140*7fbf4c39SSzymon Olewniczak try { 141*7fbf4c39SSzymon Olewniczak $this->beginTransaction(); 142*7fbf4c39SSzymon Olewniczak parent::save($thread); 143*7fbf4c39SSzymon Olewniczak 144*7fbf4c39SSzymon Olewniczak $cur_label_ids = array_keys($thread->get_labels()); 145*7fbf4c39SSzymon Olewniczak $labels_to_add = array_diff($label_ids, $cur_label_ids); 146*7fbf4c39SSzymon Olewniczak $labels_to_rem = array_diff($cur_label_ids, $label_ids); 147*7fbf4c39SSzymon Olewniczak 148*7fbf4c39SSzymon Olewniczak foreach($labels_to_add as $label_id) { 149*7fbf4c39SSzymon Olewniczak $thread->add_label($label_id); 150*7fbf4c39SSzymon Olewniczak } 151*7fbf4c39SSzymon Olewniczak 152*7fbf4c39SSzymon Olewniczak foreach($labels_to_rem as $label_id) { 153*7fbf4c39SSzymon Olewniczak $thread->remove_label($label_id); 154*7fbf4c39SSzymon Olewniczak } 155*7fbf4c39SSzymon Olewniczak 156*7fbf4c39SSzymon Olewniczak if($thread->coordinator != null && $thread->coordinator != $prev_coordinator) { 157*7fbf4c39SSzymon Olewniczak $thread->remove_participant_flags($prev_coordinator, array('coordinator')); 158*7fbf4c39SSzymon Olewniczak $thread->set_participant_flags($thread->coordinator, array('subscribent', 'coordinator')); 159*7fbf4c39SSzymon Olewniczak } 160*7fbf4c39SSzymon Olewniczak 161*7fbf4c39SSzymon Olewniczak $this->model->threadFactory->commitTransaction(); 162*7fbf4c39SSzymon Olewniczak } catch(Exception $exception) { 163*7fbf4c39SSzymon Olewniczak $this->model->threadFactory->rollbackTransaction(); 164*7fbf4c39SSzymon Olewniczak } 165*7fbf4c39SSzymon Olewniczak } 166de02284cSSzymon Olewniczak} 167