PluginProbe
FluentBoards – Project Management, Task Management, Goal Tracking, Kanban Board, and, Team Collaboration / 1.32
FluentBoards – Project Management, Task Management, Goal Tracking, Kanban Board, and, Team Collaboration v1.32
2.1.0 2.0.15 2.0.12 2.0.10 2.0.4 2.0.1 2.0.0 1.95.3 1.95.2 1.95 1.91.6 trunk 1.11 1.12 1.13 1.20 1.21 1.22 1.23 1.30 1.31 1.32 1.35 1.40 1.41 All 42 releases
fluent-boards / app / Hooks / Handlers / ScheduleHandler.php

ScheduleHandler.php in FluentBoards – Project Management, Task Management, Goal Tracking, Kanban Board, and, Team Collaboration 1.32, at app/Hooks/Handlers/ScheduleHandler.php

538 lines 20.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentBoards\App\Hooks\Handlers;
4
5 use FluentBoards\App\Models\Board;
6 use FluentBoards\App\Models\Comment;
7 use FluentBoards\App\Models\Meta;
8 use FluentBoards\App\Models\Task;
9 use FluentBoards\App\Models\User;
10 use FluentBoards\App\Services\Constant;
11 use FluentBoards\App\Services\Helper;
12
13 class ScheduleHandler
14 {
15 public function sendEmailForComment(
16 $commentId,
17 $usersToSendEmail,
18 $current_user_id
19 ) {
20 try {
21 $comment = Comment::find($commentId) ?? null;
22 if ( ! $comment) {
23 return;
24 }
25 if (!in_array($comment->type, ['comment', 'reply'])) {
26 return;
27 }
28
29 $task = Task::findOrFail($comment->task_id);
30 if ( ! $task) {
31 return;
32 }
33
34 $board = $task->board;
35
36 $page_url = site_url('/') . '?redirect=to_task&taskId='.$task->id;
37
38 $user = $task->user($comment->created_by);
39
40 $userData = $this->getUserData($current_user_id);
41
42 $boardUrl = $page_url.'boards/'.$board->id;
43 $taskUrl = $page_url.'boards/'.$board->id.'/tasks/'.$task->id.'-'
44 .substr($task->title, 0, 10);
45
46 $userLinkTag = '<strong>'.htmlspecialchars($user->display_name)
47 .'</strong>';
48 $taskLinkTag = '<a target="_blank" href="'
49 .htmlspecialchars($taskUrl).'">'
50 .htmlspecialchars($task->title).'</a>';
51 $boardLinkTag = '<a target="_blank" href="'
52 .htmlspecialchars($boardUrl).'">'
53 .htmlspecialchars($board->title).'</a>';
54
55 $preparedBody = 'commented on '.$taskLinkTag.' on '
56 .$boardLinkTag.' board.';
57 $preHeader = 'New comment has been added on task';
58 $mailSubject = 'New comment has been added on task';
59
60
61 if ($comment->type == 'reply')
62 {
63 $preparedBody = 'replied on your comment on '.$taskLinkTag.' on '
64 .$boardLinkTag.' board.';
65
66 $preHeader = 'A reply has been added to your comment on a task.';
67 $mailSubject = 'New Reply on Your Task Comment';
68 }
69
70 $data = [
71 'body' => $preparedBody,
72 'comment_link' => $page_url,
73 'pre_header' => $preHeader,
74 'show_footer' => true,
75 'comment' => $comment->description,
76 'userData' => $userData,
77 'site_url' => site_url(),
78 'site_title' => get_bloginfo('name'),
79 'site_logo' => fluent_boards_site_logo(),
80 ];
81
82 $message = Helper::loadView('emails.comment2', $data);
83 $headers = ['Content-Type: text/html; charset=UTF-8'];
84
85 foreach ($usersToSendEmail as $email) {
86 \wp_mail($email, $mailSubject, $message, $headers);
87 }
88 } catch (\Exception $e) {
89 // do nothing // better to log here
90 }
91 }
92
93 public function sendEmailForMention($commentId, $usersToSendEmail, $current_user_id)
94 {
95 try {
96 $comment = Comment::find($commentId) ?? null;
97 if ( ! $comment) {
98 return;
99 }
100
101 if (!in_array($comment->type, ['comment', 'reply'])) {
102 return;
103 }
104
105 $task = Task::findOrFail($comment->task_id);
106 if ( ! $task) {
107 return;
108 }
109 // $assignees = $task->assignees;
110 $board = $task->board;
111
112 $page_url = site_url('/') . '?redirect=to_task&taskId='.$task->id;
113
114 $user = $task->user($comment->created_by);
115
116 $userData = $this->getUserData($current_user_id);
117
118 $boardUrl = $page_url.'boards/'.$board->id;
119 $taskUrl = $page_url.'boards/'.$board->id.'/tasks/'.$task->id.'-'
120 .substr($task->title, 0, 10);
121
122 $userLinkTag = '<strong>'.htmlspecialchars($user->display_name)
123 .'</strong>';
124 $taskLinkTag = '<a target="_blank" href="'
125 .htmlspecialchars($taskUrl).'">'
126 .htmlspecialchars($task->title).'</a>';
127 $boardLinkTag = '<a target="_blank" href="'
128 .htmlspecialchars($boardUrl).'">'
129 .htmlspecialchars($board->title).'</a>';
130
131 $commentLink = $taskUrl . '?comment='.$comment->id;
132
133 $data = [
134 'body' => 'mentioned you in a comment on '.$taskLinkTag.' on '
135 .$boardLinkTag.' board.',
136 'comment_link' => $page_url,
137 'pre_header' => 'You are mentioned in a comment',
138 'show_footer' => true,
139 'comment' => $comment->description,
140 'userData' => $userData,
141 'site_url' => site_url(),
142 'site_title' => get_bloginfo('name'),
143 'site_logo' => fluent_boards_site_logo(),
144 ];
145
146 $mailSubject = 'You are mentioned in a comment';
147 $message = Helper::loadView('emails.comment2', $data);
148 $headers = ['Content-Type: text/html; charset=UTF-8'];
149
150 foreach ($usersToSendEmail as $email) {
151 \wp_mail($email, $mailSubject, $message, $headers);
152 }
153 } catch (\Exception $e) {
154 // do nothing // better to log here
155 }
156 }
157
158 public function sendEmailForAddAssignee(
159 $taskId,
160 $newAssigneeId,
161 $current_user_id
162 ) {
163 try {
164 $task = Task::findOrFail($taskId);
165 $board = $task->board;
166 $assignee = User::findOrFail($newAssigneeId);
167
168 $userData = $this->getUserData($current_user_id);
169
170 $page_url = fluent_boards_page_url();
171 $boardUrl = $page_url.'boards/'.$board->id;
172 $boardLinkTag = '<a target="_blank" href="'
173 .htmlspecialchars($boardUrl).'">'
174 .htmlspecialchars($board->title).'</a>';
175
176 if (null == $task->parent_id) {
177 // this is a task
178 $taskUrl = $page_url.'boards/'.$board->id.'/tasks/'
179 .$task->id.'-'.substr($task->title, 0, 10);
180 $taskLinkTag = '<a target="_blank" href="'
181 .htmlspecialchars($taskUrl).'">'
182 .htmlspecialchars($task->title).'</a>';
183 $data = [
184 'body' => 'has assigned you to task '.$taskLinkTag
185 .' on the board '.$boardLinkTag,
186 'pre_header' => 'you have been assigned to task',
187 'show_footer' => true,
188 'userData' => $userData,
189 'site_url' => site_url(),
190 'site_title' => get_bloginfo('name'),
191 'site_logo' => fluent_boards_site_logo(),
192 ];
193 } else {
194 // this is a subtask
195 $task = $task->parentTask($task->parent_id);
196
197 $taskUrl = $page_url.'boards/'.$board->id.'/tasks/'
198 .$task->id.'-'.substr($task->title, 0, 10);
199 $taskLinkTag = '<a target="_blank" href="'
200 .htmlspecialchars($taskUrl).'">'
201 .htmlspecialchars($task->title).'</a>';
202
203 $data = [
204 'body' => 'has assigned you to subtask <strong>'
205 .$task->title.'</strong> of task '
206 .$taskLinkTag.' on the board '
207 .$boardLinkTag,
208 'pre_header' => 'you have been assigned to subtask',
209 'show_footer' => true, 'user' => $assignee,
210 'userData' => $userData,
211 'site_url' => site_url(),
212 'site_title' => get_bloginfo('name'),
213 'site_logo' => fluent_boards_site_logo(),
214 ];
215 }
216
217 $mailSubject = 'You have been assigned to task';
218 $message = Helper::loadView('emails.assignee2', $data);
219 $headers = ['Content-Type: text/html; charset=UTF-8'];
220
221
222 \wp_mail($assignee->user_email, $mailSubject, $message, $headers);
223
224 } catch (\Exception $e) {
225 throw new \Exception('Error in sending mail to new assignees', 1);
226 }
227 }
228
229 public function sendEmailForRemoveAssignee(
230 $taskId,
231 $newAssigneeId,
232 $current_user_id
233 ) {
234 try {
235 $task = Task::findOrFail($taskId);
236 $board = $task->board;
237 $assignee = User::findOrFail($newAssigneeId);
238
239 $userData = $this->getUserData($current_user_id);
240
241 $page_url = fluent_boards_page_url();
242
243 $boardUrl = $page_url.'boards/'.$board->id;
244 $boardLinkTag = '<a target="_blank" href="'
245 .htmlspecialchars($boardUrl).'">'
246 .htmlspecialchars($board->title).'</a>';
247
248 if (null == $task->parent_id) {
249 // this is a task
250 $taskUrl = $page_url.'boards/'.$board->id.'/tasks/'
251 .$task->id.'-'.substr($task->title, 0, 10);
252 $taskLinkTag = '<a target="_blank" href="'
253 .htmlspecialchars($taskUrl).'">'
254 .htmlspecialchars($task->title).'</a>';
255 $data = [
256 'body' => 'has removed you from task '.$taskLinkTag
257 .' on the board '.$boardLinkTag,
258 'pre_header' => 'you have been removed from task',
259 'show_footer' => true,
260 'userData' => $userData,
261 'site_url' => site_url(),
262 'site_title' => get_bloginfo('name'),
263 'site_logo' => fluent_boards_site_logo(),
264 ];
265 } else {
266 // this is a subtask
267 $task = $task->parentTask($task->parent_id);
268
269 $taskUrl = $page_url.'boards/'.$board->id.'/tasks/'
270 .$task->id.'-'.substr($task->title, 0, 10);
271 $taskLinkTag = '<a target="_blank" href="'
272 .htmlspecialchars($taskUrl).'">'
273 .htmlspecialchars($task->title).'</a>';
274
275 $data = [
276 'body' => 'has removed you from subtask <strong>'
277 .$task->title.'</strong> of task '
278 .$taskLinkTag.' on the board '
279 .$boardLinkTag,
280 'pre_header' => 'you have been removed from subtask',
281 'show_footer' => true,
282 'userData' => $userData,
283 ];
284 }
285
286 $mailSubject = 'You have been removed from task';
287 $message = Helper::loadView('emails.assignee2', $data);
288 $headers = ['Content-Type: text/html; charset=UTF-8'];
289
290 \wp_mail($assignee->user_email, $mailSubject, $message, $headers);
291
292 } catch (\Exception $e) {
293 throw new \Exception('Error in sending mail to new assignees', 1);
294 }
295 }
296
297
298 public function sendEmailForChangeStage(
299 $taskId,
300 $newAssigneeEmails,
301 $current_user_id
302 ) {
303 try {
304 $task = Task::findOrFail($taskId);
305 $board = $task->board;
306
307 $userData = $this->getUserData($current_user_id);
308
309 $page_url = fluent_boards_page_url();
310 $boardUrl = $page_url.'boards/'.$board->id;
311 $boardLinkTag = '<a target="_blank" href="'
312 .htmlspecialchars($boardUrl).'">'
313 .htmlspecialchars($board->title).'</a>';
314
315 $taskUrl = $page_url.'boards/'.$board->id.'/tasks/'.$task->id
316 .'-'.substr($task->title, 0, 10);
317 $taskLinkTag = '<a target="_blank" href="'
318 .htmlspecialchars($taskUrl).'">'
319 .htmlspecialchars($task->title).'</a>';
320
321 $data = [
322 'body' => 'has moved '.$taskLinkTag.' task to <strong>'
323 .$task->stage->title
324 .'</strong> stage of board '.$boardLinkTag,
325 'pre_header' => 'Task stage has been changed',
326 'show_footer' => true,
327 'userData' => $userData,
328 'site_url' => site_url(),
329 'site_title' => get_bloginfo('name'),
330 'site_logo' => fluent_boards_site_logo(),
331 ];
332
333
334 $mailSubject = 'Task stage has been changed';
335 $message = Helper::loadView('emails.assignee2', $data);
336 $headers = ['Content-Type: text/html; charset=UTF-8'];
337
338 foreach ($newAssigneeEmails as $assignee_email) {
339 \wp_mail($assignee_email, $mailSubject, $message, $headers);
340 }
341 } catch (\Exception $e) {
342 throw new \Exception('Error in sending mail to new assignees', 1);
343 }
344 }
345
346 public function sendEmailForDueDateUpdate(
347 $taskId,
348 $newAssigneeEmails,
349 $current_user_id
350 ) {
351 try {
352 $task = Task::findOrFail($taskId);
353 $board = $task->board;
354
355 $userData = $this->getUserData($current_user_id);
356
357 $page_url = fluent_boards_page_url();
358 $boardUrl = $page_url.'boards/'.$board->id;
359 $boardLinkTag = '<a target="_blank" href="'
360 .htmlspecialchars($boardUrl).'">'
361 .htmlspecialchars($board->title).'</a>';
362
363 $taskUrl = $page_url.'boards/'.$board->id.'/tasks/'.$task->id
364 .'-'.substr($task->title, 0, 10);
365 $taskLinkTag = '<a target="_blank" href="'
366 .htmlspecialchars($taskUrl).'">'
367 .htmlspecialchars($task->title).'</a>';
368
369 $data = [
370 'body' => 'has updated due date of '.$taskLinkTag
371 .' task to <strong>'.$task->due_at
372 .'</strong> of board '.$boardLinkTag,
373 'pre_header' => 'Task due date has been changed',
374 'show_footer' => true,
375 'userData' => $userData,
376 'site_url' => site_url(),
377 'site_title' => get_bloginfo('name'),
378 'site_logo' => fluent_boards_site_logo(),
379 ];
380
381
382 $mailSubject = 'Task due date has been changed';
383 $message = Helper::loadView('emails.assignee2', $data);
384 $headers = ['Content-Type: text/html; charset=UTF-8'];
385
386 foreach ($newAssigneeEmails as $assignee_email) {
387 \wp_mail($assignee_email, $mailSubject, $message, $headers);
388 }
389 } catch (\Exception $e) {
390 throw new \Exception('Error in sending mail to new assignees', 1);
391 }
392 }
393
394 public function sendEmailForArchivedTask(
395 $taskId,
396 $newAssigneeEmails,
397 $current_user_id
398 ) {
399 try {
400 $task = Task::findOrFail($taskId);
401 $board = $task->board;
402
403 $userData = $this->getUserData($current_user_id);
404
405 $page_url = fluent_boards_page_url();
406 $boardUrl = $page_url.'boards/'.$board->id;
407 $boardLinkTag = '<a target="_blank" href="'
408 .htmlspecialchars($boardUrl).'">'
409 .htmlspecialchars($board->title).'</a>';
410
411 $taskUrl = $page_url.'boards/'.$board->id.'/tasks/'.$task->id
412 .'-'.substr($task->title, 0, 10);
413 $taskLinkTag = '<a target="_blank" href="'
414 .htmlspecialchars($taskUrl).'">'
415 .htmlspecialchars($task->title).'</a>';
416
417 $data = [
418 'body' => 'has archived '.$taskLinkTag.' task of board '
419 .$boardLinkTag,
420 'pre_header' => 'Task has been archived',
421 'show_footer' => true,
422 'userData' => $userData,
423 'site_url' => site_url(),
424 'site_title' => get_bloginfo('name'),
425 'site_logo' => fluent_boards_site_logo(),
426 ];
427
428
429 $mailSubject = 'Task has been archived';
430 $message = Helper::loadView('emails.assignee2', $data);
431 $headers = ['Content-Type: text/html; charset=UTF-8'];
432
433 foreach ($newAssigneeEmails as $assignee_email) {
434 \wp_mail($assignee_email, $mailSubject, $message, $headers);
435 }
436 } catch (\Exception $e) {
437 throw new \Exception('Error in sending mail to new assignees', 1);
438 }
439 }
440
441 private function getUserData($userId)
442 {
443 $currentUser = User::findOrFail($userId);
444 $gravaterPhoto = fluent_boards_user_avatar($currentUser->user_email,
445 $currentUser->display_name);
446
447 return [
448 'display_name' => $currentUser->display_name,
449 'photo' => $gravaterPhoto,
450 ];
451 }
452
453 public function sendInvitationViaEmail($boardId, $email, $current_user_id)
454 {
455 try {
456 $userData = $this->getUserData($current_user_id);
457
458 $board = Board::findOrFail($boardId) ?? null;
459 if (!$board) {
460 return;
461 }
462
463 $page_url = fluent_boards_page_url();
464
465 $hashCode = $this->hashGenerate(20);
466
467 $siteUrl = add_query_arg( array(
468 'fbs' => 1,
469 'invitation' => 'board',
470 'email' => $email,
471 'hash' => $hashCode,
472 'bid' => $boardId
473 ), site_url('index.php') );
474
475 $data = [
476 'body' => 'has invited you to join board: '. $board->title ,
477 'pre_header' => __('join board invitation in fluent boards', 'fluent-boards'),
478 'btn_title' => __('Join Board', 'fluent-boards'),
479 'show_footer' => true,
480 'userData' => $userData,
481 'boardLink' => $siteUrl,
482 'site_url' => site_url(),
483 'site_title' => get_bloginfo('name'),
484 'site_logo' => fluent_boards_site_logo(),
485 ];
486
487 $mailSubject = 'Invitation for joining board';
488 $message = Helper::loadView('emails.invite-external', $data);
489 $headers = ['Content-Type: text/html; charset=UTF-8'];
490
491 $this->saveHashByEmail($boardId, $email, $hashCode);
492
493 \wp_mail($email, $mailSubject, $message, $headers);
494 } catch (\Exception $e) {
495 // do nothing // better to log here
496 }
497 }
498
499 private function hashGenerate($chars)
500 {
501 $data = '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcefghijklmnopqrstuvwxyz';
502 return substr(str_shuffle($data), 0, $chars);
503 }
504
505 private function saveHashByEmail($boardId, $email, $hash)
506 {
507 $this->deleteHashCode($boardId, $email);
508
509 $fbs_meta = new Meta();
510 $fbs_meta->object_id = $boardId;
511 $fbs_meta->object_type = Constant::OBJECT_TYPE_BOARD;
512 $fbs_meta->key = Constant::BOARD_INVITATION;
513 $fbs_meta->value = ['email' => $email, 'hash' => $hash];
514 $fbs_meta->save();
515 }
516
517 private function deleteHashCode($boardId, $email)
518 {
519 $activeHashCodes = $this->getActiveHashCodes($boardId);
520
521 foreach ($activeHashCodes as $savedHash) {
522 $value = maybe_unserialize($savedHash->value);
523 if($value['email'] == $email){
524 Meta::where('id', $savedHash->id)->delete();
525 }
526 }
527 }
528
529 private function getActiveHashCodes($boardId)
530 {
531 return Meta::query()->where('object_id', $boardId)
532 ->where('object_type', Constant::OBJECT_TYPE_BOARD)
533 ->where('key', Constant::BOARD_INVITATION)
534 ->get();
535 }
536
537 }
538