xref: /plugin/bez/mdl/Task.php (revision 53df74e7ac5ae4234aac1fa716a33878a039026f)
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;
88a638198SSzymon Olewniczak
98a638198SSzymon Olewniczakclass Task extends Entity {
108a638198SSzymon Olewniczak
118a638198SSzymon Olewniczak    protected $id;
128a638198SSzymon Olewniczak
13e8827d73SSzymon Olewniczak	protected $original_poster, $assignee, $closed_by;
148a638198SSzymon Olewniczak
158a638198SSzymon Olewniczak	protected $private, $lock;
168a638198SSzymon Olewniczak
178a638198SSzymon Olewniczak	protected $state, $type;
188a638198SSzymon Olewniczak
198a638198SSzymon Olewniczak	protected $create_date, $last_activity_date, $last_modification_date, $close_date;
208a638198SSzymon Olewniczak
218a638198SSzymon Olewniczak	protected $cost, $plan_date, $all_day_event, $start_time, $finish_time;
228a638198SSzymon Olewniczak
238a638198SSzymon Olewniczak	protected $content, $content_html;
248a638198SSzymon Olewniczak
258a638198SSzymon Olewniczak	protected $thread_id, $thread_comment_id, $task_program_id;
268a638198SSzymon Olewniczak
278a638198SSzymon Olewniczak	/** @var \dokuwiki\plugin\bez\mdl\Thread */
288a638198SSzymon Olewniczak	protected $thread;
298a638198SSzymon Olewniczak
308a638198SSzymon Olewniczak	/** @var Thread_comment */
318a638198SSzymon Olewniczak	protected $thread_comment;
328a638198SSzymon Olewniczak
338a638198SSzymon Olewniczak	//virtual
34ff14b107SSzymon Olewniczak    protected $task_program_name, $priority, $coordinator;
358a638198SSzymon Olewniczak
368a638198SSzymon Olewniczak	public static function get_columns() {
378a638198SSzymon Olewniczak		return array('id',
38e8827d73SSzymon Olewniczak            'original_poster', 'assignee', 'closed_by',
398a638198SSzymon Olewniczak            'private', 'lock',
408a638198SSzymon Olewniczak            'state', 'type',
418a638198SSzymon Olewniczak            'create_date', 'last_activity_date', 'last_modification_date', 'close_date',
428a638198SSzymon Olewniczak            'cost', 'plan_date', 'all_day_event', 'start_time', 'finish_time',
438a638198SSzymon Olewniczak            'content', 'content_html',
448a638198SSzymon Olewniczak            'thread_id', 'thread_comment_id', 'task_program_id');
458a638198SSzymon Olewniczak	}
468a638198SSzymon Olewniczak
47e8827d73SSzymon Olewniczak	public static function get_types() {
48e8827d73SSzymon Olewniczak	    return array('correction', 'corrective', 'preventive', 'program');
49e8827d73SSzymon Olewniczak    }
50e8827d73SSzymon Olewniczak
51e8827d73SSzymon Olewniczak    public static function get_states() {
52e8827d73SSzymon Olewniczak        return array('opened', 'done');
53e8827d73SSzymon Olewniczak    }
54e8827d73SSzymon Olewniczak
558a638198SSzymon Olewniczak    public function __get($property) {
56ff14b107SSzymon Olewniczak        if ($property == 'thread') {
57ff14b107SSzymon Olewniczak            if ($this->thread_id == null) {
58ff14b107SSzymon Olewniczak                return null;
59ff14b107SSzymon Olewniczak            }
60ff14b107SSzymon Olewniczak            if ($this->thread == null) {
61ff14b107SSzymon Olewniczak                $this->thread = $this->model->threadFactory->get_one($this->thread_id);
62ff14b107SSzymon Olewniczak            }
63ff14b107SSzymon Olewniczak            return $this->thread;
64ff14b107SSzymon Olewniczak
65ff14b107SSzymon Olewniczak        } elseif($property == 'thread_comment') {
66ff14b107SSzymon Olewniczak            if ($this->thread_comment_id == null) {
67ff14b107SSzymon Olewniczak                return null;
68ff14b107SSzymon Olewniczak            }
69ff14b107SSzymon Olewniczak            if ($this->thread_comment == null) {
70*53df74e7SSzymon Olewniczak                $this->thread_comment = $this->model->thread_commentFactory->get_one($this->thread_comment_id);
71ff14b107SSzymon Olewniczak            }
72ff14b107SSzymon Olewniczak            return $this->thread_comment;
73ff14b107SSzymon Olewniczak
74ff14b107SSzymon Olewniczak        } elseif($property == 'priority' || $property == 'coordinator' || $property == 'task_program_name') {
758a638198SSzymon Olewniczak            return $this->$property;
768a638198SSzymon Olewniczak        }
778a638198SSzymon Olewniczak        return parent::__get($property);
788a638198SSzymon Olewniczak    }
798a638198SSzymon Olewniczak
808a638198SSzymon Olewniczak	public function __construct($model, $defaults=array()) {
818a638198SSzymon Olewniczak		parent::__construct($model, $defaults);
828a638198SSzymon Olewniczak
838a638198SSzymon Olewniczak		$this->validator->set_rules(array(
848a638198SSzymon Olewniczak            'assignee' => array(array('dw_user'), 'NOT NULL'),
858a638198SSzymon Olewniczak            'cost' => array(array('numeric'), 'NULL'),
868a638198SSzymon Olewniczak			'plan_date' => array(array('iso_date'), 'NOT NULL'),
878a638198SSzymon Olewniczak			'all_day_event' => array(array('select', array('0', '1')), 'NOT NULL'),
888a638198SSzymon Olewniczak			'start_time' => array(array('time'), 'NULL'),
898a638198SSzymon Olewniczak			'finish_time' => array(array('time'), 'NULL'),
908a638198SSzymon Olewniczak            'content' => array(array('length', 10000), 'NOT NULL'),
91e8827d73SSzymon Olewniczak            'thread_comment_id' => array(array('numeric'), 'NULL'),
928a638198SSzymon Olewniczak            'task_program_id' => array(array('numeric'), 'NULL')
938a638198SSzymon Olewniczak		));
948a638198SSzymon Olewniczak
958a638198SSzymon Olewniczak		//we've created empty object
968a638198SSzymon Olewniczak		if ($this->id === NULL) {
978a638198SSzymon Olewniczak            $this->original_poster = $this->model->user_nick;
988a638198SSzymon Olewniczak            $this->create_date = date('c');
998a638198SSzymon Olewniczak            $this->last_activity_date = $this->create_date;
1008a638198SSzymon Olewniczak            $this->last_modification_date = $this->create_date;
1018a638198SSzymon Olewniczak
1028a638198SSzymon Olewniczak            $this->state = 'opened';
1038a638198SSzymon Olewniczak
1048a638198SSzymon Olewniczak            if (isset($defaults['thread'])) {
1058a638198SSzymon Olewniczak                $this->thread = $defaults['thread'];
1068a638198SSzymon Olewniczak                $this->thread_id = $this->thread->id;
107*53df74e7SSzymon Olewniczak                $this->coordinator = $this->thread->coordinator;
1088a638198SSzymon Olewniczak                $this->type = 'correction';
1098a638198SSzymon Olewniczak
1108a638198SSzymon Olewniczak                if (isset($defaults['thread_comment'])) {
1118a638198SSzymon Olewniczak                    $this->thread_comment = $defaults['thread_comment'];
1128a638198SSzymon Olewniczak                    $this->thread_comment_id = $this->thread_comment->id;
113e8827d73SSzymon Olewniczak
114e8827d73SSzymon Olewniczak                    if ($this->thread_comment->type == 'cause_real') {
1158a638198SSzymon Olewniczak                        $this->type = 'corrective';
116e8827d73SSzymon Olewniczak                    } else {
117e8827d73SSzymon Olewniczak                        $this->type = 'preventive';
118e8827d73SSzymon Olewniczak                    }
1198a638198SSzymon Olewniczak                }
120ff14b107SSzymon Olewniczak            } else {
121ff14b107SSzymon Olewniczak                $this->type = 'program';
1228a638198SSzymon Olewniczak            }
123e8827d73SSzymon Olewniczak        //we get object form db
124e8827d73SSzymon Olewniczak		} else {
125ff14b107SSzymon Olewniczak
126e8827d73SSzymon Olewniczak            if (isset($defaults['thread']) && $this->thread_id == $defaults['thread']->id) {
127e8827d73SSzymon Olewniczak                $this->thread = $defaults['thread'];
128e8827d73SSzymon Olewniczak            }
129e8827d73SSzymon Olewniczak
130e8827d73SSzymon Olewniczak            if (isset($defaults['thread_comment']) && $this->thread_comment_id == $defaults['thread_comment']->id) {
131e8827d73SSzymon Olewniczak                $this->thread_comment = $defaults['thread_comment'];
132e8827d73SSzymon Olewniczak            }
133e8827d73SSzymon Olewniczak
134e8827d73SSzymon Olewniczak        }
1358a638198SSzymon Olewniczak
1368a638198SSzymon Olewniczak		if ($this->thread_id == '') {
1378a638198SSzymon Olewniczak			$this->validator->set_rules(array(
138e8827d73SSzymon Olewniczak				'task_program_id' => array(array('numeric'), 'NOT NULL'),
1398a638198SSzymon Olewniczak			));
140e8827d73SSzymon Olewniczak		    //this field is unused in program tasks
141e8827d73SSzymon Olewniczak            $this->validator->delete_rule('thread_comment_id');
1428a638198SSzymon Olewniczak        }
1438a638198SSzymon Olewniczak	}
1448a638198SSzymon Olewniczak
1458a638198SSzymon Olewniczak
1468a638198SSzymon Olewniczak	public function set_data($post, $filter=NULL) {
147ff14b107SSzymon Olewniczak        //all day event
148ff14b107SSzymon Olewniczak        if (!isset($post['all_day_event'])) {
149ff14b107SSzymon Olewniczak            $post['all_day_event'] = '0';
150ff14b107SSzymon Olewniczak        }
151ff14b107SSzymon Olewniczak
152*53df74e7SSzymon Olewniczak        parent::set_data($post);
153*53df74e7SSzymon Olewniczak
154*53df74e7SSzymon Olewniczak        $this->content_html = p_render('xhtml',p_get_instructions($this->content), $ignore);
155*53df74e7SSzymon Olewniczak
156*53df74e7SSzymon Olewniczak        if (!isset($post['assignee'])) {
157*53df74e7SSzymon Olewniczak            $this->assignee = $this->model->user_nick;
158*53df74e7SSzymon Olewniczak        }
159*53df74e7SSzymon Olewniczak
160*53df74e7SSzymon Olewniczak        //update dates
161*53df74e7SSzymon Olewniczak        $this->last_modification_date = date('c');
162*53df74e7SSzymon Olewniczak        $this->last_activity_date = $this->last_modification_date;
163*53df74e7SSzymon Olewniczak
1648a638198SSzymon Olewniczak		return true;
1658a638198SSzymon Olewniczak	}
1668a638198SSzymon Olewniczak
167e8827d73SSzymon Olewniczak    public function set_state($state) {
168e8827d73SSzymon Olewniczak	    if ($this->acl_of('state') < BEZ_PERMISSION_CHANGE) {
169e8827d73SSzymon Olewniczak	        throw new PermissionDeniedException();
170e8827d73SSzymon Olewniczak        }
171e8827d73SSzymon Olewniczak
172e8827d73SSzymon Olewniczak        if (!in_array($state, array('opened', 'done'))) {
173e8827d73SSzymon Olewniczak	        throw new ValidationException('task', array('sholud be opened or done'));
174e8827d73SSzymon Olewniczak        }
175e8827d73SSzymon Olewniczak
176e8827d73SSzymon Olewniczak        //nothing to do
177e8827d73SSzymon Olewniczak        if ($state == $this->state) {
178e8827d73SSzymon Olewniczak	        return;
179e8827d73SSzymon Olewniczak        }
180e8827d73SSzymon Olewniczak
181e8827d73SSzymon Olewniczak        if ($state == 'done') {
182e8827d73SSzymon Olewniczak            $this->model->sqlite->query("UPDATE {$this->get_table_name()} SET state=?, closed_by=?, close_date=? WHERE id=?",
183e8827d73SSzymon Olewniczak                $state,
184e8827d73SSzymon Olewniczak                $this->model->user_nick,
185e8827d73SSzymon Olewniczak                date('c'),
186e8827d73SSzymon Olewniczak                $this->id);
187e8827d73SSzymon Olewniczak        //reopen the task
188e8827d73SSzymon Olewniczak        } else {
189e8827d73SSzymon Olewniczak            $this->model->sqlite->query("UPDATE {$this->get_table_name()} SET state=? WHERE id=?", $state, $this->id);
190e8827d73SSzymon Olewniczak        }
191e8827d73SSzymon Olewniczak
192e8827d73SSzymon Olewniczak        $this->state = $state;
193e8827d73SSzymon Olewniczak    }
194e8827d73SSzymon Olewniczak
195e8827d73SSzymon Olewniczak    public function update_last_activity() {
196e8827d73SSzymon Olewniczak        $this->last_activity_date = date('c');
197e8827d73SSzymon Olewniczak        $this->model->sqlite->query('UPDATE task SET last_activity_date=? WHERE id=?',
198e8827d73SSzymon Olewniczak                                    $this->last_activity_date, $this->id);
199e8827d73SSzymon Olewniczak    }
200e8827d73SSzymon Olewniczak
201e8827d73SSzymon Olewniczak    public function get_participants($filter='') {
202e8827d73SSzymon Olewniczak        if ($this->id === NULL) {
203e8827d73SSzymon Olewniczak            return array();
204e8827d73SSzymon Olewniczak        }
205e8827d73SSzymon Olewniczak
206e8827d73SSzymon Olewniczak        $sql = 'SELECT * FROM task_participant WHERE';
207e8827d73SSzymon Olewniczak        $possible_flags = array('original_poster', 'assignee', 'commentator', 'subscribent');
208e8827d73SSzymon Olewniczak        if ($filter != '') {
209e8827d73SSzymon Olewniczak            if (!in_array($filter, $possible_flags)) {
210e8827d73SSzymon Olewniczak                throw new \Exception("unknown flag $filter");
211e8827d73SSzymon Olewniczak            }
212e8827d73SSzymon Olewniczak            $sql .= " $filter=1 AND";
213e8827d73SSzymon Olewniczak        }
214e8827d73SSzymon Olewniczak        $sql .= ' task_id=? ORDER BY user_id';
215e8827d73SSzymon Olewniczak
216e8827d73SSzymon Olewniczak        $r = $this->model->sqlite->query($sql, $this->id);
217e8827d73SSzymon Olewniczak        $pars = $this->model->sqlite->res2arr($r);
218e8827d73SSzymon Olewniczak        $participants = array();
219e8827d73SSzymon Olewniczak        foreach ($pars as $par) {
220e8827d73SSzymon Olewniczak            $participants[$par['user_id']] = $par;
221e8827d73SSzymon Olewniczak        }
222e8827d73SSzymon Olewniczak
223e8827d73SSzymon Olewniczak        return $participants;
224e8827d73SSzymon Olewniczak    }
225e8827d73SSzymon Olewniczak
226e8827d73SSzymon Olewniczak    public function get_participant($user_id) {
227e8827d73SSzymon Olewniczak        if ($this->id === NULL) {
228e8827d73SSzymon Olewniczak            return array();
229e8827d73SSzymon Olewniczak        }
230e8827d73SSzymon Olewniczak
231e8827d73SSzymon Olewniczak        $r = $this->model->sqlite->query('SELECT * FROM task_participant WHERE task_id=? AND user_id=?', $this->id, $user_id);
232e8827d73SSzymon Olewniczak        $par = $this->model->sqlite->res2row($r);
233e8827d73SSzymon Olewniczak        if (!is_array($par)) {
234e8827d73SSzymon Olewniczak            return false;
235e8827d73SSzymon Olewniczak        }
236e8827d73SSzymon Olewniczak
237e8827d73SSzymon Olewniczak        return $par;
238e8827d73SSzymon Olewniczak    }
239e8827d73SSzymon Olewniczak
240e8827d73SSzymon Olewniczak    public function is_subscribent($user_id=null) {
241e8827d73SSzymon Olewniczak        if ($user_id == null) {
242e8827d73SSzymon Olewniczak            $user_id = $this->model->user_nick;
243e8827d73SSzymon Olewniczak        }
244e8827d73SSzymon Olewniczak        $par = $this->get_participant($user_id);
245e8827d73SSzymon Olewniczak        if ($par['subscribent'] == 1) {
246e8827d73SSzymon Olewniczak            return true;
247e8827d73SSzymon Olewniczak        }
248e8827d73SSzymon Olewniczak        return false;
249e8827d73SSzymon Olewniczak    }
250e8827d73SSzymon Olewniczak
251e8827d73SSzymon Olewniczak    public function remove_participant_flags($user_id, $flags) {
252e8827d73SSzymon Olewniczak        //thread not saved yet
253e8827d73SSzymon Olewniczak        if ($this->id === NULL) {
254e8827d73SSzymon Olewniczak            throw new \Exception('cannot remove flags from not saved thread');
255e8827d73SSzymon Olewniczak        }
256e8827d73SSzymon Olewniczak
257e8827d73SSzymon Olewniczak        $possible_flags = array('original_poster', 'assignee', 'commentator', 'subscribent');
258e8827d73SSzymon Olewniczak        if (array_intersect($flags, $possible_flags) != $flags) {
259e8827d73SSzymon Olewniczak            throw new \Exception('unknown flags');
260e8827d73SSzymon Olewniczak        }
261e8827d73SSzymon Olewniczak
262e8827d73SSzymon Olewniczak        $set = implode(',', array_map(function ($v) { return "$v=0"; }, $flags));
263e8827d73SSzymon Olewniczak
264e8827d73SSzymon Olewniczak        $sql = "UPDATE task_participant SET $set WHERE task_id=? AND user_id=?";
265e8827d73SSzymon Olewniczak        $this->model->sqlite->query($sql, $this->id, $user_id);
266e8827d73SSzymon Olewniczak
267e8827d73SSzymon Olewniczak    }
268e8827d73SSzymon Olewniczak
269e8827d73SSzymon Olewniczak    public function set_participant_flags($user_id, $flags=array()) {
270e8827d73SSzymon Olewniczak        //thread not saved yet
271e8827d73SSzymon Olewniczak        if ($this->id === NULL) {
272e8827d73SSzymon Olewniczak            throw new \Exception('cannot add flags to not saved thread');
273e8827d73SSzymon Olewniczak        }
274e8827d73SSzymon Olewniczak
275e8827d73SSzymon Olewniczak        //validate user
276e8827d73SSzymon Olewniczak        if (!$this->model->userFactory->exists($user_id)) {
277e8827d73SSzymon Olewniczak            throw new \Exception("$user_id isn't dokuwiki user");
278e8827d73SSzymon Olewniczak        }
279e8827d73SSzymon Olewniczak
280e8827d73SSzymon Olewniczak        $possible_flags = array('original_poster', 'assignee', 'commentator', 'subscribent');
281e8827d73SSzymon Olewniczak        if (array_intersect($flags, $possible_flags) != $flags) {
282e8827d73SSzymon Olewniczak            throw new \Exception('unknown flags');
283e8827d73SSzymon Olewniczak        }
284e8827d73SSzymon Olewniczak
285e8827d73SSzymon Olewniczak        $participant = $this->get_participant($user_id);
286e8827d73SSzymon Olewniczak        if ($participant == false) {
287e8827d73SSzymon Olewniczak            $participant = array_fill_keys($possible_flags, 0);
288e8827d73SSzymon Olewniczak
289e8827d73SSzymon Olewniczak            $participant['task_id'] = $this->id;
290e8827d73SSzymon Olewniczak            $participant['user_id'] = $user_id;
291e8827d73SSzymon Olewniczak            $participant['added_by'] = $this->model->user_nick;
292e8827d73SSzymon Olewniczak            $participant['added_date'] = date('c');
293e8827d73SSzymon Olewniczak        }
294e8827d73SSzymon Olewniczak        $values = array_merge($participant, array_fill_keys($flags, 1));
295e8827d73SSzymon Olewniczak
296e8827d73SSzymon Olewniczak        $keys = join(',', array_keys($values));
297e8827d73SSzymon Olewniczak        $vals = join(',', array_fill(0,count($values),'?'));
298e8827d73SSzymon Olewniczak
299e8827d73SSzymon Olewniczak        $sql = "REPLACE INTO task_participant ($keys) VALUES ($vals)";
300e8827d73SSzymon Olewniczak        $this->model->sqlite->query($sql, array_values($values));
301e8827d73SSzymon Olewniczak    }
302e8827d73SSzymon Olewniczak
303e8827d73SSzymon Olewniczak    public function invite($client) {
304e8827d73SSzymon Olewniczak        $this->set_participant_flags($client, array('subscribent'));
305e8827d73SSzymon Olewniczak        $this->mail_notify_invite($client);
306e8827d73SSzymon Olewniczak    }
307e8827d73SSzymon Olewniczak
3088a638198SSzymon Olewniczak    private function mail_notify($replacements=array(), $users=false) {
3098a638198SSzymon Olewniczak        $plain = io_readFile($this->model->action->localFN('task-notification'));
3108a638198SSzymon Olewniczak        $html = io_readFile($this->model->action->localFN('task-notification', 'html'));
3118a638198SSzymon Olewniczak
312e8827d73SSzymon Olewniczak        $task_link = $this->model->action->url('task', 'tid', $this->id);
3138a638198SSzymon Olewniczak
3148a638198SSzymon Olewniczak        $reps = array(
3158a638198SSzymon Olewniczak                        'task_id' => $this->id,
3168a638198SSzymon Olewniczak                        'task_link' => $task_link,
317e8827d73SSzymon Olewniczak                        'who' => $this->original_poster
3188a638198SSzymon Olewniczak                     );
3198a638198SSzymon Olewniczak
3208a638198SSzymon Olewniczak        //$replacements can override $reps
3218a638198SSzymon Olewniczak        $rep = array_merge($reps, $replacements);
3228a638198SSzymon Olewniczak
3238a638198SSzymon Olewniczak        if (!isset($rep['who_full_name'])) {
3248a638198SSzymon Olewniczak            $rep['who_full_name'] =
325e8827d73SSzymon Olewniczak                $this->model->userFactory->get_user_full_name($rep['who']);
3268a638198SSzymon Olewniczak        }
3278a638198SSzymon Olewniczak
3288a638198SSzymon Olewniczak        //auto title
3298a638198SSzymon Olewniczak        if (!isset($rep['subject'])) {
3308a638198SSzymon Olewniczak//            if (isset($rep['content'])) {
3318a638198SSzymon Olewniczak//                $rep['subject'] =  array_shift(explode('.', $rep['content'], 2));
3328a638198SSzymon Olewniczak//            }
333e8827d73SSzymon Olewniczak            $rep['subject'] = '#z'.$this->id. ' ' . $this->task_program_name;
3348a638198SSzymon Olewniczak        }
3358a638198SSzymon Olewniczak
3368a638198SSzymon Olewniczak        //we must do it manually becouse Mailer uses htmlspecialchars()
3378a638198SSzymon Olewniczak        $html = str_replace('@TASK_TABLE@', $rep['task_table'], $html);
3388a638198SSzymon Olewniczak
339e8827d73SSzymon Olewniczak        $mailer = new Mailer();
3408a638198SSzymon Olewniczak        $mailer->setBody($plain, $rep, $rep, $html, false);
3418a638198SSzymon Olewniczak
3428a638198SSzymon Olewniczak        if ($users === FALSE) {
343e8827d73SSzymon Olewniczak            $users = $this->get_participants('subscribent');
3448a638198SSzymon Olewniczak
3458a638198SSzymon Olewniczak            //don't notify current user
3468a638198SSzymon Olewniczak            unset($users[$this->model->user_nick]);
3478a638198SSzymon Olewniczak        }
3488a638198SSzymon Olewniczak
3498a638198SSzymon Olewniczak        $emails = array_map(function($user) {
350*53df74e7SSzymon Olewniczak            return $this->model->userFactory->get_user_email($user['user_id']);
3518a638198SSzymon Olewniczak        }, $users);
3528a638198SSzymon Olewniczak
3538a638198SSzymon Olewniczak        $mailer->to($emails);
3548a638198SSzymon Olewniczak        $mailer->subject($rep['subject']);
3558a638198SSzymon Olewniczak
3568a638198SSzymon Olewniczak        $send = $mailer->send();
3578a638198SSzymon Olewniczak        if ($send === false) {
3588a638198SSzymon Olewniczak            //this may mean empty $emails
3598a638198SSzymon Olewniczak            //throw new Exception("can't send email");
3608a638198SSzymon Olewniczak        }
3618a638198SSzymon Olewniczak    }
3628a638198SSzymon Olewniczak
363e8827d73SSzymon Olewniczak    protected function bez_html_array_to_style_list($arr) {
364e8827d73SSzymon Olewniczak        $output = '';
365e8827d73SSzymon Olewniczak        foreach ($arr as $k => $v) {
366e8827d73SSzymon Olewniczak            $output .= $k.': '. $v . ';';
3678a638198SSzymon Olewniczak        }
368e8827d73SSzymon Olewniczak        return $output;
369e8827d73SSzymon Olewniczak    }
370e8827d73SSzymon Olewniczak
371e8827d73SSzymon Olewniczak    protected function bez_html_irrtable($style) {
372e8827d73SSzymon Olewniczak        $argv = func_get_args();
373e8827d73SSzymon Olewniczak        $argc = func_num_args();
374e8827d73SSzymon Olewniczak        if (isset($style['table'])) {
375e8827d73SSzymon Olewniczak            $output = '<table style="'.self::bez_html_array_to_style_list($style['table']).'">';
376e8827d73SSzymon Olewniczak        } else {
377e8827d73SSzymon Olewniczak            $output = '<table>';
378e8827d73SSzymon Olewniczak        }
379e8827d73SSzymon Olewniczak
380e8827d73SSzymon Olewniczak        $tr_style  = '';
381e8827d73SSzymon Olewniczak        if (isset($style['tr'])) {
382e8827d73SSzymon Olewniczak            $tr_style = 'style="'.self::bez_html_array_to_style_list($style['tr']).'"';
383e8827d73SSzymon Olewniczak        }
384e8827d73SSzymon Olewniczak
385e8827d73SSzymon Olewniczak        $td_style  = '';
386e8827d73SSzymon Olewniczak        if (isset($style['td'])) {
387e8827d73SSzymon Olewniczak            $td_style = 'style="'.self::bez_html_array_to_style_list($style['td']).'"';
388e8827d73SSzymon Olewniczak        }
389e8827d73SSzymon Olewniczak
390e8827d73SSzymon Olewniczak        $row_max = 0;
391e8827d73SSzymon Olewniczak
392e8827d73SSzymon Olewniczak        for ($i = 1; $i < $argc; $i++) {
393e8827d73SSzymon Olewniczak            $row = $argv[$i];
394e8827d73SSzymon Olewniczak            $c = count($row);
395e8827d73SSzymon Olewniczak            if ($c > $row_max) {
396e8827d73SSzymon Olewniczak                $row_max = $c;
397e8827d73SSzymon Olewniczak            }
398e8827d73SSzymon Olewniczak        }
399e8827d73SSzymon Olewniczak
400e8827d73SSzymon Olewniczak        for ($j = 1; $j < $argc; $j++) {
401e8827d73SSzymon Olewniczak            $row = $argv[$j];
402e8827d73SSzymon Olewniczak            $output .= '<tr '.$tr_style.'>' . NL;
403e8827d73SSzymon Olewniczak            $c = count($row);
404e8827d73SSzymon Olewniczak            for ($i = 0; $i < $c; $i++) {
405e8827d73SSzymon Olewniczak                //last element
406e8827d73SSzymon Olewniczak                if ($i === $c - 1 && $c < $row_max) {
407e8827d73SSzymon Olewniczak                    $output .= '<td '.$td_style.' colspan="' . ( $row_max - $c + 1 ) . '">' . NL;
408e8827d73SSzymon Olewniczak                } else {
409e8827d73SSzymon Olewniczak                    $output .= '<td '.$td_style.'>' . NL;
410e8827d73SSzymon Olewniczak                }
411e8827d73SSzymon Olewniczak                $output .= $row[$i] . NL;
412e8827d73SSzymon Olewniczak                $output .= '</td>' . NL;
413e8827d73SSzymon Olewniczak            }
414e8827d73SSzymon Olewniczak            $output .= '</tr>' . NL;
415e8827d73SSzymon Olewniczak        }
416e8827d73SSzymon Olewniczak        $output .= '</table>' . NL;
417e8827d73SSzymon Olewniczak        return $output;
418e8827d73SSzymon Olewniczak    }
419e8827d73SSzymon Olewniczak
420e8827d73SSzymon Olewniczak    public function mail_notify_task_box($users=false, $replacements=array()) {
4218a638198SSzymon Olewniczak       $top_row = array(
4228a638198SSzymon Olewniczak            '<strong>'.$this->model->action->getLang('executor').': </strong>' .
423e8827d73SSzymon Olewniczak            $this->model->userFactory->get_user_full_name($this->assignee),
4248a638198SSzymon Olewniczak
4258a638198SSzymon Olewniczak            '<strong>'.$this->model->action->getLang('reporter').': </strong>' .
426e8827d73SSzymon Olewniczak            $this->model->userFactory->get_user_full_name($this->original_poster)
4278a638198SSzymon Olewniczak        );
4288a638198SSzymon Olewniczak
429e8827d73SSzymon Olewniczak        if ($this->task_program_name != '') {
4308a638198SSzymon Olewniczak            $top_row[] =
4318a638198SSzymon Olewniczak                '<strong>'.$this->model->action->getLang('task_type').': </strong>' .
432e8827d73SSzymon Olewniczak                $this->task_program_name;
4338a638198SSzymon Olewniczak        }
4348a638198SSzymon Olewniczak
4358a638198SSzymon Olewniczak        if ($this->cost != '') {
4368a638198SSzymon Olewniczak            $top_row[] =
4378a638198SSzymon Olewniczak                '<strong>'.$this->model->action->getLang('cost').': </strong>' .
4388a638198SSzymon Olewniczak                $this->cost;
4398a638198SSzymon Olewniczak        }
4408a638198SSzymon Olewniczak
4418a638198SSzymon Olewniczak        //BOTTOM ROW
4428a638198SSzymon Olewniczak        $bottom_row = array(
4438a638198SSzymon Olewniczak            '<strong>'.$this->model->action->getLang('plan_date').': </strong>' .
4448a638198SSzymon Olewniczak            $this->plan_date
4458a638198SSzymon Olewniczak        );
4468a638198SSzymon Olewniczak
4478a638198SSzymon Olewniczak        if ($this->all_day_event == '0') {
4488a638198SSzymon Olewniczak            $bottom_row[] =
4498a638198SSzymon Olewniczak                '<strong>'.$this->model->action->getLang('start_time').': </strong>' .
4508a638198SSzymon Olewniczak                $this->start_time;
4518a638198SSzymon Olewniczak            $bottom_row[] =
4528a638198SSzymon Olewniczak                '<strong>'.$this->model->action->getLang('finish_time').': </strong>' .
4538a638198SSzymon Olewniczak                $this->finish_time;
4548a638198SSzymon Olewniczak        }
4558a638198SSzymon Olewniczak
4568a638198SSzymon Olewniczak        $rep = array(
457e8827d73SSzymon Olewniczak            'content' => $this->content,
4588a638198SSzymon Olewniczak            'content_html' =>
4598a638198SSzymon Olewniczak                '<h2 style="font-size: 1.2em;">'.
460e8827d73SSzymon Olewniczak	               '<a href="'.$this->model->action->url('task', 'tid', $this->id).'">' .
4618a638198SSzymon Olewniczak		              '#z'.$this->id .
4628a638198SSzymon Olewniczak	               '</a> ' .
463e8827d73SSzymon Olewniczak	lcfirst($this->model->action->getLang('task_type_' . $this->type)) . ' ' .
4648a638198SSzymon Olewniczak    '(' .
465e8827d73SSzymon Olewniczak        lcfirst($this->model->action->getLang('task_' . $this->state)) .
4668a638198SSzymon Olewniczak    ')' .
4678a638198SSzymon Olewniczak                '</h2>' .
468e8827d73SSzymon Olewniczak                self::bez_html_irrtable(array(
4698a638198SSzymon Olewniczak                    'table' => array(
4708a638198SSzymon Olewniczak                        'border-collapse' => 'collapse',
4718a638198SSzymon Olewniczak                        'font-size' => '0.8em',
4728a638198SSzymon Olewniczak                        'width' => '100%'
4738a638198SSzymon Olewniczak                    ),
4748a638198SSzymon Olewniczak                    'td' => array(
4758a638198SSzymon Olewniczak                        'border-top' => '1px solid #8bbcbc',
4768a638198SSzymon Olewniczak                        'border-bottom' => '1px solid #8bbcbc',
4778a638198SSzymon Olewniczak                        'padding' => '.3em .5em'
4788a638198SSzymon Olewniczak                    )
479e8827d73SSzymon Olewniczak                ), $top_row, $bottom_row) . $this->content_html,
4808a638198SSzymon Olewniczak            'who' => $this->model->user_nick,
481e8827d73SSzymon Olewniczak            'when' => $this->create_date,
4828a638198SSzymon Olewniczak            'custom_content' => true
4838a638198SSzymon Olewniczak        );
4848a638198SSzymon Olewniczak
4858a638198SSzymon Olewniczak        $rep['action_color'] = '#e4f4f4';
4868a638198SSzymon Olewniczak        $rep['action_border_color'] = '#8bbcbc';
4878a638198SSzymon Olewniczak
4888a638198SSzymon Olewniczak        //$replacements can override $reps
4898a638198SSzymon Olewniczak        $rep = array_merge($rep, $replacements);
4908a638198SSzymon Olewniczak
4918a638198SSzymon Olewniczak        $this->mail_notify($rep, $users);
4928a638198SSzymon Olewniczak    }
4938a638198SSzymon Olewniczak
494e8827d73SSzymon Olewniczak    public function mail_notify_subscribents($replacements=array()) {
495e8827d73SSzymon Olewniczak        $this->mail_notify_task_box(false, $replacements);
4968a638198SSzymon Olewniczak    }
4978a638198SSzymon Olewniczak
498e8827d73SSzymon Olewniczak    public function mail_notify_add($users=false, $replacements=array()) {
4998a638198SSzymon Olewniczak        $replacements['action'] = $this->model->action->getLang('mail_task_added');
500e8827d73SSzymon Olewniczak        $this->mail_notify_task_box($users, $replacements);
5018a638198SSzymon Olewniczak    }
5028a638198SSzymon Olewniczak
5038a638198SSzymon Olewniczak    public function mail_notify_remind($users=false) {
5048a638198SSzymon Olewniczak        $replacements = array();
5058a638198SSzymon Olewniczak
5068a638198SSzymon Olewniczak        $replacements['action'] = $this->model->action->getLang('mail_task_remind');
5078a638198SSzymon Olewniczak        //we don't want any who
5088a638198SSzymon Olewniczak        $replacements['who_full_name'] = '';
5098a638198SSzymon Olewniczak
5108a638198SSzymon Olewniczak        //$users = array($this->executor);
511e8827d73SSzymon Olewniczak        $this->mail_notify_task_box($users, $replacements);
5128a638198SSzymon Olewniczak    }
5138a638198SSzymon Olewniczak
5148a638198SSzymon Olewniczak    public function mail_notify_invite($client) {
5158a638198SSzymon Olewniczak        $replacements = array();
5168a638198SSzymon Olewniczak
5178a638198SSzymon Olewniczak        $replacements['action'] = $this->model->action->getLang('mail_task_invite');
5188a638198SSzymon Olewniczak
5198a638198SSzymon Olewniczak        $users = array($client);
520e8827d73SSzymon Olewniczak        $this->mail_notify_task_box($users, $replacements);
5218a638198SSzymon Olewniczak    }
5228a638198SSzymon Olewniczak}
523