# taskbuilder/6.0.6/includes/class-wppm-functions.php

Taskbuilder – Project Management &amp; Task Management Tool With Kanban Board, version 6.0.6. 1,392 lines.

- Page: https://pluginprobe.com/plugins/taskbuilder/6.0.6/code/includes/class-wppm-functions.php
- Raw: https://pluginprobe.com/plugins/taskbuilder/6.0.6/raw/includes/class-wppm-functions.php
- Modified: 2026-09-17T18:30:20+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/taskbuilder/6.0.6/code/includes/class-wppm-functions.php#L10-L20`.

```php
<?php
if ( ! defined( 'ABSPATH' ) ) {
  exit; // Exit if accessed directly
}
if ( ! class_exists( 'WPPM_Functions' ) ) :
    final class WPPM_Functions {
        // Array sanitization
        public static function sanitize_array($array) {
            if(!empty($array)){
                foreach ( $array as $key => $value ) {
                    if ( is_array( $value ) ) {
                        $value = $this->sanitize_array($value);
                    }
                    else {
                        $value = sanitize_text_field( wp_unslash( $value ) );
                    }
                }
            }
            return $array;
        }

        public static function create_project($args){
            global $wpdb,$current_user;
            $default_proj_status = get_option('wppm_default_project_status');
            $values = array(
                'created_by'=>$current_user->ID,
                'project_name'=>$args['name'],
                'description'=>isset($args['wppm_proj_description']) ? $args['wppm_proj_description']:"",
                'start_date'=>isset($args['wppm_start_date']) ?$args['wppm_start_date']:"",
                'end_date'=>isset($args['wppm_end_date'])? $args['wppm_end_date']:"",
                'status'=>isset($args['status'])? $args['status']:$default_proj_status,
                'cat_id'=>isset($args['wppm_create_project_category']) ? $args['wppm_create_project_category']:"",
                'users'=>isset($args['user_names']) ? implode(",",$args['user_names']):"",
                'date_created'=>isset($args['date_created'])? $args['date_created']:wp_date("Y-m-d h:i:sa"),
                'project_auth_code'=> self::getRandomString(10)

            );
            $wpdb->insert($wpdb->prefix .'wppm_project', $values);
            $project_id = $wpdb->insert_id;
            return $project_id;
        }

        public static function create_task($args){
            global $wpdb,$current_user;
            $default_task_status = get_option('wppm_default_task_status');
            $values = array(
                'created_by'=>(isset($args['created_by'])) ? $args['created_by']: $current_user->ID,
                'task_name'=>$args['name'],
                'description'=>(isset($args['wppm_task_description']))?$args['wppm_task_description']:"",
                'project'=>(isset($args['wppm_task_project']))?$args['wppm_task_project']:"",
                'start_date'=>(isset($args['wppm_task_start_date']))?$args['wppm_task_start_date']:"",
                'end_date'=>(isset($args['wppm_task_end_date']))?$args['wppm_task_end_date']:"",
                'status'=>(isset($args['status']))?$args['status']:$default_task_status,
                'priority'=>(isset($args['wppm_create_task_priority']))?$args['wppm_create_task_priority']:"",
                'users'=>(!empty($args['user_names']))?implode(",",$args['user_names']):"",
                'date_created'=>isset($args['date_created'])? $args['date_created']:wp_date("Y-m-d h:i:sa"),
                'task_auth_code'=> self::getRandomString(10),
                'active'=>1,
                'parent_task_id'=>(isset($args['parent_task_id']))?absint($args['parent_task_id']):0
            );
            $wpdb->insert($wpdb->prefix .'wppm_task', $values);
            $task_id = $wpdb->insert_id;
            return $task_id;
        }

        public static function create_checklist($args){
            global $wpdb,$current_user,$wppmfunction;
            $values = array(
                'task_id'=>$args['task_id'],
                'checklist_name' => $args['checklist_name'],
                'created_by'=> $args['created_by']
            );
            $wpdb->insert($wpdb->prefix .'wppm_checklist', $values);
            $checklist_id = $wpdb->insert_id;
            return $checklist_id;
        }

        public static function create_checklist_item($args){
            global $wpdb,$current_user,$wppmfunction;
            $chk_items_values = array(
                'checklist_id' => $args['checklist_id'],
                'item_name' => $args['item_name'],
                'checked'=>$args['checked'],
                'members'=>$args['members'],
                'due_date'=> $args['due_date']
            );
            $wpdb->insert($wpdb->prefix .'wppm_checklist_items', $chk_items_values);
            $checklist_item_id = $wpdb->insert_id;
            return $checklist_item_id;
        }

        public static function wppm_submit_task_comment($args){
            global $wpdb;
            $wpdb->insert($wpdb->prefix.'wppm_task_comment',$args);
            $comment_id = $wpdb->insert_id;
            return $comment_id;
        }

        public static function wppm_submit_task_comment_meta($args){
            global $wpdb;
            $wpdb->insert($wpdb->prefix.'wppm_task_comment_meta',$args);
            $comment_meta_id = $wpdb->insert_id;
            return $comment_meta_id;
        }

        public static function wppm_submit_proj_comment($args){
            global $wpdb;
            $wpdb->insert($wpdb->prefix.'wppm_project_comment',$args);
            $comment_id = $wpdb->insert_id;
            return $comment_id;
        }

        public static function wppm_submit_proj_comment_meta($args){
            global $wpdb;
            $wpdb->insert($wpdb->prefix.'wppm_project_comment_meta',$args);
            $comment_meta_id = $wpdb->insert_id;
            return $comment_meta_id;
        }

        // Random string
        public static function getRandomString($length = 8) {
            $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
            $string = '';
            for ($i = 0; $i < $length; $i++) {
            $string .= $characters[wp_rand(0, strlen($characters) - 1)];
            }
            return $string;
        }

        public static function wppm_get_auth_code($id){
            global $wpdb;
            $id = absint($id);
            $auth_code = $wpdb->get_var(
                $wpdb->prepare(
                    "SELECT task_auth_code 
                    FROM {$wpdb->prefix}wppm_task 
                    WHERE id = %d",
                    ($id)
                )
            );
            $auth_code = isset($auth_code) ? $auth_code : "";
            return $auth_code;
        }

        public static function wppm_get_proj_auth_code($id){
            global $wpdb;
            $id = absint($id);
            $auth_code = $wpdb->get_var(
                $wpdb->prepare(
                    "SELECT project_auth_code 
                    FROM {$wpdb->prefix}wppm_project 
                    WHERE id = %d",
                    ($id)
                )
            );
            $auth_code = isset($auth_code) ? $auth_code : "";
            return $auth_code;
        }

        public static function get_task_fields($task_id,$select_field){
            global $wpdb;
            $task_id = absint($task_id);
            $task_field_value = '';
            $allowed_fields = array(
                'id',
                'created_by',
                'task_name',
                'description',
                'project',
                'start_date',
			    'end_date',
			    'status',
			    'priority',
			    'users',
                'date_created',
                'task_auth_code'
            );

            // Validate column name
            if ( ! in_array( $select_field, $allowed_fields, true ) ) {
                return '';
            }
            if (apply_filters('wppm_get_select_field',true,$task_id,$select_field)) {
              $get_task_field_value = $wpdb->get_var($wpdb->prepare("SELECT $select_field FROM {$wpdb->prefix}wppm_task WHERE id = %d", $task_id));
              $task_field_value = $get_task_field_value ? $get_task_field_value : '';
            }
            return stripslashes($task_field_value);
        }

        public static function get_project_fields($proj_id,$select_field){
            global $wpdb;
            $proj_id = absint($proj_id);
            $project_field_value = '';
            $allowed_fields = array(
                'id',
                'created_by',
                'project_name',
                'description',
                'start_date',
			    'end_date',
			    'status',
			    'cat_id',
			    'users',
                'date_created',    
                'project_auth_code'
            );

            // Validate column name
            if ( ! in_array( $select_field, $allowed_fields, true ) ) {
                return '';
            }
            if (apply_filters('wppm_get_select_proj_field',true,$proj_id,$select_field)) {
              $get_project_field_value = $wpdb->get_var($wpdb->prepare("SELECT $select_field FROM {$wpdb->prefix}wppm_project WHERE id = %d", $proj_id));
              $project_field_value = $get_project_field_value ? $get_project_field_value : '';
            }
            return stripslashes($project_field_value);
        }

        public function get_task($task_id){
            global $wpdb;
            $task_data = array();
            $task_id = absint($task_id);
            $task = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task WHERE id = %d", $task_id));
            if( $task ){
                $task_data = json_decode(wp_json_encode($task), true);
            }
            return $task_data;
        }

        public function get_checklist($task_id){
            global $wpdb;
            $task_id = absint($task_id);
            $checklist_data = array();
            $checklist = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_checklist WHERE task_id = %d", $task_id));
            if( $checklist ){
                $checklist_data = json_decode(wp_json_encode($checklist), true);
            }
            return $checklist_data;
        }

        public function get_checklist_items($checklist_id){
            global $wpdb;
            $checklist_items_data = array();
            $checklist_id = absint($checklist_id);
            $checklist_items = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_checklist_items WHERE checklist_id = %d", $checklist_id));
            if( $checklist_items ){
                $checklist_items_data = json_decode(wp_json_encode($checklist_items), true);
            }
            return $checklist_items_data;
        }

        public function get_subtasks($task_id){
            global $wpdb;
            $task_id = absint($task_id);
            $subtasks_data = array();
            $subtasks = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task WHERE parent_task_id = %d ORDER BY id ASC", $task_id));
            if( $subtasks ){
                $subtasks_data = json_decode(wp_json_encode($subtasks), true);
            }
            return $subtasks_data;
        }

        public function get_subtask_progress($task_id){
            global $wpdb;
            $task_id = absint($task_id);
            $completed_status_id = 4;
            $total = (int) $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM {$wpdb->prefix}wppm_task WHERE parent_task_id = %d", $task_id));
            $completed = (int) $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM {$wpdb->prefix}wppm_task WHERE parent_task_id = %d AND status = %d", $task_id, $completed_status_id));
            return array('total'=>$total,'completed'=>$completed);
        }

        // Deletes a task along with its subtasks (and each one's checklists/comments/attachments).
        public static function delete_task_and_children($task_id){
            global $wpdb;
            $task_id = absint($task_id);
            $child_ids = $wpdb->get_col($wpdb->prepare("SELECT id FROM {$wpdb->prefix}wppm_task WHERE parent_task_id = %d", $task_id));
            foreach($child_ids as $child_id){
                self::delete_task_and_children($child_id);
            }
            $thread_attachment_ids = $wpdb->get_results($wpdb->prepare("SELECT attachment_ids FROM {$wpdb->prefix}wppm_task_comment WHERE task_id = %d", $task_id));
            if(!empty($thread_attachment_ids)){
                foreach ($thread_attachment_ids as $thread_attachment_id){
                    $attachment_ids_temp = array();
                    if($thread_attachment_id->attachment_ids){
                        $attachment_ids_temp = explode(',', $thread_attachment_id->attachment_ids);
                    }
                    foreach ($attachment_ids_temp as $attachment_id){
                        $attachment_id = absint($attachment_id);
                        $result = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_attachments WHERE id = %d", $attachment_id));
                        if(!empty($result)){
                            $attach_result = $wpdb->get_results($wpdb->prepare("SELECT file_path FROM {$wpdb->prefix}wppm_attachments WHERE file_path = %s", $result->file_path));
                            if(file_exists($result->file_path) && count($attach_result) < 2){
                                wp_delete_file($result->file_path);
                            }
                            $wpdb->delete($wpdb->prefix.'wppm_attachments', array('id' => $attachment_id));
                        }
                    }
                }
            }
            $checklists = $wpdb->get_results($wpdb->prepare("SELECT id FROM {$wpdb->prefix}wppm_checklist WHERE task_id = %d", $task_id));
            if(!empty($checklists)){
                foreach($checklists as $checklist){
                    $checklist_id = absint($checklist->id);
                    $wpdb->delete($wpdb->prefix.'wppm_checklist_items', array('checklist_id'=>$checklist_id));
                    $wpdb->delete($wpdb->prefix.'wppm_checklist', array('id'=>$checklist_id));
                }
            }
            $wpdb->delete($wpdb->prefix.'wppm_task', array('id'=>$task_id));
            $wpdb->delete($wpdb->prefix.'wppm_task_meta', array('task_id'=>$task_id));
            $wpdb->delete($wpdb->prefix.'wppm_task_comment', array('task_id'=>$task_id));
            $wpdb->delete($wpdb->prefix.'wppm_task_comment_meta', array('task_id'=>$task_id));
            do_action('wppm_after_delete_task', $task_id);
        }

        public function get_project($project_id){
            global $wpdb;
            $project_data = array();
            $project_id = absint($project_id);
            $project = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_project WHERE id = %d", $project_id));
            if( $project ){
                $project_data = json_decode(wp_json_encode($project), true);
            }
            return $project_data;
        }

        public function get_attachment($attachment_id){
            global $wpdb;
            $attachment_data = array();
            $attachment_id = absint($attachment_id);
            $attachment = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_attachments WHERE id = %d", $attachment_id));
            if( $attachment ){
                $attachment_data = json_decode(wp_json_encode($attachment), true);
            }
            return $attachment_data;
        }

        public function has_permission($permission, $task_id){
            global $current_user,$wppmfunction,$wpdb;
            $task_id = absint($task_id);
            $wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
            $wppm_edit_tasks_permission = get_option('wppm_default_edit_tasks_permission');
            $wppm_allow_coworkers_add_checklist = get_option('wppm_allow_coworkers_add_checklist');
            $wppm_allow_coworkers_create_task = get_option('wppm_allow_coworkers_create_task');
            $wppm_allow_coworkers_change_status = get_option('wppm_allow_coworkers_change_status');
            $wppm_allow_coworkers_assign_users = get_option('wppm_allow_coworkers_assign_users');
            if(empty($comment_id)){
                $comment_id = 0;
            }
            $comment_id = absint($comment_id);
            $task_data = $wppmfunction->get_task($task_id);
            $task_comment = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task_comment WHERE task_id = %d AND id = %d", $task_id, $comment_id));
            
            if(!empty($task_data['project'])){
                $project_id = $task_data['project'];
                $project_id = absint($project_id);
                $project_data = $wppmfunction->get_project($project_id);
                $cu_user_id = absint($current_user->ID);
                $project_user_role = $wpdb->get_var($wpdb->prepare("SELECT role_id FROM {$wpdb->prefix}wppm_project_users WHERE proj_id = %d AND user_id = %d", $project_id, $cu_user_id));
                $project_users = $wpdb->get_var($wpdb->prepare("SELECT users FROM {$wpdb->prefix}wppm_project WHERE id = %d", $project_id));
                $project_users_arr = explode(',',(string)$project_users);
            }
            $response = false;
            $flag = false;
            if(!empty($task_data)){
                $co_worker = $task_data['users'];
                $co_worker_array = explode(",",(string)$co_worker);
            }
            if((!empty($project_user_role)) && ($project_user_role == 1) && in_array($current_user->ID,$project_users_arr)){
                $flag= true;
            }
            if($wppm_current_user_capability=='wppm_admin'){
                $flag = true;
            }
            if(!empty($project_data) && $project_data['created_by']==$current_user->ID && $wppm_current_user_capability=='wppm_manager'){
                $flag = true;
            }
            if($current_user->has_cap('manage_options')){
                $flag = true;
            }
            if(!empty($project_id)){
                $project_id = absint($project_id);
                $public_proj_meta = $wpdb->get_var($wpdb->prepare("SELECT meta_value FROM {$wpdb->prefix}wppm_project_meta where project_id= %d AND meta_key='public_project'", $project_id));
            }else{
                $public_proj_meta ="";
            }
            switch ($permission) {
                case 'change_status':
                case 'view_task':
                case 'add_task_comment':
                    ((!empty($co_worker_array)) && (in_array($current_user->ID,$co_worker_array )) )|| ($current_user->ID == $task_data['created_by']) ||  $public_proj_meta==1 || ($flag==true) || $current_user->has_cap('manage_options') ? $response = true: $response = false;
                    break;
                case 'change_task_details':
                    (($flag==true) || ($current_user->ID == $task_data['created_by']) || $wppm_edit_tasks_permission == 1) ? $response = true: $response = false;
                    break;
                case 'add_new_task':
                    (($flag==true) || $wppm_allow_coworkers_create_task == 1) ? $response = true: $response = false;
                    break;
                case 'add_checklist':
                    (($flag==true) || $wppm_allow_coworkers_add_checklist == 1) ? $response = true: $response = false;
                    break;
                case 'change_task_status':
                    (($flag==true) || $wppm_allow_coworkers_change_status == 1) ? $response = true: $response = false;
                    break;
                case 'delete_task':
                case 'clone_task':
                    (($flag==true) || ($current_user->ID == $task_data['created_by'])) ? $response = true: $response = false;
                    break;
                case 'assign_task_users':
                    (($flag==true) || $wppm_allow_coworkers_assign_users == 1) ? $response = true: $response = false;
                    break;
                case 'change_raised_by':
                case 'edit_checklist':
                case 'delete_checklist':
                    (($flag==true) ? $response = true: $response = false);
                    break;   
            }
            return apply_filters( 'wppm_has_permission', $response, $task_id, $permission );
        }

        public function has_comment_permission($permission, $task_id,$comment_id){
            global $current_user,$wppmfunction,$wpdb;
            $task_id = absint($task_id);
            $comment_id = absint($comment_id);
            $wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
            if(empty($comment_id)){
                $comment_id = 0;
            }
            $task_data = $wppmfunction->get_task($task_id);
            $project_user = array();
            $task_comment = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task_comment WHERE task_id = %d AND id = %d", $task_id, $comment_id));
            
            if(isset($task_data['project'])){
                $project_id = $task_data['project'];
                $project_id = absint($project_id);
                $cu_id = absint($current_user->ID);
                $project_data = $wppmfunction->get_project($project_id);
                $project_user = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_project_users WHERE proj_id = %d AND user_id = %d", $project_id, $cu_id));
                $project_users = $wpdb->get_var($wpdb->prepare("SELECT users FROM {$wpdb->prefix}wppm_project WHERE id = %d", $project_id));
                $project_users_arr = explode(',',(string)$project_users);
            }
            $response = false;
            $flag = false;
            if(!empty($task_data)){
                $co_worker = $task_data['users'];
                $co_worker_array = explode(",",(string)$co_worker);
            }
            if((!empty($project_user)) && ($project_user->role_id == 1) && in_array($current_user->ID,$project_users_arr)){
                $flag= true;
            }
            if($wppm_current_user_capability=='wppm_admin'){
                $flag = true;
            }

            if(!empty($project_data) && $project_data['created_by']==$current_user->ID && $wppm_current_user_capability=='wppm_manager'){
                $flag = true;
            }

            switch ($permission) {
                case 'delete_task_thread':
                case 'edit_task_comment':
                (($flag==true) || ($current_user->ID == $task_comment->created_by)) ? $response = true: $response = false;
                break;
            }
            return apply_filters( 'wppm_has_comment_permission', $response, $task_id, $comment_id, $permission );
        }

        public function has_proj_comment_permission($permission, $proj_id,$comment_id){
            global $current_user,$wppmfunction,$wpdb;
            $wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
            $proj_id = absint($proj_id);
            $comment_id = absint($comment_id);
            $cu_id = absint($current_user->ID);
            if(empty($comment_id)){
                $comment_id = 0;
            }
            $project_user = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_project_users WHERE proj_id = %d AND user_id = %d", $proj_id, $cu_id));
            $project_users = $wpdb->get_var($wpdb->prepare("SELECT users FROM {$wpdb->prefix}wppm_project WHERE id = %d", $proj_id));
            $project_users_arr = explode(',',(string)$project_users);
            $proj_comment = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_project_comment WHERE proj_id = %d AND id = %d", $proj_id, $comment_id));
            $response = false;
            $flag = false;
            $project_data = $wppmfunction->get_project($proj_id);
            if((!empty($project_user)) && ($project_user->role_id == 1) && in_array($current_user->ID,$project_users_arr)){
                $flag= true;
            }
            if($wppm_current_user_capability=='wppm_admin'){
                $flag = true;
            }
            if(!empty($project_data) && $project_data['created_by']==$current_user->ID && $wppm_current_user_capability=='wppm_manager'){
                $flag = true;
            }
            switch ($permission) {
                case 'delete_proj_thread':
                case 'edit_proj_comment':
                (($flag==true) || ($current_user->ID == $proj_comment->created_by)) ? $response = true: $response = false;
                break;
            }
            return apply_filters( 'wppm_has_proj_comment_permission', $response, $proj_id, $comment_id, $permission );
        }

        public function has_project_permission($permission,$project_id){
            global $current_user,$wppmfunction,$wpdb ;
            $project_data = $wppmfunction->get_project($project_id);
            $project_id = absint($project_id);
            $cu_id = absint($current_user->ID);
            $project_user = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_project_users WHERE proj_id = %d AND user_id = %d", $project_id, $cu_id));
            $project_users = $wpdb->get_var($wpdb->prepare("SELECT users FROM {$wpdb->prefix}wppm_project WHERE id = %d", $project_id));
            $project_users_arr = explode(',',(string)$project_users);
            $user = wp_get_current_user();
            $wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
            if(!empty($project_data)){
                $co_worker = $project_data['users'];
                $co_worker_array = explode(",",(string)$co_worker);
            }
            if(!empty($project_id)){
                $public_proj_meta = $wpdb->get_var( $wpdb->prepare("SELECT meta_value FROM {$wpdb->prefix}wppm_project_meta where project_id= %d AND meta_key='public_project'", $project_id));
            }else{
                $public_proj_meta ="";
            }

            switch ($permission) {
                case 'view_project':
                ((!empty($co_worker_array)) && (in_array($current_user->ID,$co_worker_array )) )? $response = true: $response = false;
                  break;
                case 'add_proj_comment':
                    ( ((!empty($co_worker_array)) && (in_array($current_user->ID,$co_worker_array )) ) || ( $public_proj_meta == '1') || $current_user->has_cap('manage_options')|| $wppm_current_user_capability == 'wppm_admin' || $wppm_current_user_capability == 'wppm_manager')? $response = true: $response = false;
                  break;
                case 'change_project_status':
                case 'assign_project_users':
                case 'change_project_raised_by':
                case 'change_project_details':
                case 'delete_project':
                    $flag = false;
                    if( (!empty($project_user)) && ($project_user->role_id == 1) && in_array($current_user->ID,$project_users_arr)){
                        $flag = true;
                    }
                    
                    (((!empty($co_worker_array)) && (in_array($current_user->ID,$co_worker_array) && $flag==true) || $wppm_current_user_capability == 'wppm_admin')) ? $response = true: $response = false;
                    break;
            }
            return apply_filters( 'wppm_has_project_permission', $response, $project_id, $permission );
        }

        public function change_status($task_id, $status_id){
            global $wpdb,$wppmfunction;
            $task_data = $wppmfunction->get_task($task_id);
            $prev_status = $task_data['status'];
            $values=array(
                'status'=>esc_sql($status_id)
            );
            $wpdb->update($wpdb->prefix.'wppm_task', $values, array('id'=>esc_sql($task_id)));
            $old_task_status_meta = $wppmfunction->get_task_meta($task_id,'old_task_status',true);
            if(!empty($old_task_status_meta)){
                $wppmfunction->delete_task_meta($task_id,'old_task_status');
            }
            $wppmfunction->add_task_meta($task_id,'old_task_status',$prev_status);
            
            do_action('wppm_set_change_task_status', $task_id, $status_id, $prev_status);
        }

        public function change_raised_by($task_id, $user_id){
            global $wpdb;
            $values=array(
                'created_by'=>absint($user_id)
            );
            $wpdb->update($wpdb->prefix.'wppm_task', $values, array('id'=>absint($task_id)));
        }

        public function change_task_label($task_id, $task_label){
            global $wpdb;
            $values=array(
                'task_name'=>stripslashes($task_label)
            );
            $wpdb->update($wpdb->prefix.'wppm_task', $values, array('id'=>absint($task_id)));
        }

        public function change_task_project_label($task_id, $project_label){
            global $wpdb;
            $values=array(
                'project'=>absint($project_label)
            );
            $wpdb->update($wpdb->prefix.'wppm_task', $values, array('id'=>absint($task_id)));
        }

        public function change_start_date($task_id, $task_start_date){
            global $wpdb;
            $values=array(
                'start_date'=>$task_start_date
            );
            $wpdb->update($wpdb->prefix.'wppm_task', $values, array('id'=>absint($task_id)));
        }

        public function change_end_date($task_id, $task_end_date){
            global $wpdb;
            $values=array(
                'end_date'=>$task_end_date
            );
            $wpdb->update($wpdb->prefix.'wppm_task', $values, array('id'=>absint($task_id)));
        }

        public function change_priority($task_id, $task_priority){
            global $wpdb;
            $values=array(
                'priority'=>absint($task_priority)
            );
            $wpdb->update($wpdb->prefix.'wppm_task', $values, array('id'=>absint($task_id)));
        }

        public function change_description($task_id, $task_description){
            global $wpdb;
            $task_description = !empty($task_description) ? wp_kses_post($task_description) : '';
            $values=array(
                'description'=>$task_description
            );
            $wpdb->update($wpdb->prefix.'wppm_task', $values, array('id'=>absint($task_id)));
        }

        public function change_project($task_id,$proj_id){
            global $wpdb,$wppmfunction;
            $task_data = $wppmfunction->get_task($task_id);
            $old_proj = $task_data['project'];
            $old_proj = absint( $old_proj);
            $proj_id = absint( $proj_id);
            $project_data = $wppmfunction->get_project($proj_id);
            $task_assign_users = $task_data['users'];
            $tusers_array = array();
            if(!empty($task_data['users'])){
                $task_users_array = explode(",",(string)$task_assign_users);
            }
            if(!empty($project_data['users'])){
                $project_users = explode(",",(string)$project_data['users']);
            }
            if(!empty($project_users)){
                if(!empty($task_users_array)){
                    foreach($task_users_array as $tuser){
                        if(!in_array($tuser,$project_users)){
                            $wpdb->delete( $wpdb->prefix.'wppm_project_users', array( 'proj_id' => "$proj_id",'user_id'=>"$tuser") );
                        }
                        elseif(in_array($tuser,$project_users)){
                            $tusers_array[] = $tuser; 
                            $tuser = absint($tuser);
                            $sql = $wpdb->prepare("SELECT role_id FROM {$wpdb->prefix}wppm_project_users WHERE proj_id = %d AND user_id = %d", $old_proj, $tuser);
                            $old_proj_user_role =  $wpdb->get_var( $sql );
                            $sql = $wpdb->prepare("SELECT role_id FROM {$wpdb->prefix}wppm_project_users WHERE proj_id = %d AND user_id = %d", $proj_id, $tuser);
                            $proj_users_role =  $wpdb->get_var( $sql );
                            if(!empty( $old_proj_user_role) && $old_proj_user_role!=$proj_users_role){
                                $value=array(
                                    'role_id'=>absint($proj_users_role)
                                );
                                $wpdb->update($wpdb->prefix.'wppm_project_users', $value, array('proj_id'=>"$proj_id", 'user_id'=>"$tuser"));
                            }
                        }
                    }
                }  
            }
            $tusers = implode(",",$tusers_array);
            $values=array(
                'project'=>absint($proj_id),
                'users'=>absint($tusers)
            );
            $wpdb->update($wpdb->prefix.'wppm_task', $values, array('id'=>absint($task_id)));
        }

        public function get_task_comment($comment_id){
            global $wpdb;
            $task_comment_data = array();
            $comment_id = absint($comment_id);
            $task_comment = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task_comment WHERE id=%d", $comment_id));
            if( $task_comment ){
                $task_comment_data = json_decode(wp_json_encode($task_comment), true);
            }
            return $task_comment_data;
        }

        public function get_proj_comment($comment_id){
            global $wpdb;
            $project_comment_data = array();
            $comment_id = absint($comment_id);
            $project_comment = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_project_comment WHERE id=%d", $comment_id));
            if( $project_comment ){
                $project_comment_data = json_decode(wp_json_encode($project_comment), true);
            }
            return $project_comment_data;
        }

        public function change_task_comment($comment_id,$comment_body){
            global $wpdb;
            $comment_id = absint($comment_id);
            $comment_body = !empty($comment_body) ? wp_kses_post($comment_body) : '';
            $values=array(
                'body'=>$comment_body
            );
            $wpdb->update($wpdb->prefix.'wppm_task_comment', $values, array('id'=>"$comment_id"));
        }

        public function change_proj_comment($comment_id,$comment_body){
            global $wpdb;
            $comment_id = absint($comment_id);
            $comment_body = !empty($comment_body) ? wp_kses_post($comment_body) : '';
            $values=array(
                'body'=>$comment_body
            );
            $wpdb->update($wpdb->prefix.'wppm_project_comment', $values, array('id'=>"$comment_id"));
        }

        public function change_project_label($project_id,$project_label){
            global $wpdb;
            $project_id = absint($project_id);
            $values=array(
                'project_name'=>esc_sql($project_label)
            );
            $wpdb->update($wpdb->prefix.'wppm_project', $values, array('id'=>"$project_id"));
        }

        public function change_project_start_date($project_id, $project_start_date){
            global $wpdb;
            $project_id = absint($project_id);
            $project_start_date = esc_sql($project_start_date);
            $values=array(
                'start_date'=>$project_start_date
            );
            $wpdb->update($wpdb->prefix.'wppm_project', $values, array('id'=>"$project_id"));
        }

        public function change_project_end_date($project_id, $project_end_date){
            global $wpdb;
            $project_id = absint($project_id);
            $project_end_date = esc_sql($project_end_date);
            $values=array(
                'end_date'=>$project_end_date
            );
            $wpdb->update($wpdb->prefix.'wppm_project', $values, array('id'=>$project_id));
        }

        public function change_category($project_id, $project_category){
            global $wpdb;
            $project_id = absint($project_id);
            $project_category = absint($project_category);
            $values=array(
                'cat_id'=>$project_category
            );
            $wpdb->update($wpdb->prefix.'wppm_project', $values, array('id'=>"$project_id"));
        }

        public function change_project_description($project_id, $project_description){
            global $wpdb;
            $project_id = absint($project_id);
            $project_description = (string) ( $project_description ?? '' );
            $values = array(
                'description' => wp_kses_post( $project_description )
            );
            $wpdb->update($wpdb->prefix.'wppm_project', $values, array('id'=>"$project_id"));
        }

        public function change_project_status($project_id,$status_id){
            global $wpdb,$wppmfunction,$current_user;
            $change_status_value= array();
            $proj_data = $wppmfunction->get_project($project_id);
            $prev_status = $proj_data['status'];
            $cu_id = absint($current_user->ID);
            $values=array(
                'status'=>absint($status_id)
            );
            $project_id = absint($project_id);
            $wpdb->update($wpdb->prefix.'wppm_project', $values, array('id'=>$project_id));
            $old_project_status_meta = $wppmfunction->get_project_meta($project_id,'old_project_status',true);
            if(!empty($old_project_status_meta)){
                $wppmfunction->delete_project_meta($project_id,'old_project_status');
            }
            $change_status_value = array('prev_status'=>"$prev_status",'new_status'=>"$status_id");
            $change_status_obj = serialize($change_status_value);
            $log_values = array('proj_id'=>"$project_id",'body'=>$change_status_obj,'attachment_ids'=>"",'create_time'=>wp_date("Y-m-d h:i:sa"),'created_by'=>"$cu_id" );
            $wpdb->insert($wpdb->prefix . 'wppm_project_comment',$log_values);
            $log_id = absint($wpdb->insert_id);
            $proj_log_values = array('proj_id'=>"$project_id",'comment_id'=>"$log_id",'comment_type'=>'change_proj_status');
            $wpdb->insert($wpdb->prefix . 'wppm_project_comment_meta',$proj_log_values);
            $wppmfunction->add_project_meta($project_id,'old_project_status',$prev_status);
            do_action('wppm_set_change_project_status', $project_id, $status_id, $prev_status);
        }

        public function change_project_raised_by($project_id, $user_id){
            global $wpdb;
            $values=array(
                'created_by'=>absint($user_id)
            );
            $wpdb->update($wpdb->prefix.'wppm_project', $values, array('id'=>"$project_id"));
        }

        // Email Notification types
        public function get_email_notification_types(){
            $notification_types = array(
            'new_project'=>esc_html__('New Project','taskbuilder'),
            'new_task'=>esc_html__('New Task','taskbuilder'),
            'change_project_status'       => esc_html__('Change Project Status','taskbuilder'),
            'change_task_status'    => esc_html__('Change Task Status','taskbuilder'),
            'change_project_assign_users' => esc_html__('Change Project Assign Users','taskbuilder'),
            'change_task_assign_users'    => esc_html__('Change Task Assign Users','taskbuilder'),
            'new_discussion'     => esc_html__('New Comment','taskbuilder'),
            'new_proj_discussion'  =>esc_html__('New Project Comment','taskbuilder')
            );
            return apply_filters('wppm_en_types',$notification_types);
        }

        public function check_rtl(){
            $rtl_locale = array('ar','ary','ckb','haz','he_IL','fa_IR','ps','ur','ug_CN');
            if(in_array(get_locale(),$rtl_locale)){
              return 'rtl';
            }else{
              return 'ltr';
            } 
        }

        public function add_project_meta($proj_id,$meta_key,$meta_value){
            global $wpdb;
            $wpdb->insert( 
              $wpdb->prefix . 'wppm_project_meta', 
              array(
                'project_id' =>$proj_id,
                'meta_key' => $meta_key,
                'meta_value' =>$meta_value
            ));
        }

        public function add_task_meta($task_id,$meta_key,$meta_value){
            global $wpdb;
            $wpdb->insert( 
              $wpdb->prefix . 'wppm_task_meta', 
              array(
                'task_id' => $task_id,
                'meta_key' => $meta_key,
                'meta_value' =>$meta_value
            ));
        }

        public function get_project_meta($project_id,$meta_key,$flag = false){
            global $wpdb,$wppmfunction;
            $project_id = absint($project_id);
            $meta_key = esc_sql($meta_key);
            if($flag){
                $get_meta = $wpdb->get_var($wpdb->prepare("SELECT meta_value FROM {$wpdb->prefix}wppm_project_meta WHERE project_id = %d AND meta_key = %s",$project_id,$meta_key));
                $project_meta = isset($get_meta) ? stripslashes($get_meta) : '';
                
            } else {
                $project_meta = array();
                $results = $wpdb->get_results($wpdb->prepare("SELECT meta_value FROM {$wpdb->prefix}wppm_project_meta WHERE project_id = %d AND meta_key = %s",$project_id,$meta_key));
                if( (!empty($results)) ){
                    foreach ($results as $result) {
                        if(!empty($result)){
                            $project_meta[]= stripslashes($result->meta_value);
                        }
                    }
                }
            }
            return $project_meta;
        }

        public function get_task_meta($task_id,$meta_key,$flag = false){
            global $wpdb,$wppmfunction;
            $task_id = absint($task_id);
            $meta_key = esc_sql($meta_key);
            if($flag){
                $get_meta = $wpdb->get_var($wpdb->prepare("SELECT meta_value FROM {$wpdb->prefix}wppm_task_meta WHERE task_id = %d AND meta_key = %s",$task_id,$meta_key));
                $task_meta = isset($get_meta) ? stripslashes($get_meta) : '';
                
            } else {
                $task_meta = array();
                $results = $wpdb->get_results($wpdb->prepare("SELECT meta_value FROM {$wpdb->prefix}wppm_task_meta WHERE task_id = %d AND meta_key = %s",$task_id,$meta_key));
                if( (!empty($results)) ){
                    foreach ($results as $result) {
                        if(!empty($result)){
                            $task_meta[]= stripslashes($result->meta_value);
                        }
                    }
                }
            }
            return $task_meta;
        }

        public function get_previously_assigned_users($project_id){
            global $wpdb,$wppmfunction;
            $prev_assigned_users = $wppmfunction->get_project_meta($project_id,'prev_assigned_users');
            $user_emails = array();
            if(!empty($prev_assigned_users)){
                foreach ($prev_assigned_users as $user) {
                    $userdata = get_userdata($user);
                    $user_emails[] = $userdata->user_email;
                    
                }
            }
            return apply_filters( 'wppm_get_prev_assigned_users_emails', $user_emails ,$project_id);
        }

        public function get_project_creator_email($project_id){
            global $wpdb,$wppmfunction;
            $project_data = $wppmfunction->get_project($project_id,'created_by');
            $userdata = get_userdata($project_data['created_by']);
            if(!empty( $userdata)){
                $proj_creator_email[] = $userdata->user_email;
            }
            return apply_filters( 'wppm_get_project_creator_email', $proj_creator_email ,$project_id);
        }

        public function get_task_creator_email($task_id){
            global $wpdb,$wppmfunction;
            $task_data = $wppmfunction->get_task($task_id,'created_by');
            $userdata = get_userdata($task_data['created_by']);
            if(!empty( $userdata)){
                $task_creator_email[] = $userdata->user_email;
            }
            return apply_filters( 'wppm_get_task_creator_email', $task_creator_email ,$task_id);
        }

        public function get_previously_assigned_task_users($task_id){
            global $wpdb,$wppmfunction;
            $prev_assigned_task_users = $wppmfunction->get_task_meta($task_id,'prev_assigned_task_users');
            $user_emails = array();
            if(!empty($prev_assigned_task_users)){
                foreach ($prev_assigned_task_users as $user) {
                    if(!empty($user)){
                        $userdata = get_userdata($user);
                        $user_emails[] = $userdata->user_email;
                    }
                }
            }
            return apply_filters( 'wppm_get_prev_assigned_task_users_emails', $user_emails ,$task_id);
        }
        /**
         * Update project meta for project
         */
        function update_project_meta($project_id ,$meta_key ,$meta_value){
            global $wpdb;
            $project_id = absint($project_id);
            $meta_key = esc_sql($meta_key);
            $results = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_project_meta WHERE project_id = %d AND meta_key = %s",$project_id,$meta_key));
            $wpdb->update($wpdb->prefix.'wppm_project_meta', $meta_value, array('project_id'=>$project_id,'meta_key' => "$meta_key"));
        }
        
        /**
        * Update task meta for task
        */
        function update_task_meta($task_id ,$meta_key ,$meta_value){
            global $wpdb;
            $task_id = absint($task_id);
            $meta_key = esc_sql($meta_key);
            $results = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task_meta WHERE task_id = %d AND meta_key = %s",$task_id,$meta_key));
            $wpdb->update($wpdb->prefix.'wppm_task_meta', $meta_value, array('task_id'=>$task_id,'meta_key' => "$meta_key"));
        }

        function delete_project_meta($project_id  ,$meta_key){
            global $wpdb;
            $project_id = absint($project_id);
            $meta_key = ($meta_key);
            $wpdb->delete( $wpdb->prefix.'wppm_project_meta', array( 'project_id' => "$project_id",'meta_key'=>"$meta_key") );
        }

        function delete_task_meta($task_id ,$meta_key){
            global $wpdb;
            $task_id = absint($task_id);
            $meta_key = ($meta_key);
            $wpdb->delete( $wpdb->prefix.'wppm_task_meta', array( 'task_id' => "$task_id",'meta_key'=>"$meta_key") );
        }

        public function replace_macro($str,$project_id){
            include WPPM_ABSPATH . 'includes/replace_macro.php';
            return $str;
        }

        public function replace_task_macro($str,$task_id){
            include WPPM_ABSPATH . 'includes/replace_task_macro.php';
            return $str;
        }

        public function get_old_project_status_name($id){
            global $wppmfunction, $wpdb;
            $old_project_status = $wppmfunction->get_project_meta($id,'old_project_status',true);
            $old_project_status = absint($old_project_status);
            $status_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}wppm_project_statuses WHERE id = %d",$old_project_status));
            return $status_name;
        }

        public function get_new_project_status_name($status_id){
            global $wpdb;
            $status_id = absint($status_id);
            $status_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}wppm_project_statuses WHERE id = %d",$status_id));
            return $status_name;
        }

        public function get_old_task_status_name($task_id){
            global $wppmfunction, $wpdb;
            $old_task_status = $wppmfunction->get_task_meta($task_id,'old_task_status',true);
            $old_task_status = absint($old_task_status);
            $status_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}wppm_task_statuses WHERE id = %d",$old_task_status));
            return $status_name;
        }

        public function get_new_task_status_name($status_id){
            global $wpdb;
            $status_id = absint($status_id);
            $status_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}wppm_task_statuses WHERE id = %d",$status_id));
            return $status_name;
        }

        public function get_project_category_name($cat_id){
            global $wpdb;
            $cat_id = absint($cat_id);
            if(!empty($cat_id)){
                $cat_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}wppm_project_categories WHERE id = %d",$cat_id));
            }else{
                $cat_name = ""; 
            }
            return $cat_name;
        }

        public function get_project_assigned_users_names($project_id){
            global $wppmfunction;
            $wppm_project_data = $wppmfunction->get_project($project_id);
            if(!empty($wppm_project_data['users'])){
                $wppm_project_assign_users_array = explode(",", $wppm_project_data['users']);
            }else{
                $wppm_project_assign_users_array = array();
            }
            $users_names = array();
            if(!empty($wppm_project_assign_users_array)){
                foreach ($wppm_project_assign_users_array as $user_id) {
                    if(!empty($user_id)){
                        $userdata = get_userdata( $user_id );
                        if(!empty($userdata)){
                            $users_names[] = $userdata->display_name;
                        }
                    }
                }
            }
            return implode(', ', $users_names);
        }

        public function get_task_assigned_users_names($task_id){
            global $wppmfunction;
            $wppm_task_data = $wppmfunction->get_task($task_id);
            $wppm_task_assign_users_array = explode(",", (string)$wppm_task_data['users']);
            $users_names = array();
            if(!empty($wppm_task_assign_users_array)){
                foreach ($wppm_task_assign_users_array as $user_id) {
                    if(!empty($user_id)){
                        $userdata = get_userdata( $user_id );
                        if(!empty($userdata)){
                            $users_names[] = $userdata->display_name;
                        }
                    }
                }
            }
            return implode(', ', $users_names);
        }

        public function get_project_previously_assigned_users_names($project_id){
            global $wppmfunction;
            $wppm_project_assign_users = $wppmfunction->get_project_meta($project_id,'prev_assigned_users');            
            $users_names = array();
            if(!empty($wppm_project_assign_users)){
                foreach ($wppm_project_assign_users as $user) {
                    if(!empty($user)){
                        $userdata = get_userdata( $user );
                        $users_names[] = $userdata->display_name; 
                    }  
                }
            }
            return implode(', ', $users_names);
        }

        public function get_task_previously_assigned_users_names($task_id){
            global $wppmfunction;
            $wppm_task_assign_users = $wppmfunction->get_task_meta($task_id,'prev_assigned_task_users');            
            $users_names = array();
            if(!empty($wppm_task_assign_users)){
                foreach ($wppm_task_assign_users as $user) {
                    if(!empty($user)){
                        $userdata = get_userdata( $user );
                        $users_names[] = $userdata->display_name;
                    } 
                }
            }
            return implode(', ', $users_names);
        }

        public function get_task_priority_name($priority){
            global $wpdb;
            $priority = absint($priority);
            $priority_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}wppm_task_priorities WHERE id = %d",$priority));
            return $priority_name;
        }

        public function get_last_comment_user_name($task_id){
            global $wpdb;
            $task_id = absint($task_id);
            $task_comment_creator = $wpdb->get_var($wpdb->prepare("SELECT created_by FROM {$wpdb->prefix}wppm_task_comment WHERE (id=(select MAX(id) from {$wpdb->prefix}wppm_task_comment) AND task_id = %d)",$task_id));
            if(!empty($task_comment_creator)){
                $user = get_userdata( $task_comment_creator );
                return $user->display_name;
            }
        }

        public function get_last_comment_body($task_id){
            global $wpdb;
            $task_id = absint($task_id);
            $task_comment = $wpdb->get_var($wpdb->prepare("SELECT body FROM {$wpdb->prefix}wppm_task_comment WHERE (id=(select MAX(id) from {$wpdb->prefix}wppm_task_comment) AND task_id = %d)",$task_id));
            return $task_comment;
        }
        
        public function create_duplicate_task($ptask_id, $project_id,$internal_code_flag=false){
            include WPPM_ABSPATH . 'includes/admin/tasks/open_task/wppm_set_clone_task.php';
        }

        public function get_last_comment_proj_user_name($project_id){
            global $wpdb;
            $project_id = absint($project_id);
            $proj_comment_creator = $wpdb->get_var($wpdb->prepare("SELECT created_by FROM {$wpdb->prefix}wppm_project_comment WHERE (id=(select MAX(id) from {$wpdb->prefix}wppm_project_comment) AND proj_id = %d)",$project_id));
            if(!empty($proj_comment_creator)){
                $user = get_userdata( $proj_comment_creator );
                return $user->display_name;
            }
        }

        public function get_proj_comment_body($project_id){
            global $wpdb;
            $project_id = absint($project_id);
            $proj_comment = $wpdb->get_var($wpdb->prepare("SELECT body FROM {$wpdb->prefix}wppm_project_comment WHERE (id=(select MAX(id) from {$wpdb->prefix}wppm_project_comment) AND proj_id = %d)",$project_id));
            return $proj_comment;
        }

        public function get_project_url($project_id, $view){
            global $wpdb,$wppmfunction;
            $project_id = absint($project_id);
			$page_settings = get_option( 'wppm-page-settings' );
			if ( $view == '0' ) {
				$url = admin_url( 'admin.php?page=wppm-projects&section=project-list&id=' . $project_id );
			} else {
                $url = get_permalink( $page_settings['project-url-page'] );
                $auth_id  = $wppmfunction->get_project_meta($project_id,'project_auth_code',true);

				$url = add_query_arg(
					array(
						'project-id' => $project_id,
						'auth-code' => $auth_id,

					),
					$url
				);
			}

			return $url;
        }

        public function get_task_url($task_id, $view){
            global $wpdb,$wppmfunction;
            $task_id = absint($task_id);
			$page_settings = get_option( 'wppm-page-settings' );
			if ( $view == '0' ) {
				$url = admin_url( 'admin.php?page=wppm-tasks&section=task-list&id=' . $task_id );
			} else{
				$url = get_permalink( $page_settings['task-url-page'] );
			    $auth_id  = $this->wppm_get_auth_code($task_id);
				$url = add_query_arg(
					array(
						'task-id' => $task_id,
						'auth-code' => $auth_id,
					),
					$url
				);

			}

			return $url;
        }

        public function wppm_user_role(){
            $user_role = array(
                'wppm_admin' => array(
                    'label' => esc_html__('WPPM Administrator','taskbuilder'),
                ),
                'wppm_manager' => array(
                    'label' => esc_html__('WPPM Manager','taskbuilder'),
                )
			);
            return $user_role;
        }

        public static function wppm_toolbar_options_setting() {
			$toolbar = array(
				array(
					'name'  => esc_attr__( 'Bold', 'taskbuilder' ),
					'value' => 'bold',
				),
				array(
					'name'  => esc_attr__( 'Italic', 'taskbuilder' ),
					'value' => 'italic',
				),
				array(
					'name'  => esc_attr__( 'Underline', 'taskbuilder' ),
					'value' => 'underline',
				),
				array(
					'name'  => esc_attr__( 'Blockquote', 'taskbuilder' ),
					'value' => 'blockquote',
				),
				array(
					'name'  => esc_attr__( 'Align', 'taskbuilder' ),
					'value' => 'align',
				),
				array(
					'name'  => esc_attr__( 'Bulleted list', 'taskbuilder' ),
					'value' => 'bullist',
				),
				array(
					'name'  => esc_attr__( 'Numbered list', 'taskbuilder' ),
					'value' => 'numlist',
				),
				array(
					'name'  => esc_attr__( 'Right to left', 'taskbuilder' ),
					'value' => 'rtl',
				),
				array(
					'name'  => esc_attr__( 'Link', 'taskbuilder' ),
					'value' => 'link',
				),
				array(
					'name'  => esc_attr__( 'Image', 'taskbuilder' ),
					'value' => 'wppm_insert_editor_img',
				),
				array(
					'name'  => esc_attr__( 'Text Color', 'taskbuilder' ),
					'value' => 'forecolor',
				),
				array(
					'name'  => esc_attr__( 'Text Background Color', 'taskbuilder' ),
					'value' => 'backcolor',
				),
				array(
					'name'  => esc_attr__( 'Strikethrough', 'taskbuilder' ),
					'value' => 'strikethrough',
				),
			);
			return $toolbar;
		}

        public static function wppm_load_setting_header_html() {
			?>
			<div class="wppm-header" style="padding-left:20px;margin:10px 0 10px 0;display: flex; justify-content: space-between; align-items: center; position: sticky;top: 0;background: #fff !important;z-index: 9999;width:99%; left: 0; ">
				<div class="wppm-header-title" style="display: flex; align-items: center; gap: 3px;">
					<img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/taskbuilder_logo.png'); ?>" class="wppm-header-icon" alt="taskbuilder Icon" style="width: 33px; height: 33px;margin-right:10px !important;"/>
                    <h2 style="font-size: 30px; font-weight: 600; color: #333; margin: 0; font: 22px OpenSans-Light, Helvetica, Arial, sans-serif;"><?php esc_html_e( 'Taskbuilder', 'taskbuilder' )?></h2>
				</div>
                <div class="wppm-header-button" style="display: flex; justify-content: flex-end; gap: 3px;">
                    <div class="wppm-btn
                    " style="background-color: #0052CC; color: #fff; padding: 8px 10px;margin: 35px 0px 14px 0px;text-decoration: none;border-radius: 5px;transition: background 0.3s ease;box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);">
                        <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/help.svg'); ?>" class="wppm-header-icon" alt="taskbuilder Icon" style="width: 20px; height: 19px;margin-bottom: -5px;"/>
                        <a href="https://taskbuilder.net/help/" target="__blank" style="color:#fff"><?php esc_html_e( 'Help', 'taskbuilder' )?></a>
                    </div>
                    <div class="wppm-btn" style="background-color: #0052CC; color: #fff; padding: 8px 10px;margin: 35px 0px 14px 0px;text-decoration: none;border-radius: 5px;transition: background 0.3s ease;box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);">
                        <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/support.svg'); ?>" class="wppm-header-icon" alt="taskbuilder Icon" style="width: 15px; height: 19px;margin-bottom: -5px;"/>
                        <a href="https://taskbuilder.net/support/?wpsc-section=ticket-list" target="__blank" style="color:#fff"><?php esc_html_e( 'Support', 'taskbuilder' )?></a>
                    </div>
                    <div class="wppm-btn" style="background-color: #0052CC; color: #fff; padding: 8px 10px;margin: 35px 10px 14px 0px;text-decoration: none;border-radius: 5px;transition: background 0.3s ease;box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);">
                        <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/pro_features.svg'); ?>" class="wppm-header-icon" alt="taskbuilder Icon" style="width: 15px; height: 19px;margin-bottom: -5px;"/>
                        <a href="https://taskbuilder.net/pricing/" target="__blank" style="color:#fff"><?php esc_html_e( 'Get pro', 'taskbuilder' )?></a>
                    </div>
                </div>
			</div>
			<?php
		}

        public function wppm_get_duration($start_date, $end_date){
            if ( empty($start_date) || empty($end_date) || $start_date=='0000-00-00 00:00:00' || $end_date =='0000-00-00 00:00:00') {
                return '';
            }

            $start_ts = strtotime($start_date);
            $end_ts   = strtotime($end_date);

            if ( $end_ts <= $start_ts ) {
                return '0 min';
            }

            $diff = $end_ts - $start_ts;

            $days    = floor($diff / 86400);
            $hours   = floor(($diff % 86400) / 3600);
            $minutes = floor(($diff % 3600) / 60);

            $duration = [];

            if ($days > 0)    $duration[] = $days . 'd';
            if ($hours > 0)  $duration[] = $hours . 'h';
            if ($minutes > 0 || empty($duration)) $duration[] = $minutes . 'm';

            return implode(' ', $duration);

        }

        public function wppm_highlight_user_mentions($content, $current_user_id) {

            return preg_replace_callback(
                '/<span[^>]*class="wppm-mention"[^>]*data-user-id="(\d+)"[^>]*>(.*?)<\/span>/is',
                function($matches) use ($current_user_id) {

                    $user_id = intval($matches[1]);
                    $text = $matches[2];

                    // already processed → skip
                    if (strpos($matches[0], 'wppm-mention-me') !== false) {
                        return $matches[0];
                    }

                    if ($user_id === $current_user_id) {
                        return '<span class="wppm-mention wppm-mention-me" data-user-id="' . esc_attr($user_id) . '">' . $text . '</span>';
                    }

                    return '<span class="wppm-mention" data-user-id="' . esc_attr($user_id) . '">' . $text . '</span>';
                },
                $content
            );
        }
        function wppm_clean_mentions_html($content) {
             // Remove dropdown items
            $content = preg_replace('/<div[^>]*class="mention-item"[^>]*>.*?<\/div>/is', '', $content);

            // Remove mention dropdown container
            $content = preg_replace('/<div[^>]*id="wppm_mention_list"[^>]*>.*?<\/div>/is', '', $content);

            return $content;
        }

        function wppm_extract_mentions($comment) {
            preg_match_all('/data-user-id="(\d+)"/', $comment, $matches);
            return $matches[1];
        }

        function wppm_get_users_from_mentions($user_ids) {
            $users = [];
            foreach ($user_ids as $user_id) {
                $user = get_user_by('id', intval($user_id));
                if ($user) {
                    $users[] = $user;
                }
            }
            return $users;
        }

        function wppm_send_mention_email($email_addresses, $comment, $task_id) {
            $page_setting = get_option('wppm-page-settings');
            $from_name    = get_option('wppm_en_from_name');
            $from_email   = get_option('wppm_en_from_email');
            $view         = $page_setting['task-url-page'];
            $subject      = esc_html__("You were mentioned in a comment", "taskbuilder");
            $to = isset($email_addresses[0]) ? $email_addresses[0] : '';
            if (!$to) {
                return;
            }
            unset($email_addresses[0]);
            $headers  = "From: {$from_name} <{$from_email}>\r\n";
            foreach ($email_addresses as $email_address) {
                $headers .= "BCC: {$email_address}\r\n";
            }
            $headers .= "Content-Type: text/html; charset=UTF-8\r\n";
            $task_url = $this->get_task_url($task_id, $view);
            $message  = esc_html__("Hello,", "taskbuilder");
            $message .= "<br><br>";
            $message .= esc_html__("You were mentioned in a comment:", "taskbuilder");
            $message .= "<br><br>";
            $message .= nl2br(esc_html(strip_tags($comment)));
            $message .= "<br><br>";
            $message .= esc_html__("View Task:", "taskbuilder") . " ";
            $message .= '<a class="wppm_link" href="' . esc_url($task_url) . '" target="_blank">' . esc_html__("View Task", "taskbuilder") . '</a>';
            wp_mail($to, $subject, $message, $headers);
            do_action('wppm_after_sent_mention_mail', $email_addresses, $comment, $task_id);
        }
        
        function wppm_insert_notification($user_id, $message, $link,$is_read,$type) {
            global $wpdb;
            $wpdb->insert(
                $wpdb->prefix . 'wppm_notifications',
                [
                    'user_id' => $user_id,
                    'message' => $message,
                    'link'    => $link,
                    'is_read' => $is_read,
                    'notification_type'=>$type,
                    'created_at' => current_time('mysql')
                ]
            );
        }
    }
endif;
$GLOBALS['wppmfunction'] =  new WPPM_Functions();
```
