# fluent-boards/1.21/app/Hooks/Handlers/ScheduleHandler.php

FluentBoards – Project Management, Task Management, Goal Tracking, Kanban Board, and, Team Collaboration, version 1.21. 458 lines.

- Page: https://pluginprobe.com/plugins/fluent-boards/1.21/code/app/Hooks/Handlers/ScheduleHandler.php
- Raw: https://pluginprobe.com/plugins/fluent-boards/1.21/raw/app/Hooks/Handlers/ScheduleHandler.php
- Modified: 2024-06-10T11:57:46+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/fluent-boards/1.21/code/app/Hooks/Handlers/ScheduleHandler.php#L10-L20`.

```php
<?php

namespace FluentBoards\App\Hooks\Handlers;

use FluentBoards\App\Models\Board;
use FluentBoards\App\Models\Comment;
use FluentBoards\App\Models\Meta;
use FluentBoards\App\Models\Task;
use FluentBoards\App\Models\User;
use FluentBoards\App\Services\Constant;
use FluentBoards\App\Services\Helper;

class ScheduleHandler
{
    public function sendEmailForComment(
        $commentId,
        $usersToSendEmail,
        $current_user_id
    ) {
        try {
            $comment = Comment::find($commentId) ?? null;
            if ( ! $comment) {
                return;
            }
            if ('comment' != $comment->type) {
                return;
            }

            $task = Task::findOrFail($comment->task_id);
            if ( ! $task) {
                return;
            }
//            $assignees = $task->assignees;
            $board    = $task->board;
            $page_url = fluent_boards_page_url();

            $user = $task->user($comment->created_by);

            $userData = $this->getUserData($current_user_id);

            $boardUrl = $page_url.'boards/'.$board->id;
            $taskUrl  = $page_url.'boards/'.$board->id.'/tasks/'.$task->id.'-'
                        .substr($task->title, 0, 10);

            $userLinkTag  = '<strong>'.htmlspecialchars($user->display_name)
                            .'</strong>';
            $taskLinkTag  = '<a target="_blank" href="'
                            .htmlspecialchars($taskUrl).'">'
                            .htmlspecialchars($task->title).'</a>';
            $boardLinkTag = '<a target="_blank" href="'
                            .htmlspecialchars($boardUrl).'">'
                            .htmlspecialchars($board->title).'</a>';

            $data = [
                'body'        => 'commented on '.$taskLinkTag.' on '
                                 .$boardLinkTag.' board.',
                'pre_header'  => 'comment added in fluent task',
                'show_footer' => true,
                'comment'     => $comment->description,
                'userData'    => $userData,
                'site_url'    => site_url(),
                'site_title'  => get_bloginfo('name'),
                'site_logo'   => fluent_boards_site_logo(),
            ];

            $mailSubject = 'new comment added on task';
            $message     = Helper::loadView('emails.comment2', $data);
            $headers     = ['Content-Type: text/html; charset=UTF-8'];

            foreach ($usersToSendEmail as $email) {
                \wp_mail($email, $mailSubject, $message, $headers);
            }
        } catch (\Exception $e) {
            // do nothing // better to log here
        }
    }

    public function sendEmailForAddAssignee(
        $taskId,
        $newAssigneeId,
        $current_user_id
    ) {
        try {
            $task     = Task::findOrFail($taskId);
            $board    = $task->board;
            $assignee = User::findOrFail($newAssigneeId);

            $userData = $this->getUserData($current_user_id);

            $page_url     = fluent_boards_page_url();
            $boardUrl     = $page_url.'boards/'.$board->id;
            $boardLinkTag = '<a target="_blank" href="'
                            .htmlspecialchars($boardUrl).'">'
                            .htmlspecialchars($board->title).'</a>';

            if (null == $task->parent_id) {
                // this is a task
                $taskUrl     = $page_url.'boards/'.$board->id.'/tasks/'
                               .$task->id.'-'.substr($task->title, 0, 10);
                $taskLinkTag = '<a target="_blank" href="'
                               .htmlspecialchars($taskUrl).'">'
                               .htmlspecialchars($task->title).'</a>';
                $data        = [
                    'body'        => 'has assigned you to task '.$taskLinkTag
                                     .' on the board '.$boardLinkTag,
                    'pre_header'  => 'you have been assigned to task',
                    'show_footer' => true,
                    'userData'    => $userData,
                    'site_url'    => site_url(),
                    'site_title'  => get_bloginfo('name'),
                    'site_logo'   => fluent_boards_site_logo(),
                ];
            } else {
                // this is a subtask
                $task = $task->parentTask($task->parent_id);

                $taskUrl     = $page_url.'boards/'.$board->id.'/tasks/'
                               .$task->id.'-'.substr($task->title, 0, 10);
                $taskLinkTag = '<a target="_blank" href="'
                               .htmlspecialchars($taskUrl).'">'
                               .htmlspecialchars($task->title).'</a>';

                $data = [
                    'body'        => 'has assigned you to subtask <strong>'
                                     .$task->title.'</strong> of task '
                                     .$taskLinkTag.' on the board '
                                     .$boardLinkTag,
                    'pre_header'  => 'you have been assigned to subtask',
                    'show_footer' => true, 'user' => $assignee,
                    'userData'    => $userData,
                    'site_url'    => site_url(),
                    'site_title'  => get_bloginfo('name'),
                    'site_logo'   => fluent_boards_site_logo(),
                ];
            }

            $mailSubject = 'You have been assigned to task';
            $message     = Helper::loadView('emails.assignee2', $data);
            $headers     = ['Content-Type: text/html; charset=UTF-8'];


            \wp_mail($assignee->user_email, $mailSubject, $message, $headers);

        } catch (\Exception $e) {
            throw new \Exception('Error in sending mail to new assignees', 1);
        }
    }

    public function sendEmailForRemoveAssignee(
        $taskId,
        $newAssigneeId,
        $current_user_id
    ) {
        try {
            $task     = Task::findOrFail($taskId);
            $board    = $task->board;
            $assignee = User::findOrFail($newAssigneeId);

            $userData = $this->getUserData($current_user_id);

            $page_url = fluent_boards_page_url();

            $boardUrl     = $page_url.'boards/'.$board->id;
            $boardLinkTag = '<a target="_blank" href="'
                            .htmlspecialchars($boardUrl).'">'
                            .htmlspecialchars($board->title).'</a>';

            if (null == $task->parent_id) {
                // this is a task
                $taskUrl     = $page_url.'boards/'.$board->id.'/tasks/'
                               .$task->id.'-'.substr($task->title, 0, 10);
                $taskLinkTag = '<a target="_blank" href="'
                               .htmlspecialchars($taskUrl).'">'
                               .htmlspecialchars($task->title).'</a>';
                $data        = [
                    'body'        => 'has removed you from task '.$taskLinkTag
                                     .' on the board '.$boardLinkTag,
                    'pre_header'  => 'you have been removed from task',
                    'show_footer' => true,
                    'userData'    => $userData,
                    'site_url'    => site_url(),
                    'site_title'  => get_bloginfo('name'),
                    'site_logo'   => fluent_boards_site_logo(),
                ];
            } else {
                // this is a subtask
                $task = $task->parentTask($task->parent_id);

                $taskUrl     = $page_url.'boards/'.$board->id.'/tasks/'
                               .$task->id.'-'.substr($task->title, 0, 10);
                $taskLinkTag = '<a target="_blank" href="'
                               .htmlspecialchars($taskUrl).'">'
                               .htmlspecialchars($task->title).'</a>';

                $data = [
                    'body'        => 'has removed you from subtask <strong>'
                                     .$task->title.'</strong> of task '
                                     .$taskLinkTag.' on the board '
                                     .$boardLinkTag,
                    'pre_header'  => 'you have been removed from subtask',
                    'show_footer' => true,
                    'userData'    => $userData,
                ];
            }

            $mailSubject = 'You have been removed from task';
            $message     = Helper::loadView('emails.assignee2', $data);
            $headers     = ['Content-Type: text/html; charset=UTF-8'];

            \wp_mail($assignee->user_email, $mailSubject, $message, $headers);

        } catch (\Exception $e) {
            throw new \Exception('Error in sending mail to new assignees', 1);
        }
    }


    public function sendEmailForChangeStage(
        $taskId,
        $newAssigneeEmails,
        $current_user_id
    ) {
        try {
            $task  = Task::findOrFail($taskId);
            $board = $task->board;

            $userData = $this->getUserData($current_user_id);

            $page_url     = fluent_boards_page_url();
            $boardUrl     = $page_url.'boards/'.$board->id;
            $boardLinkTag = '<a target="_blank" href="'
                            .htmlspecialchars($boardUrl).'">'
                            .htmlspecialchars($board->title).'</a>';

            $taskUrl     = $page_url.'boards/'.$board->id.'/tasks/'.$task->id
                           .'-'.substr($task->title, 0, 10);
            $taskLinkTag = '<a target="_blank" href="'
                           .htmlspecialchars($taskUrl).'">'
                           .htmlspecialchars($task->title).'</a>';

            $data = [
                'body'        => 'has moved '.$taskLinkTag.' task to <strong>'
                                 .$task->stage->title
                                 .'</strong> stage of board '.$boardLinkTag,
                'pre_header'  => 'Task stage has been changed',
                'show_footer' => true,
                'userData'    => $userData,
                'site_url'    => site_url(),
                'site_title'  => get_bloginfo('name'),
                'site_logo'   => fluent_boards_site_logo(),
            ];


            $mailSubject = 'Task stage has been changed';
            $message     = Helper::loadView('emails.assignee2', $data);
            $headers     = ['Content-Type: text/html; charset=UTF-8'];

            foreach ($newAssigneeEmails as $assignee_email) {
                \wp_mail($assignee_email, $mailSubject, $message, $headers);
            }
        } catch (\Exception $e) {
            throw new \Exception('Error in sending mail to new assignees', 1);
        }
    }

    public function sendEmailForDueDateUpdate(
        $taskId,
        $newAssigneeEmails,
        $current_user_id
    ) {
        try {
            $task  = Task::findOrFail($taskId);
            $board = $task->board;

            $userData = $this->getUserData($current_user_id);

            $page_url     = fluent_boards_page_url();
            $boardUrl     = $page_url.'boards/'.$board->id;
            $boardLinkTag = '<a target="_blank" href="'
                            .htmlspecialchars($boardUrl).'">'
                            .htmlspecialchars($board->title).'</a>';

            $taskUrl     = $page_url.'boards/'.$board->id.'/tasks/'.$task->id
                           .'-'.substr($task->title, 0, 10);
            $taskLinkTag = '<a target="_blank" href="'
                           .htmlspecialchars($taskUrl).'">'
                           .htmlspecialchars($task->title).'</a>';

            $data = [
                'body'        => 'has updated due date of '.$taskLinkTag
                                 .' task to <strong>'.$task->due_at
                                 .'</strong> of board '.$boardLinkTag,
                'pre_header'  => 'Task due date has been changed',
                'show_footer' => true,
                'userData'    => $userData,
                'site_url'    => site_url(),
                'site_title'  => get_bloginfo('name'),
                'site_logo'   => fluent_boards_site_logo(),
            ];


            $mailSubject = 'Task due date has been changed';
            $message     = Helper::loadView('emails.assignee2', $data);
            $headers     = ['Content-Type: text/html; charset=UTF-8'];

            foreach ($newAssigneeEmails as $assignee_email) {
                \wp_mail($assignee_email, $mailSubject, $message, $headers);
            }
        } catch (\Exception $e) {
            throw new \Exception('Error in sending mail to new assignees', 1);
        }
    }

    public function sendEmailForArchivedTask(
        $taskId,
        $newAssigneeEmails,
        $current_user_id
    ) {
        try {
            $task  = Task::findOrFail($taskId);
            $board = $task->board;

            $userData = $this->getUserData($current_user_id);

            $page_url     = fluent_boards_page_url();
            $boardUrl     = $page_url.'boards/'.$board->id;
            $boardLinkTag = '<a target="_blank" href="'
                            .htmlspecialchars($boardUrl).'">'
                            .htmlspecialchars($board->title).'</a>';

            $taskUrl     = $page_url.'boards/'.$board->id.'/tasks/'.$task->id
                           .'-'.substr($task->title, 0, 10);
            $taskLinkTag = '<a target="_blank" href="'
                           .htmlspecialchars($taskUrl).'">'
                           .htmlspecialchars($task->title).'</a>';

            $data = [
                'body'        => 'has archived '.$taskLinkTag.' task of board '
                                 .$boardLinkTag,
                'pre_header'  => 'Task has been archived',
                'show_footer' => true,
                'userData'    => $userData,
                'site_url'    => site_url(),
                'site_title'  => get_bloginfo('name'),
                'site_logo'   => fluent_boards_site_logo(),
            ];


            $mailSubject = 'Task has been archived';
            $message     = Helper::loadView('emails.assignee2', $data);
            $headers     = ['Content-Type: text/html; charset=UTF-8'];

            foreach ($newAssigneeEmails as $assignee_email) {
                \wp_mail($assignee_email, $mailSubject, $message, $headers);
            }
        } catch (\Exception $e) {
            throw new \Exception('Error in sending mail to new assignees', 1);
        }
    }

    private function getUserData($userId)
    {
        $currentUser   = User::findOrFail($userId);
        $gravaterPhoto = fluent_boards_user_avatar($currentUser->user_email,
            $currentUser->display_name);

        return [
            'display_name' => $currentUser->display_name,
            'photo'        => $gravaterPhoto,
        ];
    }

    public function sendInvitationViaEmail($boardId, $email, $current_user_id)
    {
        try {
            $userData = $this->getUserData($current_user_id);

            $board = Board::findOrFail($boardId) ?? null;
            if (!$board) {
                return;
            }

            $page_url = fluent_boards_page_url();

            $hashCode = $this->hashGenerate(20);

            $siteUrl = add_query_arg( array(
                'fbs' => 1,
                'invitation' => 'board',
                'email' => $email,
                'hash' => $hashCode,
                'bid' => $boardId
            ), site_url('index.php') );

            $data = [
                'body'        => 'has invited you to join board: '. $board->title ,
                'pre_header'  => __('join board invitation in fluent boards', 'fluent-boards'),
                'btn_title'   => __('Join Board', 'fluent-boards'),
                'show_footer' => true,
                'userData'    => $userData,
                'boardLink'   => $siteUrl,
                'site_url'    => site_url(),
                'site_title'  => get_bloginfo('name'),
                'site_logo'   => fluent_boards_site_logo(),
            ];

            $mailSubject = 'Invitation for joining board';
            $message = Helper::loadView('emails.invite-external', $data);
            $headers = ['Content-Type: text/html; charset=UTF-8'];

            $this->saveHashByEmail($boardId, $email, $hashCode);

            \wp_mail($email, $mailSubject, $message, $headers);
        } catch (\Exception $e) {
            // do nothing // better to log here
        }
    }

    private function hashGenerate($chars)
    {
        $data = '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcefghijklmnopqrstuvwxyz';
        return substr(str_shuffle($data), 0, $chars);
    }

    private function saveHashByEmail($boardId, $email, $hash)
    {
        $this->deleteHashCode($boardId, $email);

        $fbs_meta = new Meta();
        $fbs_meta->object_id = $boardId;
        $fbs_meta->object_type = Constant::OBJECT_TYPE_BOARD;
        $fbs_meta->key = Constant::BOARD_INVITATION;
        $fbs_meta->value = ['email' => $email, 'hash' => $hash];
        $fbs_meta->save();
    }

    private function deleteHashCode($boardId, $email)
    {
        $activeHashCodes = $this->getActiveHashCodes($boardId);

        foreach ($activeHashCodes as $savedHash) {
            $value = maybe_unserialize($savedHash->value);
            if($value['email'] == $email){
                Meta::where('id', $savedHash->id)->delete();
            }
        }
    }

    private function getActiveHashCodes($boardId)
    {
        return Meta::query()->where('object_id', $boardId)
            ->where('object_type', Constant::OBJECT_TYPE_BOARD)
            ->where('key', Constant::BOARD_INVITATION)
            ->get();
    }

}

```
