18a638198SSzymon Olewniczak<?php 28a638198SSzymon Olewniczak 38a638198SSzymon Olewniczaknamespace dokuwiki\plugin\bez\mdl; 48a638198SSzymon Olewniczak 58a638198SSzymon Olewniczakuse dokuwiki\plugin\bez\meta\Mailer; 68a638198SSzymon Olewniczakuse dokuwiki\plugin\bez\meta\PermissionDeniedException; 78a638198SSzymon Olewniczakuse dokuwiki\plugin\bez\meta\ValidationException; 8*14a1f0a4SSzymon Olewniczakuse dokuwiki\plugin\struct\types\DateTime; 98a638198SSzymon Olewniczak 108a638198SSzymon Olewniczakclass Task extends Entity { 118a638198SSzymon Olewniczak 128a638198SSzymon Olewniczak protected $id; 138a638198SSzymon Olewniczak 14e8827d73SSzymon Olewniczak protected $original_poster, $assignee, $closed_by; 158a638198SSzymon Olewniczak 168a638198SSzymon Olewniczak protected $private, $lock; 178a638198SSzymon Olewniczak 188a638198SSzymon Olewniczak protected $state, $type; 198a638198SSzymon Olewniczak 208a638198SSzymon Olewniczak protected $create_date, $last_activity_date, $last_modification_date, $close_date; 218a638198SSzymon Olewniczak 228a638198SSzymon Olewniczak protected $cost, $plan_date, $all_day_event, $start_time, $finish_time; 238a638198SSzymon Olewniczak 248a638198SSzymon Olewniczak protected $content, $content_html; 258a638198SSzymon Olewniczak 268a638198SSzymon Olewniczak protected $thread_id, $thread_comment_id, $task_program_id; 278a638198SSzymon Olewniczak 288a638198SSzymon Olewniczak /** @var \dokuwiki\plugin\bez\mdl\Thread */ 298a638198SSzymon Olewniczak protected $thread; 308a638198SSzymon Olewniczak 318a638198SSzymon Olewniczak /** @var Thread_comment */ 328a638198SSzymon Olewniczak protected $thread_comment; 338a638198SSzymon Olewniczak 348a638198SSzymon Olewniczak //virtual 35ff14b107SSzymon Olewniczak protected $task_program_name, $priority, $coordinator; 368a638198SSzymon Olewniczak 378a638198SSzymon Olewniczak public static function get_columns() { 388a638198SSzymon Olewniczak return array('id', 39e8827d73SSzymon Olewniczak 'original_poster', 'assignee', 'closed_by', 408a638198SSzymon Olewniczak 'private', 'lock', 418a638198SSzymon Olewniczak 'state', 'type', 428a638198SSzymon Olewniczak 'create_date', 'last_activity_date', 'last_modification_date', 'close_date', 438a638198SSzymon Olewniczak 'cost', 'plan_date', 'all_day_event', 'start_time', 'finish_time', 448a638198SSzymon Olewniczak 'content', 'content_html', 458a638198SSzymon Olewniczak 'thread_id', 'thread_comment_id', 'task_program_id'); 468a638198SSzymon Olewniczak } 478a638198SSzymon Olewniczak 48e8827d73SSzymon Olewniczak public static function get_types() { 49e8827d73SSzymon Olewniczak return array('correction', 'corrective', 'preventive', 'program'); 50e8827d73SSzymon Olewniczak } 51e8827d73SSzymon Olewniczak 52e8827d73SSzymon Olewniczak public static function get_states() { 53e8827d73SSzymon Olewniczak return array('opened', 'done'); 54e8827d73SSzymon Olewniczak } 55e8827d73SSzymon Olewniczak 568a638198SSzymon Olewniczak public function __get($property) { 57ff14b107SSzymon Olewniczak if ($property == 'thread') { 58ff14b107SSzymon Olewniczak if ($this->thread_id == null) { 59ff14b107SSzymon Olewniczak return null; 60ff14b107SSzymon Olewniczak } 61ff14b107SSzymon Olewniczak if ($this->thread == null) { 62ff14b107SSzymon Olewniczak $this->thread = $this->model->threadFactory->get_one($this->thread_id); 63ff14b107SSzymon Olewniczak } 64ff14b107SSzymon Olewniczak return $this->thread; 65ff14b107SSzymon Olewniczak 66ff14b107SSzymon Olewniczak } elseif($property == 'thread_comment') { 67ff14b107SSzymon Olewniczak if ($this->thread_comment_id == null) { 68ff14b107SSzymon Olewniczak return null; 69ff14b107SSzymon Olewniczak } 70ff14b107SSzymon Olewniczak if ($this->thread_comment == null) { 7153df74e7SSzymon Olewniczak $this->thread_comment = $this->model->thread_commentFactory->get_one($this->thread_comment_id); 72ff14b107SSzymon Olewniczak } 73ff14b107SSzymon Olewniczak return $this->thread_comment; 74ff14b107SSzymon Olewniczak 75ff14b107SSzymon Olewniczak } elseif($property == 'priority' || $property == 'coordinator' || $property == 'task_program_name') { 768a638198SSzymon Olewniczak return $this->$property; 778a638198SSzymon Olewniczak } 788a638198SSzymon Olewniczak return parent::__get($property); 798a638198SSzymon Olewniczak } 808a638198SSzymon Olewniczak 818a638198SSzymon Olewniczak public function __construct($model, $defaults=array()) { 828a638198SSzymon Olewniczak parent::__construct($model, $defaults); 838a638198SSzymon Olewniczak 84a0cd8c78SSzymon Olewniczak //virutal ACL columns (not in select) 85a0cd8c78SSzymon Olewniczak $this->acl->add_column('participants'); 86a0cd8c78SSzymon Olewniczak 878a638198SSzymon Olewniczak $this->validator->set_rules(array( 888a638198SSzymon Olewniczak 'assignee' => array(array('dw_user'), 'NOT NULL'), 898a638198SSzymon Olewniczak 'cost' => array(array('numeric'), 'NULL'), 908a638198SSzymon Olewniczak 'plan_date' => array(array('iso_date'), 'NOT NULL'), 918a638198SSzymon Olewniczak 'all_day_event' => array(array('select', array('0', '1')), 'NOT NULL'), 928a638198SSzymon Olewniczak 'start_time' => array(array('time'), 'NULL'), 938a638198SSzymon Olewniczak 'finish_time' => array(array('time'), 'NULL'), 948a638198SSzymon Olewniczak 'content' => array(array('length', 10000), 'NOT NULL'), 95e8827d73SSzymon Olewniczak 'thread_comment_id' => array(array('numeric'), 'NULL'), 968a638198SSzymon Olewniczak 'task_program_id' => array(array('numeric'), 'NULL') 978a638198SSzymon Olewniczak )); 988a638198SSzymon Olewniczak 998a638198SSzymon Olewniczak //we've created empty object 1008a638198SSzymon Olewniczak if ($this->id === NULL) { 1018a638198SSzymon Olewniczak $this->original_poster = $this->model->user_nick; 1028a638198SSzymon Olewniczak $this->create_date = date('c'); 1038a638198SSzymon Olewniczak $this->last_activity_date = $this->create_date; 1048a638198SSzymon Olewniczak $this->last_modification_date = $this->create_date; 1058a638198SSzymon Olewniczak 1068a638198SSzymon Olewniczak $this->state = 'opened'; 1078a638198SSzymon Olewniczak 1088a638198SSzymon Olewniczak if (isset($defaults['thread'])) { 1098a638198SSzymon Olewniczak $this->thread = $defaults['thread']; 1108a638198SSzymon Olewniczak $this->thread_id = $this->thread->id; 11153df74e7SSzymon Olewniczak $this->coordinator = $this->thread->coordinator; 1128a638198SSzymon Olewniczak $this->type = 'correction'; 1138a638198SSzymon Olewniczak 1148a638198SSzymon Olewniczak if (isset($defaults['thread_comment'])) { 1158a638198SSzymon Olewniczak $this->thread_comment = $defaults['thread_comment']; 1168a638198SSzymon Olewniczak $this->thread_comment_id = $this->thread_comment->id; 117e8827d73SSzymon Olewniczak 118e8827d73SSzymon Olewniczak if ($this->thread_comment->type == 'cause_real') { 1198a638198SSzymon Olewniczak $this->type = 'corrective'; 120e8827d73SSzymon Olewniczak } else { 121e8827d73SSzymon Olewniczak $this->type = 'preventive'; 122e8827d73SSzymon Olewniczak } 1238a638198SSzymon Olewniczak } 124ff14b107SSzymon Olewniczak } else { 125ff14b107SSzymon Olewniczak $this->type = 'program'; 1268a638198SSzymon Olewniczak } 127a0cd8c78SSzymon Olewniczak 128a0cd8c78SSzymon Olewniczak //everyone can report their own program tasks 129a0cd8c78SSzymon Olewniczak if ($this->type == 'program') { 130a0cd8c78SSzymon Olewniczak $this->acl->grant('content', BEZ_PERMISSION_CHANGE); 131a0cd8c78SSzymon Olewniczak $this->acl->grant('plan_date', BEZ_PERMISSION_CHANGE); 132a0cd8c78SSzymon Olewniczak $this->acl->grant('start_time', BEZ_PERMISSION_CHANGE); 133a0cd8c78SSzymon Olewniczak $this->acl->grant('finish_time', BEZ_PERMISSION_CHANGE); 134a0cd8c78SSzymon Olewniczak $this->acl->grant('all_day_event', BEZ_PERMISSION_CHANGE); 135a0cd8c78SSzymon Olewniczak $this->acl->grant('task_program_id', BEZ_PERMISSION_CHANGE); 136a0cd8c78SSzymon Olewniczak $this->acl->grant('cost', BEZ_PERMISSION_CHANGE); 137a0cd8c78SSzymon Olewniczak } 138a0cd8c78SSzymon Olewniczak 139a0cd8c78SSzymon Olewniczak if ($this->type == 'program' && $this->model->get_level() >= BEZ_AUTH_LEADER) { 140a0cd8c78SSzymon Olewniczak $this->acl->grant('assignee', BEZ_PERMISSION_CHANGE); 141a0cd8c78SSzymon Olewniczak $this->acl->grant('participants', BEZ_PERMISSION_CHANGE); 142a0cd8c78SSzymon Olewniczak } 143a0cd8c78SSzymon Olewniczak 144a0cd8c78SSzymon Olewniczak if ($this->type != 'program' && $this->coordinator == $this->model->user_nick) { 145a0cd8c78SSzymon Olewniczak $this->acl->grant('content', BEZ_PERMISSION_CHANGE); 146a0cd8c78SSzymon Olewniczak $this->acl->grant('plan_date', BEZ_PERMISSION_CHANGE); 147a0cd8c78SSzymon Olewniczak $this->acl->grant('start_time', BEZ_PERMISSION_CHANGE); 148a0cd8c78SSzymon Olewniczak $this->acl->grant('finish_time', BEZ_PERMISSION_CHANGE); 149a0cd8c78SSzymon Olewniczak $this->acl->grant('all_day_event', BEZ_PERMISSION_CHANGE); 150a0cd8c78SSzymon Olewniczak $this->acl->grant('task_program_id', BEZ_PERMISSION_CHANGE); 151a0cd8c78SSzymon Olewniczak $this->acl->grant('cost', BEZ_PERMISSION_CHANGE); 152a0cd8c78SSzymon Olewniczak 153a0cd8c78SSzymon Olewniczak $this->acl->grant('assignee', BEZ_PERMISSION_CHANGE); 154a0cd8c78SSzymon Olewniczak $this->acl->grant('participants', BEZ_PERMISSION_CHANGE); 155a0cd8c78SSzymon Olewniczak } 156a0cd8c78SSzymon Olewniczak 157e8827d73SSzymon Olewniczak //we get object form db 158e8827d73SSzymon Olewniczak } else { 159e8827d73SSzymon Olewniczak if (isset($defaults['thread']) && $this->thread_id == $defaults['thread']->id) { 160e8827d73SSzymon Olewniczak $this->thread = $defaults['thread']; 161e8827d73SSzymon Olewniczak } 162e8827d73SSzymon Olewniczak 163e8827d73SSzymon Olewniczak if (isset($defaults['thread_comment']) && $this->thread_comment_id == $defaults['thread_comment']->id) { 164e8827d73SSzymon Olewniczak $this->thread_comment = $defaults['thread_comment']; 165e8827d73SSzymon Olewniczak } 166e8827d73SSzymon Olewniczak 167a0cd8c78SSzymon Olewniczak //user can close their tasks 168a0cd8c78SSzymon Olewniczak if ($this->assignee == $this->model->user_nick || $this->model->get_level() >= BEZ_AUTH_LEADER) { 169a0cd8c78SSzymon Olewniczak $this->acl->grant('state', BEZ_PERMISSION_CHANGE); 170a0cd8c78SSzymon Olewniczak } 171a0cd8c78SSzymon Olewniczak 172a0cd8c78SSzymon Olewniczak if ($this->type == 'program' && $this->original_poster == $this->model->user_nick) { 173a0cd8c78SSzymon Olewniczak $this->acl->grant('content', BEZ_PERMISSION_CHANGE); 174a0cd8c78SSzymon Olewniczak $this->acl->grant('plan_date', BEZ_PERMISSION_CHANGE); 175a0cd8c78SSzymon Olewniczak $this->acl->grant('start_time', BEZ_PERMISSION_CHANGE); 176a0cd8c78SSzymon Olewniczak $this->acl->grant('finish_time', BEZ_PERMISSION_CHANGE); 177a0cd8c78SSzymon Olewniczak $this->acl->grant('all_day_event', BEZ_PERMISSION_CHANGE); 178a0cd8c78SSzymon Olewniczak $this->acl->grant('task_program_id', BEZ_PERMISSION_CHANGE); 179a0cd8c78SSzymon Olewniczak $this->acl->grant('cost', BEZ_PERMISSION_CHANGE); 180a0cd8c78SSzymon Olewniczak } 181a0cd8c78SSzymon Olewniczak 182a0cd8c78SSzymon Olewniczak if (($this->type != 'program' && $this->coordinator == $this->model->user_nick) || 183a0cd8c78SSzymon Olewniczak ($this->model->get_level() >= BEZ_AUTH_LEADER)) { 184a0cd8c78SSzymon Olewniczak $this->acl->grant('content', BEZ_PERMISSION_CHANGE); 185a0cd8c78SSzymon Olewniczak $this->acl->grant('plan_date', BEZ_PERMISSION_CHANGE); 186a0cd8c78SSzymon Olewniczak $this->acl->grant('start_time', BEZ_PERMISSION_CHANGE); 187a0cd8c78SSzymon Olewniczak $this->acl->grant('finish_time', BEZ_PERMISSION_CHANGE); 188a0cd8c78SSzymon Olewniczak $this->acl->grant('all_day_event', BEZ_PERMISSION_CHANGE); 189a0cd8c78SSzymon Olewniczak $this->acl->grant('task_program_id', BEZ_PERMISSION_CHANGE); 190a0cd8c78SSzymon Olewniczak $this->acl->grant('cost', BEZ_PERMISSION_CHANGE); 191a0cd8c78SSzymon Olewniczak 192a0cd8c78SSzymon Olewniczak $this->acl->grant('assignee', BEZ_PERMISSION_CHANGE); 193a0cd8c78SSzymon Olewniczak $this->acl->grant('participants', BEZ_PERMISSION_CHANGE); 194f7519ef1SSzymon Olewniczak $this->acl->grant('state', BEZ_PERMISSION_CHANGE); 195a0cd8c78SSzymon Olewniczak } 196e8827d73SSzymon Olewniczak } 1978a638198SSzymon Olewniczak 1988a638198SSzymon Olewniczak if ($this->thread_id == '') { 1998a638198SSzymon Olewniczak $this->validator->set_rules(array( 200e8827d73SSzymon Olewniczak 'task_program_id' => array(array('numeric'), 'NOT NULL'), 2018a638198SSzymon Olewniczak )); 202e8827d73SSzymon Olewniczak //this field is unused in program tasks 203e8827d73SSzymon Olewniczak $this->validator->delete_rule('thread_comment_id'); 2048a638198SSzymon Olewniczak } 2058a638198SSzymon Olewniczak } 2068a638198SSzymon Olewniczak 207*14a1f0a4SSzymon Olewniczak public function update_virutal() { 208*14a1f0a4SSzymon Olewniczak if ($this->state == 'done') { 209*14a1f0a4SSzymon Olewniczak $this->priority = ''; 210*14a1f0a4SSzymon Olewniczak } else { 211*14a1f0a4SSzymon Olewniczak $now = date('Y-m-d'); 212*14a1f0a4SSzymon Olewniczak $plus_1_month = date('Y-m-d', strtotime('+1 month')); 213*14a1f0a4SSzymon Olewniczak 214*14a1f0a4SSzymon Olewniczak if ($this->plan_date >= $plus_1_month) { 215*14a1f0a4SSzymon Olewniczak $this->priority = '0'; 216*14a1f0a4SSzymon Olewniczak } elseif ($this->plan_date >= $now) { 217*14a1f0a4SSzymon Olewniczak $this->priority = '1'; 218*14a1f0a4SSzymon Olewniczak } else { 219*14a1f0a4SSzymon Olewniczak $this->priority = '2'; 220*14a1f0a4SSzymon Olewniczak } 221*14a1f0a4SSzymon Olewniczak } 222*14a1f0a4SSzymon Olewniczak } 2238a638198SSzymon Olewniczak 2248a638198SSzymon Olewniczak public function set_data($post, $filter=NULL) { 225ff14b107SSzymon Olewniczak //all day event 226ff14b107SSzymon Olewniczak if (!isset($post['all_day_event'])) { 227ff14b107SSzymon Olewniczak $post['all_day_event'] = '0'; 228ff14b107SSzymon Olewniczak } 229ff14b107SSzymon Olewniczak 23053df74e7SSzymon Olewniczak parent::set_data($post); 23153df74e7SSzymon Olewniczak 23253df74e7SSzymon Olewniczak $this->content_html = p_render('xhtml',p_get_instructions($this->content), $ignore); 23353df74e7SSzymon Olewniczak 23453df74e7SSzymon Olewniczak if (!isset($post['assignee'])) { 23553df74e7SSzymon Olewniczak $this->assignee = $this->model->user_nick; 23653df74e7SSzymon Olewniczak } 23753df74e7SSzymon Olewniczak 23853df74e7SSzymon Olewniczak //update dates 23953df74e7SSzymon Olewniczak $this->last_modification_date = date('c'); 24053df74e7SSzymon Olewniczak $this->last_activity_date = $this->last_modification_date; 24153df74e7SSzymon Olewniczak 242*14a1f0a4SSzymon Olewniczak //update virtual 243*14a1f0a4SSzymon Olewniczak $this->update_virutal(); 244*14a1f0a4SSzymon Olewniczak 2458a638198SSzymon Olewniczak return true; 2468a638198SSzymon Olewniczak } 2478a638198SSzymon Olewniczak 248e8827d73SSzymon Olewniczak public function set_state($state) { 249e8827d73SSzymon Olewniczak if ($this->acl_of('state') < BEZ_PERMISSION_CHANGE) { 250e8827d73SSzymon Olewniczak throw new PermissionDeniedException(); 251e8827d73SSzymon Olewniczak } 252e8827d73SSzymon Olewniczak 253e8827d73SSzymon Olewniczak if (!in_array($state, array('opened', 'done'))) { 254e8827d73SSzymon Olewniczak throw new ValidationException('task', array('sholud be opened or done')); 255e8827d73SSzymon Olewniczak } 256e8827d73SSzymon Olewniczak 257e8827d73SSzymon Olewniczak //nothing to do 258e8827d73SSzymon Olewniczak if ($state == $this->state) { 259e8827d73SSzymon Olewniczak return; 260e8827d73SSzymon Olewniczak } 261e8827d73SSzymon Olewniczak 262e8827d73SSzymon Olewniczak if ($state == 'done') { 263e8827d73SSzymon Olewniczak $this->model->sqlite->query("UPDATE {$this->get_table_name()} SET state=?, closed_by=?, close_date=? WHERE id=?", 264e8827d73SSzymon Olewniczak $state, 265e8827d73SSzymon Olewniczak $this->model->user_nick, 266e8827d73SSzymon Olewniczak date('c'), 267e8827d73SSzymon Olewniczak $this->id); 268e8827d73SSzymon Olewniczak //reopen the task 269e8827d73SSzymon Olewniczak } else { 270e8827d73SSzymon Olewniczak $this->model->sqlite->query("UPDATE {$this->get_table_name()} SET state=? WHERE id=?", $state, $this->id); 271e8827d73SSzymon Olewniczak } 272e8827d73SSzymon Olewniczak 273e8827d73SSzymon Olewniczak $this->state = $state; 274e8827d73SSzymon Olewniczak } 275e8827d73SSzymon Olewniczak 276e8827d73SSzymon Olewniczak public function update_last_activity() { 277e8827d73SSzymon Olewniczak $this->last_activity_date = date('c'); 278e8827d73SSzymon Olewniczak $this->model->sqlite->query('UPDATE task SET last_activity_date=? WHERE id=?', 279e8827d73SSzymon Olewniczak $this->last_activity_date, $this->id); 280e8827d73SSzymon Olewniczak } 281e8827d73SSzymon Olewniczak 282f7519ef1SSzymon Olewniczak public function can_add_comments() { 283f7519ef1SSzymon Olewniczak if ($this->thread_id != '' && $this->thread->state == 'closed') { 284f7519ef1SSzymon Olewniczak return false; 285f7519ef1SSzymon Olewniczak } 286f7519ef1SSzymon Olewniczak 287f7519ef1SSzymon Olewniczak if ($this->state == 'opened' || 288f7519ef1SSzymon Olewniczak ($this->state == 'done' && 289f7519ef1SSzymon Olewniczak $this->acl_of('state') >= BEZ_PERMISSION_CHANGE)) { 290f7519ef1SSzymon Olewniczak return true; 291f7519ef1SSzymon Olewniczak } 292f7519ef1SSzymon Olewniczak 293f7519ef1SSzymon Olewniczak return false; 294f7519ef1SSzymon Olewniczak } 295f7519ef1SSzymon Olewniczak 296a0cd8c78SSzymon Olewniczak public function can_add_participants() { 297a0cd8c78SSzymon Olewniczak return in_array($this->state, array('opened')); 298a0cd8c78SSzymon Olewniczak } 299a0cd8c78SSzymon Olewniczak 300e8827d73SSzymon Olewniczak public function get_participants($filter='') { 301e8827d73SSzymon Olewniczak if ($this->id === NULL) { 302e8827d73SSzymon Olewniczak return array(); 303e8827d73SSzymon Olewniczak } 304e8827d73SSzymon Olewniczak 305e8827d73SSzymon Olewniczak $sql = 'SELECT * FROM task_participant WHERE'; 306e8827d73SSzymon Olewniczak $possible_flags = array('original_poster', 'assignee', 'commentator', 'subscribent'); 307e8827d73SSzymon Olewniczak if ($filter != '') { 308e8827d73SSzymon Olewniczak if (!in_array($filter, $possible_flags)) { 309e8827d73SSzymon Olewniczak throw new \Exception("unknown flag $filter"); 310e8827d73SSzymon Olewniczak } 311e8827d73SSzymon Olewniczak $sql .= " $filter=1 AND"; 312e8827d73SSzymon Olewniczak } 313e8827d73SSzymon Olewniczak $sql .= ' task_id=? ORDER BY user_id'; 314e8827d73SSzymon Olewniczak 315e8827d73SSzymon Olewniczak $r = $this->model->sqlite->query($sql, $this->id); 316e8827d73SSzymon Olewniczak $pars = $this->model->sqlite->res2arr($r); 317e8827d73SSzymon Olewniczak $participants = array(); 318e8827d73SSzymon Olewniczak foreach ($pars as $par) { 319e8827d73SSzymon Olewniczak $participants[$par['user_id']] = $par; 320e8827d73SSzymon Olewniczak } 321e8827d73SSzymon Olewniczak 322e8827d73SSzymon Olewniczak return $participants; 323e8827d73SSzymon Olewniczak } 324e8827d73SSzymon Olewniczak 325e8827d73SSzymon Olewniczak public function get_participant($user_id) { 326e8827d73SSzymon Olewniczak if ($this->id === NULL) { 327e8827d73SSzymon Olewniczak return array(); 328e8827d73SSzymon Olewniczak } 329e8827d73SSzymon Olewniczak 330e8827d73SSzymon Olewniczak $r = $this->model->sqlite->query('SELECT * FROM task_participant WHERE task_id=? AND user_id=?', $this->id, $user_id); 331e8827d73SSzymon Olewniczak $par = $this->model->sqlite->res2row($r); 332e8827d73SSzymon Olewniczak if (!is_array($par)) { 333e8827d73SSzymon Olewniczak return false; 334e8827d73SSzymon Olewniczak } 335e8827d73SSzymon Olewniczak 336e8827d73SSzymon Olewniczak return $par; 337e8827d73SSzymon Olewniczak } 338e8827d73SSzymon Olewniczak 339e8827d73SSzymon Olewniczak public function is_subscribent($user_id=null) { 340e8827d73SSzymon Olewniczak if ($user_id == null) { 341e8827d73SSzymon Olewniczak $user_id = $this->model->user_nick; 342e8827d73SSzymon Olewniczak } 343e8827d73SSzymon Olewniczak $par = $this->get_participant($user_id); 344e8827d73SSzymon Olewniczak if ($par['subscribent'] == 1) { 345e8827d73SSzymon Olewniczak return true; 346e8827d73SSzymon Olewniczak } 347e8827d73SSzymon Olewniczak return false; 348e8827d73SSzymon Olewniczak } 349e8827d73SSzymon Olewniczak 350e8827d73SSzymon Olewniczak public function remove_participant_flags($user_id, $flags) { 351e8827d73SSzymon Olewniczak //thread not saved yet 352e8827d73SSzymon Olewniczak if ($this->id === NULL) { 353e8827d73SSzymon Olewniczak throw new \Exception('cannot remove flags from not saved thread'); 354e8827d73SSzymon Olewniczak } 355e8827d73SSzymon Olewniczak 356e8827d73SSzymon Olewniczak $possible_flags = array('original_poster', 'assignee', 'commentator', 'subscribent'); 357e8827d73SSzymon Olewniczak if (array_intersect($flags, $possible_flags) != $flags) { 358e8827d73SSzymon Olewniczak throw new \Exception('unknown flags'); 359e8827d73SSzymon Olewniczak } 360e8827d73SSzymon Olewniczak 361e8827d73SSzymon Olewniczak $set = implode(',', array_map(function ($v) { return "$v=0"; }, $flags)); 362e8827d73SSzymon Olewniczak 363e8827d73SSzymon Olewniczak $sql = "UPDATE task_participant SET $set WHERE task_id=? AND user_id=?"; 364e8827d73SSzymon Olewniczak $this->model->sqlite->query($sql, $this->id, $user_id); 365e8827d73SSzymon Olewniczak 366e8827d73SSzymon Olewniczak } 367e8827d73SSzymon Olewniczak 368e8827d73SSzymon Olewniczak public function set_participant_flags($user_id, $flags=array()) { 369e8827d73SSzymon Olewniczak //thread not saved yet 370e8827d73SSzymon Olewniczak if ($this->id === NULL) { 371e8827d73SSzymon Olewniczak throw new \Exception('cannot add flags to not saved thread'); 372e8827d73SSzymon Olewniczak } 373e8827d73SSzymon Olewniczak 374e8827d73SSzymon Olewniczak //validate user 375e8827d73SSzymon Olewniczak if (!$this->model->userFactory->exists($user_id)) { 376e8827d73SSzymon Olewniczak throw new \Exception("$user_id isn't dokuwiki user"); 377e8827d73SSzymon Olewniczak } 378e8827d73SSzymon Olewniczak 379e8827d73SSzymon Olewniczak $possible_flags = array('original_poster', 'assignee', 'commentator', 'subscribent'); 380e8827d73SSzymon Olewniczak if (array_intersect($flags, $possible_flags) != $flags) { 381e8827d73SSzymon Olewniczak throw new \Exception('unknown flags'); 382e8827d73SSzymon Olewniczak } 383e8827d73SSzymon Olewniczak 384e8827d73SSzymon Olewniczak $participant = $this->get_participant($user_id); 385e8827d73SSzymon Olewniczak if ($participant == false) { 386e8827d73SSzymon Olewniczak $participant = array_fill_keys($possible_flags, 0); 387e8827d73SSzymon Olewniczak 388e8827d73SSzymon Olewniczak $participant['task_id'] = $this->id; 389e8827d73SSzymon Olewniczak $participant['user_id'] = $user_id; 390e8827d73SSzymon Olewniczak $participant['added_by'] = $this->model->user_nick; 391e8827d73SSzymon Olewniczak $participant['added_date'] = date('c'); 392e8827d73SSzymon Olewniczak } 393e8827d73SSzymon Olewniczak $values = array_merge($participant, array_fill_keys($flags, 1)); 394e8827d73SSzymon Olewniczak 395e8827d73SSzymon Olewniczak $keys = join(',', array_keys($values)); 396e8827d73SSzymon Olewniczak $vals = join(',', array_fill(0,count($values),'?')); 397e8827d73SSzymon Olewniczak 398e8827d73SSzymon Olewniczak $sql = "REPLACE INTO task_participant ($keys) VALUES ($vals)"; 399e8827d73SSzymon Olewniczak $this->model->sqlite->query($sql, array_values($values)); 400e8827d73SSzymon Olewniczak } 401e8827d73SSzymon Olewniczak 402e8827d73SSzymon Olewniczak public function invite($client) { 403e8827d73SSzymon Olewniczak $this->set_participant_flags($client, array('subscribent')); 404e8827d73SSzymon Olewniczak $this->mail_notify_invite($client); 405e8827d73SSzymon Olewniczak } 406e8827d73SSzymon Olewniczak 407*14a1f0a4SSzymon Olewniczak public function mail_notify($content, $users=false, $attachedImages=array()) { 408e8827d73SSzymon Olewniczak $mailer = new Mailer(); 409*14a1f0a4SSzymon Olewniczak $mailer->setBody($content, array(), array(), $content, false); 4108a638198SSzymon Olewniczak 4118a638198SSzymon Olewniczak if ($users === FALSE) { 412e8827d73SSzymon Olewniczak $users = $this->get_participants('subscribent'); 4138a638198SSzymon Olewniczak 4148a638198SSzymon Olewniczak //don't notify current user 4158a638198SSzymon Olewniczak unset($users[$this->model->user_nick]); 4168a638198SSzymon Olewniczak } 4178a638198SSzymon Olewniczak 4188a638198SSzymon Olewniczak $emails = array_map(function($user) { 41920e189b9SSzymon Olewniczak if (is_array($user)) { 42020e189b9SSzymon Olewniczak $user = $user['user_id']; 42120e189b9SSzymon Olewniczak } 42220e189b9SSzymon Olewniczak return $this->model->userFactory->get_user_email($user); 4238a638198SSzymon Olewniczak }, $users); 4248a638198SSzymon Olewniczak 4258a638198SSzymon Olewniczak $mailer->to($emails); 426*14a1f0a4SSzymon Olewniczak $mailer->subject('#z'.$this->id. ' ' . $this->task_program_name); 4278a638198SSzymon Olewniczak 428a0cd8c78SSzymon Olewniczak //add images 429a0cd8c78SSzymon Olewniczak foreach ($attachedImages as $img) { 430a0cd8c78SSzymon Olewniczak $mailer->attachFile($img['path'], $img['mime'], $img['name'], $img['embed']); 431a0cd8c78SSzymon Olewniczak } 432a0cd8c78SSzymon Olewniczak 4338a638198SSzymon Olewniczak $send = $mailer->send(); 4348a638198SSzymon Olewniczak if ($send === false) { 4358a638198SSzymon Olewniczak //this may mean empty $emails 4368a638198SSzymon Olewniczak //throw new Exception("can't send email"); 4378a638198SSzymon Olewniczak } 4388a638198SSzymon Olewniczak } 4398a638198SSzymon Olewniczak 440*14a1f0a4SSzymon Olewniczak public function mail_task_box(&$attachedImages) { 441*14a1f0a4SSzymon Olewniczak $tpl = $this->model->action->get_tpl(); 442*14a1f0a4SSzymon Olewniczak 443*14a1f0a4SSzymon Olewniczak //render style 444*14a1f0a4SSzymon Olewniczak $less = new \lessc(); 445*14a1f0a4SSzymon Olewniczak $less->addImportDir(DOKU_PLUGIN . 'bez/style/'); 446*14a1f0a4SSzymon Olewniczak $style = $less->compileFile(DOKU_PLUGIN . 'bez/style/task.less'); 447*14a1f0a4SSzymon Olewniczak 448*14a1f0a4SSzymon Olewniczak //render content for mail 449*14a1f0a4SSzymon Olewniczak $old_content_html = $this->content_html; 450*14a1f0a4SSzymon Olewniczak $this->content_html = p_render('bez_xhtmlmail', p_get_instructions($this->content), $info); 451*14a1f0a4SSzymon Olewniczak $attachedImages = array_merge($attachedImages, $info['img']); 452*14a1f0a4SSzymon Olewniczak 453*14a1f0a4SSzymon Olewniczak $tpl->set('task', $this); 454*14a1f0a4SSzymon Olewniczak $tpl->set('style', $style); 455*14a1f0a4SSzymon Olewniczak $tpl->set('no_actions', true); 456*14a1f0a4SSzymon Olewniczak $task_box = $this->model->action->bez_tpl_include('task_box', true); 457*14a1f0a4SSzymon Olewniczak 458*14a1f0a4SSzymon Olewniczak $this->content_html = $old_content_html; 459*14a1f0a4SSzymon Olewniczak 460*14a1f0a4SSzymon Olewniczak return $task_box; 461e8827d73SSzymon Olewniczak } 462e8827d73SSzymon Olewniczak 463*14a1f0a4SSzymon Olewniczak public function mail_task(&$attachedImages) { 464*14a1f0a4SSzymon Olewniczak $tpl = $this->model->action->get_tpl(); 465*14a1f0a4SSzymon Olewniczak 466*14a1f0a4SSzymon Olewniczak $task_box = $this->mail_task_box($attachedImages); 467*14a1f0a4SSzymon Olewniczak $tpl->set('content', $task_box); 468*14a1f0a4SSzymon Olewniczak $content = $this->model->action->bez_tpl_include('mail/task', true); 469*14a1f0a4SSzymon Olewniczak 470*14a1f0a4SSzymon Olewniczak return $content; 471e8827d73SSzymon Olewniczak } 472e8827d73SSzymon Olewniczak 473*14a1f0a4SSzymon Olewniczak public function mail_notify_assignee() { 474*14a1f0a4SSzymon Olewniczak $tpl = $this->model->action->get_tpl(); 475e8827d73SSzymon Olewniczak 476*14a1f0a4SSzymon Olewniczak //we don't want who 477*14a1f0a4SSzymon Olewniczak $tpl->set('who', $this->model->user_nick); 478*14a1f0a4SSzymon Olewniczak $tpl->set('action', 'mail_task_assignee'); 479*14a1f0a4SSzymon Olewniczak $attachedImages = array(); 480*14a1f0a4SSzymon Olewniczak $content = $this->mail_task($attachedImages); 481*14a1f0a4SSzymon Olewniczak $this->mail_notify($content, array($this->assignee), $attachedImages); 4828a638198SSzymon Olewniczak } 4838a638198SSzymon Olewniczak 4848a638198SSzymon Olewniczak public function mail_notify_remind($users=false) { 485*14a1f0a4SSzymon Olewniczak $tpl = $this->model->action->get_tpl(); 4868a638198SSzymon Olewniczak 487*14a1f0a4SSzymon Olewniczak //we don't want who 488*14a1f0a4SSzymon Olewniczak $tpl->set('who', ''); 489*14a1f0a4SSzymon Olewniczak $tpl->set('action', 'mail_task_remind'); 490*14a1f0a4SSzymon Olewniczak $attachedImages = array(); 491*14a1f0a4SSzymon Olewniczak $content = $this->mail_task($attachedImages); 492*14a1f0a4SSzymon Olewniczak $this->mail_notify($content, $users, $attachedImages); 4938a638198SSzymon Olewniczak } 4948a638198SSzymon Olewniczak 4958a638198SSzymon Olewniczak public function mail_notify_invite($client) { 4968a638198SSzymon Olewniczak $users = array($client); 497*14a1f0a4SSzymon Olewniczak $tpl = $this->model->action->get_tpl(); 498*14a1f0a4SSzymon Olewniczak 499*14a1f0a4SSzymon Olewniczak //we don't want who 500*14a1f0a4SSzymon Olewniczak $tpl->set('who', $this->model->user_nick); 501*14a1f0a4SSzymon Olewniczak $tpl->set('action', 'mail_task_invite'); 502*14a1f0a4SSzymon Olewniczak $attachedImages = array(); 503*14a1f0a4SSzymon Olewniczak $content = $this->mail_task($attachedImages); 504*14a1f0a4SSzymon Olewniczak $this->mail_notify($content, $users, $attachedImages); 5058a638198SSzymon Olewniczak } 506*14a1f0a4SSzymon Olewniczak 507*14a1f0a4SSzymon Olewniczak public function mail_notify_change_state($action='') { 508*14a1f0a4SSzymon Olewniczak $tpl = $this->model->action->get_tpl(); 509*14a1f0a4SSzymon Olewniczak 510*14a1f0a4SSzymon Olewniczak $tpl->set('who', $this->model->user_nick); 511*14a1f0a4SSzymon Olewniczak $tpl->set('action', $action); 512*14a1f0a4SSzymon Olewniczak $attachedImages = array(); 513*14a1f0a4SSzymon Olewniczak $content = $this->mail_task($attachedImages); 514*14a1f0a4SSzymon Olewniczak $this->mail_notify($content, false, $attachedImages); 515*14a1f0a4SSzymon Olewniczak } 516*14a1f0a4SSzymon Olewniczak 5178a638198SSzymon Olewniczak} 518