1*8a638198SSzymon Olewniczak<?php 2*8a638198SSzymon Olewniczak 3*8a638198SSzymon Olewniczak/* 4*8a638198SSzymon Olewniczak * Task coordinator is taken from tasktypes 5*8a638198SSzymon Olewniczak */ 6*8a638198SSzymon Olewniczak//require_once 'entity.php'; 7*8a638198SSzymon Olewniczak// 8*8a638198SSzymon Olewniczak//class BEZ_mdl_Dummy_Task extends BEZ_mdl_Entity { 9*8a638198SSzymon Olewniczak// protected $coordinator; 10*8a638198SSzymon Olewniczak// 11*8a638198SSzymon Olewniczak// function __construct($model, $defaults=array()) { 12*8a638198SSzymon Olewniczak// parent::__construct($model); 13*8a638198SSzymon Olewniczak// 14*8a638198SSzymon Olewniczak// if (isset($defaults['issue'])) { 15*8a638198SSzymon Olewniczak// $issue = $this->model->issues->get_one($defaults['issue']); 16*8a638198SSzymon Olewniczak// $this->coordinator = $issue->coordinator; 17*8a638198SSzymon Olewniczak// } else { 18*8a638198SSzymon Olewniczak// $this->coordinator = ''; 19*8a638198SSzymon Olewniczak// } 20*8a638198SSzymon Olewniczak// } 21*8a638198SSzymon Olewniczak// 22*8a638198SSzymon Olewniczak// public function __get($property) { 23*8a638198SSzymon Olewniczak// if ($property === 'coordinator') { 24*8a638198SSzymon Olewniczak// return $this->coordinator; 25*8a638198SSzymon Olewniczak// } 26*8a638198SSzymon Olewniczak// parent::__get($property); 27*8a638198SSzymon Olewniczak// } 28*8a638198SSzymon Olewniczak//} 29*8a638198SSzymon Olewniczak 30*8a638198SSzymon Olewniczaknamespace dokuwiki\plugin\bez\mdl; 31*8a638198SSzymon Olewniczak 32*8a638198SSzymon Olewniczakuse dokuwiki\plugin\bez\meta\Mailer; 33*8a638198SSzymon Olewniczakuse dokuwiki\plugin\bez\meta\PermissionDeniedException; 34*8a638198SSzymon Olewniczakuse dokuwiki\plugin\bez\meta\ValidationException; 35*8a638198SSzymon Olewniczak 36*8a638198SSzymon Olewniczakclass Task extends Entity { 37*8a638198SSzymon Olewniczak 38*8a638198SSzymon Olewniczak protected $id; 39*8a638198SSzymon Olewniczak 40*8a638198SSzymon Olewniczak protected $original_poster, $assignee; 41*8a638198SSzymon Olewniczak 42*8a638198SSzymon Olewniczak protected $private, $lock; 43*8a638198SSzymon Olewniczak 44*8a638198SSzymon Olewniczak protected $state, $type; 45*8a638198SSzymon Olewniczak 46*8a638198SSzymon Olewniczak protected $create_date, $last_activity_date, $last_modification_date, $close_date; 47*8a638198SSzymon Olewniczak 48*8a638198SSzymon Olewniczak protected $cost, $plan_date, $all_day_event, $start_time, $finish_time; 49*8a638198SSzymon Olewniczak 50*8a638198SSzymon Olewniczak protected $content, $content_html; 51*8a638198SSzymon Olewniczak 52*8a638198SSzymon Olewniczak protected $thread_id, $thread_comment_id, $task_program_id; 53*8a638198SSzymon Olewniczak 54*8a638198SSzymon Olewniczak /** @var \dokuwiki\plugin\bez\mdl\Thread */ 55*8a638198SSzymon Olewniczak protected $thread; 56*8a638198SSzymon Olewniczak 57*8a638198SSzymon Olewniczak /** @var Thread_comment */ 58*8a638198SSzymon Olewniczak protected $thread_comment; 59*8a638198SSzymon Olewniczak 60*8a638198SSzymon Olewniczak //virtual 61*8a638198SSzymon Olewniczak protected $task_program_name; 62*8a638198SSzymon Olewniczak 63*8a638198SSzymon Olewniczak public static function get_columns() { 64*8a638198SSzymon Olewniczak return array('id', 65*8a638198SSzymon Olewniczak 'original_poster', 'assignee', 66*8a638198SSzymon Olewniczak 'private', 'lock', 67*8a638198SSzymon Olewniczak 'state', 'type', 68*8a638198SSzymon Olewniczak 'create_date', 'last_activity_date', 'last_modification_date', 'close_date', 69*8a638198SSzymon Olewniczak 'cost', 'plan_date', 'all_day_event', 'start_time', 'finish_time', 70*8a638198SSzymon Olewniczak 'content', 'content_html', 71*8a638198SSzymon Olewniczak 'thread_id', 'thread_comment_id', 'task_program_id'); 72*8a638198SSzymon Olewniczak } 73*8a638198SSzymon Olewniczak 74*8a638198SSzymon Olewniczak public function __get($property) { 75*8a638198SSzymon Olewniczak if ($property == 'thread' || $property == 'thread_comment' || $property == 'task_program_name') { 76*8a638198SSzymon Olewniczak return $this->$property; 77*8a638198SSzymon Olewniczak } 78*8a638198SSzymon Olewniczak return parent::__get($property); 79*8a638198SSzymon Olewniczak } 80*8a638198SSzymon Olewniczak 81*8a638198SSzymon Olewniczak 82*8a638198SSzymon Olewniczak// private function state_string() { 83*8a638198SSzymon Olewniczak// switch($this->state) { 84*8a638198SSzymon Olewniczak// case '0': return 'task_opened'; 85*8a638198SSzymon Olewniczak// case '-outdated': return 'task_outdated'; 86*8a638198SSzymon Olewniczak// case '1': return 'task_done'; 87*8a638198SSzymon Olewniczak// case '2': return 'task_rejected'; 88*8a638198SSzymon Olewniczak// } 89*8a638198SSzymon Olewniczak// } 90*8a638198SSzymon Olewniczak// 91*8a638198SSzymon Olewniczak// private function action_string() { 92*8a638198SSzymon Olewniczak// switch($this->action) { 93*8a638198SSzymon Olewniczak// case '0': return 'correction'; 94*8a638198SSzymon Olewniczak// case '1': return 'corrective_action'; 95*8a638198SSzymon Olewniczak// case '2': return 'preventive_action'; 96*8a638198SSzymon Olewniczak// case '3': return 'programme'; 97*8a638198SSzymon Olewniczak// } 98*8a638198SSzymon Olewniczak// } 99*8a638198SSzymon Olewniczak// 100*8a638198SSzymon Olewniczak// public function cost_localized() { 101*8a638198SSzymon Olewniczak// if ($this->cost === '') { 102*8a638198SSzymon Olewniczak// return ''; 103*8a638198SSzymon Olewniczak// } 104*8a638198SSzymon Olewniczak// 105*8a638198SSzymon Olewniczak// return sprintf('%.2f', (float)$this->cost); 106*8a638198SSzymon Olewniczak// } 107*8a638198SSzymon Olewniczak// 108*8a638198SSzymon Olewniczak// private function update_virtual_columns() { 109*8a638198SSzymon Olewniczak// $this->state_string = $this->model->action->getLang($this->state_string()); 110*8a638198SSzymon Olewniczak// $this->action_string = $this->model->action->getLang($this->action_string()); 111*8a638198SSzymon Olewniczak// $this->tasktype_string = $this->model->tasktypes->get_one($this->tasktype)->type; 112*8a638198SSzymon Olewniczak// } 113*8a638198SSzymon Olewniczak// 114*8a638198SSzymon Olewniczak// public function user_is_executor() { 115*8a638198SSzymon Olewniczak// if ($this->executor === $this->model->user_nick || 116*8a638198SSzymon Olewniczak// $this->model->acl->get_level() >= BEZ_AUTH_ADMIN) { 117*8a638198SSzymon Olewniczak// return true; 118*8a638198SSzymon Olewniczak// } 119*8a638198SSzymon Olewniczak// } 120*8a638198SSzymon Olewniczak 121*8a638198SSzymon Olewniczak //by defaults you can set: cause, tasktype and issue 122*8a638198SSzymon Olewniczak //tasktype is required 123*8a638198SSzymon Olewniczak public function __construct($model, $defaults=array()) { 124*8a638198SSzymon Olewniczak parent::__construct($model, $defaults); 125*8a638198SSzymon Olewniczak 126*8a638198SSzymon Olewniczak 127*8a638198SSzymon Olewniczak //array(filter, NULL) 128*8a638198SSzymon Olewniczak $this->validator->set_rules(array( 129*8a638198SSzymon Olewniczak// 'reporter' => array(array('dw_user'), 'NOT NULL'), 130*8a638198SSzymon Olewniczak// 'date' => array(array('unix_timestamp'), 'NOT NULL'), 131*8a638198SSzymon Olewniczak// 'close_date' => array(array('unix_timestamp'), 'NULL'), 132*8a638198SSzymon Olewniczak// 'cause' => array(array('numeric'), 'NULL'), 133*8a638198SSzymon Olewniczak 134*8a638198SSzymon Olewniczak// 'executor' => array(array('dw_user'), 'NOT NULL'), 135*8a638198SSzymon Olewniczak 136*8a638198SSzymon Olewniczak// 'issue' => array(array('numeric'), 'NULL'), 137*8a638198SSzymon Olewniczak 138*8a638198SSzymon Olewniczak 'assignee' => array(array('dw_user'), 'NOT NULL'), 139*8a638198SSzymon Olewniczak 'cost' => array(array('numeric'), 'NULL'), 140*8a638198SSzymon Olewniczak 'plan_date' => array(array('iso_date'), 'NOT NULL'), 141*8a638198SSzymon Olewniczak 'all_day_event' => array(array('select', array('0', '1')), 'NOT NULL'), 142*8a638198SSzymon Olewniczak 'start_time' => array(array('time'), 'NULL'), 143*8a638198SSzymon Olewniczak 'finish_time' => array(array('time'), 'NULL'), 144*8a638198SSzymon Olewniczak 'content' => array(array('length', 10000), 'NOT NULL'), 145*8a638198SSzymon Olewniczak 'task_program_id' => array(array('numeric'), 'NULL') 146*8a638198SSzymon Olewniczak 147*8a638198SSzymon Olewniczak// 'state' => array(array('select', array('0', '1', '2')), 'NULL'), 148*8a638198SSzymon Olewniczak// 'reason' => array(array('length', 10000), 'NULL'), 149*8a638198SSzymon Olewniczak 150*8a638198SSzymon Olewniczak// 'coordinator' => array(array('dw_user', array('-none')), 'NOT NULL'), 151*8a638198SSzymon Olewniczak )); 152*8a638198SSzymon Olewniczak 153*8a638198SSzymon Olewniczak //we've created empty object 154*8a638198SSzymon Olewniczak if ($this->id === NULL) { 155*8a638198SSzymon Olewniczak $this->original_poster = $this->model->user_nick; 156*8a638198SSzymon Olewniczak $this->create_date = date('c'); 157*8a638198SSzymon Olewniczak $this->last_activity_date = $this->create_date; 158*8a638198SSzymon Olewniczak $this->last_modification_date = $this->create_date; 159*8a638198SSzymon Olewniczak 160*8a638198SSzymon Olewniczak $this->state = 'opened'; 161*8a638198SSzymon Olewniczak 162*8a638198SSzymon Olewniczak if (isset($defaults['thread'])) { 163*8a638198SSzymon Olewniczak $this->thread = $defaults['thread']; 164*8a638198SSzymon Olewniczak $this->thread_id = $this->thread->id; 165*8a638198SSzymon Olewniczak $this->type = 'correction'; 166*8a638198SSzymon Olewniczak 167*8a638198SSzymon Olewniczak if (isset($defaults['thread_comment'])) { 168*8a638198SSzymon Olewniczak $this->thread_comment = $defaults['thread_comment']; 169*8a638198SSzymon Olewniczak $this->thread_comment_id = $this->thread_comment->id; 170*8a638198SSzymon Olewniczak $this->type = 'corrective'; 171*8a638198SSzymon Olewniczak } 172*8a638198SSzymon Olewniczak } 173*8a638198SSzymon Olewniczak 174*8a638198SSzymon Olewniczak// //meta 175*8a638198SSzymon Olewniczak// $this->reporter = $this->model->user_nick; 176*8a638198SSzymon Olewniczak// $this->date = time(); 177*8a638198SSzymon Olewniczak// 178*8a638198SSzymon Olewniczak// $this->state = '0'; 179*8a638198SSzymon Olewniczak// $this->all_day_event = '1'; 180*8a638198SSzymon Olewniczak// 181*8a638198SSzymon Olewniczak// //throws ValidationException 182*8a638198SSzymon Olewniczak// $this->issue = $this->validator->validate_field('issue', $defaults['issue']); 183*8a638198SSzymon Olewniczak// 184*8a638198SSzymon Olewniczak// if ($this->issue !== '') { 185*8a638198SSzymon Olewniczak// $issue = $this->model->issues->get_one($defaults['issue']); 186*8a638198SSzymon Olewniczak// $this->coordinator = $issue->coordinator; 187*8a638198SSzymon Olewniczak// } else { 188*8a638198SSzymon Olewniczak// $this->coordinator = ''; 189*8a638198SSzymon Olewniczak// } 190*8a638198SSzymon Olewniczak// 191*8a638198SSzymon Olewniczak// //throws ValidationException 192*8a638198SSzymon Olewniczak// $this->validator->validate_field('cause', $defaults['cause']); 193*8a638198SSzymon Olewniczak// $this->cause = $defaults['cause']; 194*8a638198SSzymon Olewniczak// 195*8a638198SSzymon Olewniczak// //by default reporter is a executor 196*8a638198SSzymon Olewniczak// $this->executor = $this->reporter; 197*8a638198SSzymon Olewniczak 198*8a638198SSzymon Olewniczak 199*8a638198SSzymon Olewniczak } 200*8a638198SSzymon Olewniczak 201*8a638198SSzymon Olewniczak if ($this->thread_id == '') { 202*8a638198SSzymon Olewniczak $this->validator->set_rules(array( 203*8a638198SSzymon Olewniczak 'task_program_id' => array(array('numeric'), 'NOT NULL') 204*8a638198SSzymon Olewniczak )); 205*8a638198SSzymon Olewniczak } 206*8a638198SSzymon Olewniczak 207*8a638198SSzymon Olewniczak// //close_date required 208*8a638198SSzymon Olewniczak// if ($this->state !== '0') { 209*8a638198SSzymon Olewniczak// $this->validator->set_rules(array( 210*8a638198SSzymon Olewniczak// 'close_date' => array(array('unix_timestamp'), 'NOT NULL') 211*8a638198SSzymon Olewniczak// )); 212*8a638198SSzymon Olewniczak// } 213*8a638198SSzymon Olewniczak 214*8a638198SSzymon Olewniczak //explode subscribents 215*8a638198SSzymon Olewniczak// if ($this->subscribents !== NULL) { 216*8a638198SSzymon Olewniczak// $exp_part = explode(',', $this->subscribents); 217*8a638198SSzymon Olewniczak// foreach ($exp_part as $subscribent) { 218*8a638198SSzymon Olewniczak// $this->subscribents_array[$subscribent] = $subscribent; 219*8a638198SSzymon Olewniczak// } 220*8a638198SSzymon Olewniczak// } 221*8a638198SSzymon Olewniczak// 222*8a638198SSzymon Olewniczak// //we've created empty object 223*8a638198SSzymon Olewniczak// if ($this->id === NULL) { 224*8a638198SSzymon Olewniczak// //throws ValidationException 225*8a638198SSzymon Olewniczak// $this->validator->validate_field('tasktype', $defaults['tasktype']); 226*8a638198SSzymon Olewniczak// $this->tasktype = $defaults['tasktype']; 227*8a638198SSzymon Olewniczak// } 228*8a638198SSzymon Olewniczak } 229*8a638198SSzymon Olewniczak 230*8a638198SSzymon Olewniczak 231*8a638198SSzymon Olewniczak public function set_data($post, $filter=NULL) { 232*8a638198SSzymon Olewniczak parent::set_data($post); 233*8a638198SSzymon Olewniczak 234*8a638198SSzymon Olewniczak $this->content_html = p_render('xhtml',p_get_instructions($this->content), $ignore); 235*8a638198SSzymon Olewniczak 236*8a638198SSzymon Olewniczak //update dates 237*8a638198SSzymon Olewniczak $this->last_modification_date = date('c'); 238*8a638198SSzymon Olewniczak $this->last_activity_date = $this->last_modification_date; 239*8a638198SSzymon Olewniczak 240*8a638198SSzymon Olewniczak //specjalne reguły 241*8a638198SSzymon Olewniczak// if ($this->issue === '') { 242*8a638198SSzymon Olewniczak// $this->cause = ''; 243*8a638198SSzymon Olewniczak// } 244*8a638198SSzymon Olewniczak 245*8a638198SSzymon Olewniczak //set parsed 246*8a638198SSzymon Olewniczak// $this->task_cache = $this->helper->wiki_parse($this->task); 247*8a638198SSzymon Olewniczak// $this->reason_cache = $this->helper->wiki_parse($this->reason); 248*8a638198SSzymon Olewniczak 249*8a638198SSzymon Olewniczak //update virtuals 250*8a638198SSzymon Olewniczak //$this->update_virtual_columns(); 251*8a638198SSzymon Olewniczak 252*8a638198SSzymon Olewniczak return true; 253*8a638198SSzymon Olewniczak } 254*8a638198SSzymon Olewniczak 255*8a638198SSzymon Olewniczak// public function update_cache() { 256*8a638198SSzymon Olewniczak// if ($this->model->acl->get_level() < BEZ_AUTH_ADMIN) { 257*8a638198SSzymon Olewniczak// return false; 258*8a638198SSzymon Olewniczak// } 259*8a638198SSzymon Olewniczak// $this->task_cache = $this->helper->wiki_parse($this->task); 260*8a638198SSzymon Olewniczak// $this->reason_cache = $this->helper->wiki_parse($this->reason); 261*8a638198SSzymon Olewniczak// } 262*8a638198SSzymon Olewniczak// 263*8a638198SSzymon Olewniczak// public function set_state($data) { 264*8a638198SSzymon Olewniczak// //reason is required while changing state 265*8a638198SSzymon Olewniczak// if ($data['state'] === '2') { 266*8a638198SSzymon Olewniczak// $this->validator->set_rules(array( 267*8a638198SSzymon Olewniczak// 'reason' => array(array('length', 10000), 'NOT NULL') 268*8a638198SSzymon Olewniczak// )); 269*8a638198SSzymon Olewniczak// } 270*8a638198SSzymon Olewniczak// 271*8a638198SSzymon Olewniczak// $val_data = $this->validator->validate($data, array('state', 'reason')); 272*8a638198SSzymon Olewniczak// if ($val_data === false) { 273*8a638198SSzymon Olewniczak// throw new ValidationException('tasks', $this->validator->get_errors()); 274*8a638198SSzymon Olewniczak// } 275*8a638198SSzymon Olewniczak// 276*8a638198SSzymon Olewniczak// //if state is changed 277*8a638198SSzymon Olewniczak// if ($this->state != $data['state']) { 278*8a638198SSzymon Olewniczak// $this->close_date = time(); 279*8a638198SSzymon Olewniczak// } 280*8a638198SSzymon Olewniczak// 281*8a638198SSzymon Olewniczak// $this->set_property_array($val_data); 282*8a638198SSzymon Olewniczak// $this->reason_cache = $this->helper->wiki_parse($this->reason); 283*8a638198SSzymon Olewniczak// 284*8a638198SSzymon Olewniczak// //update virtuals 285*8a638198SSzymon Olewniczak// $this->update_virtual_columns(); 286*8a638198SSzymon Olewniczak// 287*8a638198SSzymon Olewniczak// return true; 288*8a638198SSzymon Olewniczak// } 289*8a638198SSzymon Olewniczak// 290*8a638198SSzymon Olewniczak// public function get_meta_fields() { 291*8a638198SSzymon Olewniczak// return array('reporter', 'date', 'close_date'); 292*8a638198SSzymon Olewniczak// } 293*8a638198SSzymon Olewniczak// 294*8a638198SSzymon Olewniczak// public function set_meta($post) { 295*8a638198SSzymon Olewniczak// 296*8a638198SSzymon Olewniczak// if (isset($post['date'])) { 297*8a638198SSzymon Olewniczak// $unix = strtotime($post['date']); 298*8a638198SSzymon Olewniczak// //if $unix === false validator will catch it 299*8a638198SSzymon Olewniczak// if ($unix !== false) { 300*8a638198SSzymon Olewniczak// $post['date'] = (string)$unix; 301*8a638198SSzymon Olewniczak// } 302*8a638198SSzymon Olewniczak// } 303*8a638198SSzymon Olewniczak// 304*8a638198SSzymon Olewniczak// if (isset($post['close_date'])) { 305*8a638198SSzymon Olewniczak// $unix = strtotime($post['close_date']); 306*8a638198SSzymon Olewniczak// //if $unix === false validator will catch it 307*8a638198SSzymon Olewniczak// if ($unix !== false) { 308*8a638198SSzymon Olewniczak// $post['close_date'] = (string)$unix; 309*8a638198SSzymon Olewniczak// } 310*8a638198SSzymon Olewniczak// } 311*8a638198SSzymon Olewniczak// 312*8a638198SSzymon Olewniczak// parent::set_data($post, $this->get_meta_fields()); 313*8a638198SSzymon Olewniczak// } 314*8a638198SSzymon Olewniczak// 315*8a638198SSzymon Olewniczak// public function is_subscribent($user=NULL) { 316*8a638198SSzymon Olewniczak// if ($user === NULL) { 317*8a638198SSzymon Olewniczak// $user = $this->model->user_nick; 318*8a638198SSzymon Olewniczak// } 319*8a638198SSzymon Olewniczak// if (in_array($user, $this->subscribents_array)) { 320*8a638198SSzymon Olewniczak// return true; 321*8a638198SSzymon Olewniczak// } 322*8a638198SSzymon Olewniczak// return false; 323*8a638198SSzymon Olewniczak// } 324*8a638198SSzymon Olewniczak// 325*8a638198SSzymon Olewniczak// public function get_subscribents() { 326*8a638198SSzymon Olewniczak// return $this->subscribents_array; 327*8a638198SSzymon Olewniczak// } 328*8a638198SSzymon Olewniczak// 329*8a638198SSzymon Olewniczak// public function get_participants() { 330*8a638198SSzymon Olewniczak// $subscribents = array_merge(array($this->reporter, $this->executor), 331*8a638198SSzymon Olewniczak// $this->subscribents_array); 332*8a638198SSzymon Olewniczak// $full_names = array(); 333*8a638198SSzymon Olewniczak// foreach ($subscribents as $par) { 334*8a638198SSzymon Olewniczak// $name = $this->model->users->get_user_full_name($par); 335*8a638198SSzymon Olewniczak// if ($name == '') { 336*8a638198SSzymon Olewniczak// $full_names[$par] = $par; 337*8a638198SSzymon Olewniczak// } else { 338*8a638198SSzymon Olewniczak// $full_names[$par] = $name; 339*8a638198SSzymon Olewniczak// } 340*8a638198SSzymon Olewniczak// } 341*8a638198SSzymon Olewniczak// ksort($full_names); 342*8a638198SSzymon Olewniczak// return $full_names; 343*8a638198SSzymon Olewniczak// } 344*8a638198SSzymon Olewniczak// 345*8a638198SSzymon Olewniczak// public function remove_subscribent($subscribent) { 346*8a638198SSzymon Olewniczak// if ($subscribent !== $this->model->user_nick && 347*8a638198SSzymon Olewniczak// $this->acl_of('subscribents') < BEZ_PERMISSION_CHANGE) { 348*8a638198SSzymon Olewniczak// throw new PermissionDeniedException(); 349*8a638198SSzymon Olewniczak// } 350*8a638198SSzymon Olewniczak// 351*8a638198SSzymon Olewniczak// if ($this->issue != '') { 352*8a638198SSzymon Olewniczak// throw new ConsistencyViolationException('cannot modify subscribents from issue related tasks'); 353*8a638198SSzymon Olewniczak// } 354*8a638198SSzymon Olewniczak// 355*8a638198SSzymon Olewniczak// if (!isset($this->subscribents_array[$subscribent])) { 356*8a638198SSzymon Olewniczak// throw new ConsistencyViolationException('user '.$subscribent.' wasn\'t subscriber so cannot be removed'); 357*8a638198SSzymon Olewniczak// } 358*8a638198SSzymon Olewniczak// 359*8a638198SSzymon Olewniczak// unset($this->subscribents_array[$subscribent]); 360*8a638198SSzymon Olewniczak// $this->subscribents = implode(',', $this->subscribents_array); 361*8a638198SSzymon Olewniczak// } 362*8a638198SSzymon Olewniczak// 363*8a638198SSzymon Olewniczak// public function add_subscribent($subscribent) { 364*8a638198SSzymon Olewniczak// if ($subscribent !== $this->model->user_nick && 365*8a638198SSzymon Olewniczak// $this->acl_of('subscribents') < BEZ_PERMISSION_CHANGE) { 366*8a638198SSzymon Olewniczak// throw new PermissionDeniedException(); 367*8a638198SSzymon Olewniczak// } 368*8a638198SSzymon Olewniczak// 369*8a638198SSzymon Olewniczak// if ($this->issue != '') { 370*8a638198SSzymon Olewniczak// throw new ConsistencyViolationException('cannot add subscribents to issue related tasks'); 371*8a638198SSzymon Olewniczak// } 372*8a638198SSzymon Olewniczak// 373*8a638198SSzymon Olewniczak// if ($this->model->users->exists($subscribent) && 374*8a638198SSzymon Olewniczak// !in_array($subscribent, $this->subscribents_array)) { 375*8a638198SSzymon Olewniczak// $this->subscribents_array[$subscribent] = $subscribent; 376*8a638198SSzymon Olewniczak// $this->subscribents = implode(',', $this->subscribents_array); 377*8a638198SSzymon Olewniczak// 378*8a638198SSzymon Olewniczak// return true; 379*8a638198SSzymon Olewniczak// } 380*8a638198SSzymon Olewniczak// 381*8a638198SSzymon Olewniczak// return false; 382*8a638198SSzymon Olewniczak// } 383*8a638198SSzymon Olewniczak 384*8a638198SSzymon Olewniczak private function mail_notify($replacements=array(), $users=false) { 385*8a638198SSzymon Olewniczak $plain = io_readFile($this->model->action->localFN('task-notification')); 386*8a638198SSzymon Olewniczak $html = io_readFile($this->model->action->localFN('task-notification', 'html')); 387*8a638198SSzymon Olewniczak 388*8a638198SSzymon Olewniczak $task_link = DOKU_URL . 'doku.php?id='.$this->model->action->id('task', 'tid', $this->id); 389*8a638198SSzymon Olewniczak 390*8a638198SSzymon Olewniczak $reps = array( 391*8a638198SSzymon Olewniczak 'task_id' => $this->id, 392*8a638198SSzymon Olewniczak 'task_link' => $task_link, 393*8a638198SSzymon Olewniczak 'who' => $this->reporter 394*8a638198SSzymon Olewniczak ); 395*8a638198SSzymon Olewniczak 396*8a638198SSzymon Olewniczak //$replacements can override $reps 397*8a638198SSzymon Olewniczak $rep = array_merge($reps, $replacements); 398*8a638198SSzymon Olewniczak 399*8a638198SSzymon Olewniczak if (!isset($rep['who_full_name'])) { 400*8a638198SSzymon Olewniczak $rep['who_full_name'] = 401*8a638198SSzymon Olewniczak $this->model->users->get_user_full_name($rep['who']); 402*8a638198SSzymon Olewniczak } 403*8a638198SSzymon Olewniczak 404*8a638198SSzymon Olewniczak //auto title 405*8a638198SSzymon Olewniczak if (!isset($rep['subject'])) { 406*8a638198SSzymon Olewniczak// if (isset($rep['content'])) { 407*8a638198SSzymon Olewniczak// $rep['subject'] = array_shift(explode('.', $rep['content'], 2)); 408*8a638198SSzymon Olewniczak// } 409*8a638198SSzymon Olewniczak $rep['subject'] = '#z'.$this->id.' '.$this->tasktype_string; 410*8a638198SSzymon Olewniczak } 411*8a638198SSzymon Olewniczak 412*8a638198SSzymon Olewniczak //we must do it manually becouse Mailer uses htmlspecialchars() 413*8a638198SSzymon Olewniczak $html = str_replace('@TASK_TABLE@', $rep['task_table'], $html); 414*8a638198SSzymon Olewniczak 415*8a638198SSzymon Olewniczak $mailer = new BEZ_Mailer(); 416*8a638198SSzymon Olewniczak $mailer->setBody($plain, $rep, $rep, $html, false); 417*8a638198SSzymon Olewniczak 418*8a638198SSzymon Olewniczak if ($users === FALSE) { 419*8a638198SSzymon Olewniczak $users = $this->get_subscribents(); 420*8a638198SSzymon Olewniczak 421*8a638198SSzymon Olewniczak //don't notify current user 422*8a638198SSzymon Olewniczak unset($users[$this->model->user_nick]); 423*8a638198SSzymon Olewniczak } 424*8a638198SSzymon Olewniczak 425*8a638198SSzymon Olewniczak $emails = array_map(function($user) { 426*8a638198SSzymon Olewniczak return $this->model->users->get_user_email($user); 427*8a638198SSzymon Olewniczak }, $users); 428*8a638198SSzymon Olewniczak 429*8a638198SSzymon Olewniczak $mailer->to($emails); 430*8a638198SSzymon Olewniczak $mailer->subject($rep['subject']); 431*8a638198SSzymon Olewniczak 432*8a638198SSzymon Olewniczak $send = $mailer->send(); 433*8a638198SSzymon Olewniczak if ($send === false) { 434*8a638198SSzymon Olewniczak //this may mean empty $emails 435*8a638198SSzymon Olewniczak //throw new Exception("can't send email"); 436*8a638198SSzymon Olewniczak } 437*8a638198SSzymon Olewniczak } 438*8a638198SSzymon Olewniczak 439*8a638198SSzymon Olewniczak public function mail_notify_task_box($issue_obj=NULL, $users=false, $replacements=array()) { 440*8a638198SSzymon Olewniczak if ($issue_obj !== NULL && $issue_obj->id !== $this->issue) { 441*8a638198SSzymon Olewniczak throw new Exception('issue object id and task->issue does not match'); 442*8a638198SSzymon Olewniczak } 443*8a638198SSzymon Olewniczak 444*8a638198SSzymon Olewniczak $top_row = array( 445*8a638198SSzymon Olewniczak '<strong>'.$this->model->action->getLang('executor').': </strong>' . 446*8a638198SSzymon Olewniczak $this->model->users->get_user_full_name($this->executor), 447*8a638198SSzymon Olewniczak 448*8a638198SSzymon Olewniczak '<strong>'.$this->model->action->getLang('reporter').': </strong>' . 449*8a638198SSzymon Olewniczak $this->model->users->get_user_full_name($this->reporter) 450*8a638198SSzymon Olewniczak ); 451*8a638198SSzymon Olewniczak 452*8a638198SSzymon Olewniczak if ($this->tasktype_string != '') { 453*8a638198SSzymon Olewniczak $top_row[] = 454*8a638198SSzymon Olewniczak '<strong>'.$this->model->action->getLang('task_type').': </strong>' . 455*8a638198SSzymon Olewniczak $this->tasktype_string; 456*8a638198SSzymon Olewniczak } 457*8a638198SSzymon Olewniczak 458*8a638198SSzymon Olewniczak if ($this->cost != '') { 459*8a638198SSzymon Olewniczak $top_row[] = 460*8a638198SSzymon Olewniczak '<strong>'.$this->model->action->getLang('cost').': </strong>' . 461*8a638198SSzymon Olewniczak $this->cost; 462*8a638198SSzymon Olewniczak } 463*8a638198SSzymon Olewniczak 464*8a638198SSzymon Olewniczak //BOTTOM ROW 465*8a638198SSzymon Olewniczak $bottom_row = array( 466*8a638198SSzymon Olewniczak '<strong>'.$this->model->action->getLang('plan_date').': </strong>' . 467*8a638198SSzymon Olewniczak $this->plan_date 468*8a638198SSzymon Olewniczak ); 469*8a638198SSzymon Olewniczak 470*8a638198SSzymon Olewniczak if ($this->all_day_event == '0') { 471*8a638198SSzymon Olewniczak $bottom_row[] = 472*8a638198SSzymon Olewniczak '<strong>'.$this->model->action->getLang('start_time').': </strong>' . 473*8a638198SSzymon Olewniczak $this->start_time; 474*8a638198SSzymon Olewniczak $bottom_row[] = 475*8a638198SSzymon Olewniczak '<strong>'.$this->model->action->getLang('finish_time').': </strong>' . 476*8a638198SSzymon Olewniczak $this->finish_time; 477*8a638198SSzymon Olewniczak } 478*8a638198SSzymon Olewniczak 479*8a638198SSzymon Olewniczak $rep = array( 480*8a638198SSzymon Olewniczak 'content' => $this->task, 481*8a638198SSzymon Olewniczak 'content_html' => 482*8a638198SSzymon Olewniczak '<h2 style="font-size: 1.2em;">'. 483*8a638198SSzymon Olewniczak '<a href="'.DOKU_URL.'doku.php?id='.$this->model->action->id('task', 'tid', $this->id).'">' . 484*8a638198SSzymon Olewniczak '#z'.$this->id . 485*8a638198SSzymon Olewniczak '</a> ' . 486*8a638198SSzymon Olewniczak lcfirst($this->action_string) . ' ' . 487*8a638198SSzymon Olewniczak '(' . 488*8a638198SSzymon Olewniczak lcfirst($this->state_string) . 489*8a638198SSzymon Olewniczak ')' . 490*8a638198SSzymon Olewniczak '</h2>' . 491*8a638198SSzymon Olewniczak bez_html_irrtable(array( 492*8a638198SSzymon Olewniczak 'table' => array( 493*8a638198SSzymon Olewniczak 'border-collapse' => 'collapse', 494*8a638198SSzymon Olewniczak 'font-size' => '0.8em', 495*8a638198SSzymon Olewniczak 'width' => '100%' 496*8a638198SSzymon Olewniczak ), 497*8a638198SSzymon Olewniczak 'td' => array( 498*8a638198SSzymon Olewniczak 'border-top' => '1px solid #8bbcbc', 499*8a638198SSzymon Olewniczak 'border-bottom' => '1px solid #8bbcbc', 500*8a638198SSzymon Olewniczak 'padding' => '.3em .5em' 501*8a638198SSzymon Olewniczak ) 502*8a638198SSzymon Olewniczak ), $top_row, $bottom_row) . $this->task_cache, 503*8a638198SSzymon Olewniczak 'who' => $this->model->user_nick, 504*8a638198SSzymon Olewniczak 'when' => date('c', (int)$this->date), 505*8a638198SSzymon Olewniczak 'custom_content' => true 506*8a638198SSzymon Olewniczak ); 507*8a638198SSzymon Olewniczak 508*8a638198SSzymon Olewniczak $rep['action_color'] = '#e4f4f4'; 509*8a638198SSzymon Olewniczak $rep['action_border_color'] = '#8bbcbc'; 510*8a638198SSzymon Olewniczak 511*8a638198SSzymon Olewniczak //$replacements can override $reps 512*8a638198SSzymon Olewniczak $rep = array_merge($rep, $replacements); 513*8a638198SSzymon Olewniczak 514*8a638198SSzymon Olewniczak if ($issue_obj === NULL) { 515*8a638198SSzymon Olewniczak $this->mail_notify($rep, $users); 516*8a638198SSzymon Olewniczak } else { 517*8a638198SSzymon Olewniczak $issue_obj->mail_notify($rep); 518*8a638198SSzymon Olewniczak } 519*8a638198SSzymon Olewniczak } 520*8a638198SSzymon Olewniczak 521*8a638198SSzymon Olewniczak public function mail_notify_subscribents( $issue_obj=NULL, 522*8a638198SSzymon Olewniczak $replacements=array()) { 523*8a638198SSzymon Olewniczak $this->mail_notify_task_box($issue_obj, false, $replacements); 524*8a638198SSzymon Olewniczak } 525*8a638198SSzymon Olewniczak 526*8a638198SSzymon Olewniczak public function mail_notify_add($issue_obj=NULL, $users=false, $replacements=array()) { 527*8a638198SSzymon Olewniczak $replacements['action'] = $this->model->action->getLang('mail_task_added'); 528*8a638198SSzymon Olewniczak $this->mail_notify_task_box($issue_obj, $users, $replacements); 529*8a638198SSzymon Olewniczak } 530*8a638198SSzymon Olewniczak 531*8a638198SSzymon Olewniczak public function mail_notify_remind($users=false) { 532*8a638198SSzymon Olewniczak $replacements = array(); 533*8a638198SSzymon Olewniczak 534*8a638198SSzymon Olewniczak $replacements['action'] = $this->model->action->getLang('mail_task_remind'); 535*8a638198SSzymon Olewniczak //we don't want any who 536*8a638198SSzymon Olewniczak $replacements['who_full_name'] = ''; 537*8a638198SSzymon Olewniczak 538*8a638198SSzymon Olewniczak //$users = array($this->executor); 539*8a638198SSzymon Olewniczak $this->mail_notify_task_box(null, $users, $replacements); 540*8a638198SSzymon Olewniczak } 541*8a638198SSzymon Olewniczak 542*8a638198SSzymon Olewniczak public function mail_notify_invite($client) { 543*8a638198SSzymon Olewniczak $replacements = array(); 544*8a638198SSzymon Olewniczak 545*8a638198SSzymon Olewniczak $replacements['action'] = $this->model->action->getLang('mail_task_invite'); 546*8a638198SSzymon Olewniczak 547*8a638198SSzymon Olewniczak $users = array($client); 548*8a638198SSzymon Olewniczak $this->mail_notify_task_box(null, $users, $replacements); 549*8a638198SSzymon Olewniczak } 550*8a638198SSzymon Olewniczak} 551