PluginProbe
Taskbuilder – Project Management & Task Management Tool With Kanban Board / 6.0.6
Taskbuilder – Project Management & Task Management Tool With Kanban Board v6.0.6
6.0.6 6.0.5 6.0.2 6.0.3 6.0.4 6.0.1 6.0.0 5.0.8 5.0.9 4.0.9 5.0.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 All 58 releases
taskbuilder / includes / class-wppm-functions.php

class-wppm-functions.php in Taskbuilder – Project Management & Task Management Tool With Kanban Board 6.0.6, at includes/class-wppm-functions.php

1,392 lines 63.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if ( ! defined( 'ABSPATH' ) ) {
3 exit; // Exit if accessed directly
4 }
5 if ( ! class_exists( 'WPPM_Functions' ) ) :
6 final class WPPM_Functions {
7 // Array sanitization
8 public static function sanitize_array($array) {
9 if(!empty($array)){
10 foreach ( $array as $key => $value ) {
11 if ( is_array( $value ) ) {
12 $value = $this->sanitize_array($value);
13 }
14 else {
15 $value = sanitize_text_field( wp_unslash( $value ) );
16 }
17 }
18 }
19 return $array;
20 }
21
22 public static function create_project($args){
23 global $wpdb,$current_user;
24 $default_proj_status = get_option('wppm_default_project_status');
25 $values = array(
26 'created_by'=>$current_user->ID,
27 'project_name'=>$args['name'],
28 'description'=>isset($args['wppm_proj_description']) ? $args['wppm_proj_description']:"",
29 'start_date'=>isset($args['wppm_start_date']) ?$args['wppm_start_date']:"",
30 'end_date'=>isset($args['wppm_end_date'])? $args['wppm_end_date']:"",
31 'status'=>isset($args['status'])? $args['status']:$default_proj_status,
32 'cat_id'=>isset($args['wppm_create_project_category']) ? $args['wppm_create_project_category']:"",
33 'users'=>isset($args['user_names']) ? implode(",",$args['user_names']):"",
34 'date_created'=>isset($args['date_created'])? $args['date_created']:wp_date("Y-m-d h:i:sa"),
35 'project_auth_code'=> self::getRandomString(10)
36
37 );
38 $wpdb->insert($wpdb->prefix .'wppm_project', $values);
39 $project_id = $wpdb->insert_id;
40 return $project_id;
41 }
42
43 public static function create_task($args){
44 global $wpdb,$current_user;
45 $default_task_status = get_option('wppm_default_task_status');
46 $values = array(
47 'created_by'=>(isset($args['created_by'])) ? $args['created_by']: $current_user->ID,
48 'task_name'=>$args['name'],
49 'description'=>(isset($args['wppm_task_description']))?$args['wppm_task_description']:"",
50 'project'=>(isset($args['wppm_task_project']))?$args['wppm_task_project']:"",
51 'start_date'=>(isset($args['wppm_task_start_date']))?$args['wppm_task_start_date']:"",
52 'end_date'=>(isset($args['wppm_task_end_date']))?$args['wppm_task_end_date']:"",
53 'status'=>(isset($args['status']))?$args['status']:$default_task_status,
54 'priority'=>(isset($args['wppm_create_task_priority']))?$args['wppm_create_task_priority']:"",
55 'users'=>(!empty($args['user_names']))?implode(",",$args['user_names']):"",
56 'date_created'=>isset($args['date_created'])? $args['date_created']:wp_date("Y-m-d h:i:sa"),
57 'task_auth_code'=> self::getRandomString(10),
58 'active'=>1,
59 'parent_task_id'=>(isset($args['parent_task_id']))?absint($args['parent_task_id']):0
60 );
61 $wpdb->insert($wpdb->prefix .'wppm_task', $values);
62 $task_id = $wpdb->insert_id;
63 return $task_id;
64 }
65
66 public static function create_checklist($args){
67 global $wpdb,$current_user,$wppmfunction;
68 $values = array(
69 'task_id'=>$args['task_id'],
70 'checklist_name' => $args['checklist_name'],
71 'created_by'=> $args['created_by']
72 );
73 $wpdb->insert($wpdb->prefix .'wppm_checklist', $values);
74 $checklist_id = $wpdb->insert_id;
75 return $checklist_id;
76 }
77
78 public static function create_checklist_item($args){
79 global $wpdb,$current_user,$wppmfunction;
80 $chk_items_values = array(
81 'checklist_id' => $args['checklist_id'],
82 'item_name' => $args['item_name'],
83 'checked'=>$args['checked'],
84 'members'=>$args['members'],
85 'due_date'=> $args['due_date']
86 );
87 $wpdb->insert($wpdb->prefix .'wppm_checklist_items', $chk_items_values);
88 $checklist_item_id = $wpdb->insert_id;
89 return $checklist_item_id;
90 }
91
92 public static function wppm_submit_task_comment($args){
93 global $wpdb;
94 $wpdb->insert($wpdb->prefix.'wppm_task_comment',$args);
95 $comment_id = $wpdb->insert_id;
96 return $comment_id;
97 }
98
99 public static function wppm_submit_task_comment_meta($args){
100 global $wpdb;
101 $wpdb->insert($wpdb->prefix.'wppm_task_comment_meta',$args);
102 $comment_meta_id = $wpdb->insert_id;
103 return $comment_meta_id;
104 }
105
106 public static function wppm_submit_proj_comment($args){
107 global $wpdb;
108 $wpdb->insert($wpdb->prefix.'wppm_project_comment',$args);
109 $comment_id = $wpdb->insert_id;
110 return $comment_id;
111 }
112
113 public static function wppm_submit_proj_comment_meta($args){
114 global $wpdb;
115 $wpdb->insert($wpdb->prefix.'wppm_project_comment_meta',$args);
116 $comment_meta_id = $wpdb->insert_id;
117 return $comment_meta_id;
118 }
119
120 // Random string
121 public static function getRandomString($length = 8) {
122 $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
123 $string = '';
124 for ($i = 0; $i < $length; $i++) {
125 $string .= $characters[wp_rand(0, strlen($characters) - 1)];
126 }
127 return $string;
128 }
129
130 public static function wppm_get_auth_code($id){
131 global $wpdb;
132 $id = absint($id);
133 $auth_code = $wpdb->get_var(
134 $wpdb->prepare(
135 "SELECT task_auth_code
136 FROM {$wpdb->prefix}wppm_task
137 WHERE id = %d",
138 ($id)
139 )
140 );
141 $auth_code = isset($auth_code) ? $auth_code : "";
142 return $auth_code;
143 }
144
145 public static function wppm_get_proj_auth_code($id){
146 global $wpdb;
147 $id = absint($id);
148 $auth_code = $wpdb->get_var(
149 $wpdb->prepare(
150 "SELECT project_auth_code
151 FROM {$wpdb->prefix}wppm_project
152 WHERE id = %d",
153 ($id)
154 )
155 );
156 $auth_code = isset($auth_code) ? $auth_code : "";
157 return $auth_code;
158 }
159
160 public static function get_task_fields($task_id,$select_field){
161 global $wpdb;
162 $task_id = absint($task_id);
163 $task_field_value = '';
164 $allowed_fields = array(
165 'id',
166 'created_by',
167 'task_name',
168 'description',
169 'project',
170 'start_date',
171 'end_date',
172 'status',
173 'priority',
174 'users',
175 'date_created',
176 'task_auth_code'
177 );
178
179 // Validate column name
180 if ( ! in_array( $select_field, $allowed_fields, true ) ) {
181 return '';
182 }
183 if (apply_filters('wppm_get_select_field',true,$task_id,$select_field)) {
184 $get_task_field_value = $wpdb->get_var($wpdb->prepare("SELECT $select_field FROM {$wpdb->prefix}wppm_task WHERE id = %d", $task_id));
185 $task_field_value = $get_task_field_value ? $get_task_field_value : '';
186 }
187 return stripslashes($task_field_value);
188 }
189
190 public static function get_project_fields($proj_id,$select_field){
191 global $wpdb;
192 $proj_id = absint($proj_id);
193 $project_field_value = '';
194 $allowed_fields = array(
195 'id',
196 'created_by',
197 'project_name',
198 'description',
199 'start_date',
200 'end_date',
201 'status',
202 'cat_id',
203 'users',
204 'date_created',
205 'project_auth_code'
206 );
207
208 // Validate column name
209 if ( ! in_array( $select_field, $allowed_fields, true ) ) {
210 return '';
211 }
212 if (apply_filters('wppm_get_select_proj_field',true,$proj_id,$select_field)) {
213 $get_project_field_value = $wpdb->get_var($wpdb->prepare("SELECT $select_field FROM {$wpdb->prefix}wppm_project WHERE id = %d", $proj_id));
214 $project_field_value = $get_project_field_value ? $get_project_field_value : '';
215 }
216 return stripslashes($project_field_value);
217 }
218
219 public function get_task($task_id){
220 global $wpdb;
221 $task_data = array();
222 $task_id = absint($task_id);
223 $task = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task WHERE id = %d", $task_id));
224 if( $task ){
225 $task_data = json_decode(wp_json_encode($task), true);
226 }
227 return $task_data;
228 }
229
230 public function get_checklist($task_id){
231 global $wpdb;
232 $task_id = absint($task_id);
233 $checklist_data = array();
234 $checklist = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_checklist WHERE task_id = %d", $task_id));
235 if( $checklist ){
236 $checklist_data = json_decode(wp_json_encode($checklist), true);
237 }
238 return $checklist_data;
239 }
240
241 public function get_checklist_items($checklist_id){
242 global $wpdb;
243 $checklist_items_data = array();
244 $checklist_id = absint($checklist_id);
245 $checklist_items = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_checklist_items WHERE checklist_id = %d", $checklist_id));
246 if( $checklist_items ){
247 $checklist_items_data = json_decode(wp_json_encode($checklist_items), true);
248 }
249 return $checklist_items_data;
250 }
251
252 public function get_subtasks($task_id){
253 global $wpdb;
254 $task_id = absint($task_id);
255 $subtasks_data = array();
256 $subtasks = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task WHERE parent_task_id = %d ORDER BY id ASC", $task_id));
257 if( $subtasks ){
258 $subtasks_data = json_decode(wp_json_encode($subtasks), true);
259 }
260 return $subtasks_data;
261 }
262
263 public function get_subtask_progress($task_id){
264 global $wpdb;
265 $task_id = absint($task_id);
266 $completed_status_id = 4;
267 $total = (int) $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM {$wpdb->prefix}wppm_task WHERE parent_task_id = %d", $task_id));
268 $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));
269 return array('total'=>$total,'completed'=>$completed);
270 }
271
272 // Deletes a task along with its subtasks (and each one's checklists/comments/attachments).
273 public static function delete_task_and_children($task_id){
274 global $wpdb;
275 $task_id = absint($task_id);
276 $child_ids = $wpdb->get_col($wpdb->prepare("SELECT id FROM {$wpdb->prefix}wppm_task WHERE parent_task_id = %d", $task_id));
277 foreach($child_ids as $child_id){
278 self::delete_task_and_children($child_id);
279 }
280 $thread_attachment_ids = $wpdb->get_results($wpdb->prepare("SELECT attachment_ids FROM {$wpdb->prefix}wppm_task_comment WHERE task_id = %d", $task_id));
281 if(!empty($thread_attachment_ids)){
282 foreach ($thread_attachment_ids as $thread_attachment_id){
283 $attachment_ids_temp = array();
284 if($thread_attachment_id->attachment_ids){
285 $attachment_ids_temp = explode(',', $thread_attachment_id->attachment_ids);
286 }
287 foreach ($attachment_ids_temp as $attachment_id){
288 $attachment_id = absint($attachment_id);
289 $result = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_attachments WHERE id = %d", $attachment_id));
290 if(!empty($result)){
291 $attach_result = $wpdb->get_results($wpdb->prepare("SELECT file_path FROM {$wpdb->prefix}wppm_attachments WHERE file_path = %s", $result->file_path));
292 if(file_exists($result->file_path) && count($attach_result) < 2){
293 wp_delete_file($result->file_path);
294 }
295 $wpdb->delete($wpdb->prefix.'wppm_attachments', array('id' => $attachment_id));
296 }
297 }
298 }
299 }
300 $checklists = $wpdb->get_results($wpdb->prepare("SELECT id FROM {$wpdb->prefix}wppm_checklist WHERE task_id = %d", $task_id));
301 if(!empty($checklists)){
302 foreach($checklists as $checklist){
303 $checklist_id = absint($checklist->id);
304 $wpdb->delete($wpdb->prefix.'wppm_checklist_items', array('checklist_id'=>$checklist_id));
305 $wpdb->delete($wpdb->prefix.'wppm_checklist', array('id'=>$checklist_id));
306 }
307 }
308 $wpdb->delete($wpdb->prefix.'wppm_task', array('id'=>$task_id));
309 $wpdb->delete($wpdb->prefix.'wppm_task_meta', array('task_id'=>$task_id));
310 $wpdb->delete($wpdb->prefix.'wppm_task_comment', array('task_id'=>$task_id));
311 $wpdb->delete($wpdb->prefix.'wppm_task_comment_meta', array('task_id'=>$task_id));
312 do_action('wppm_after_delete_task', $task_id);
313 }
314
315 public function get_project($project_id){
316 global $wpdb;
317 $project_data = array();
318 $project_id = absint($project_id);
319 $project = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_project WHERE id = %d", $project_id));
320 if( $project ){
321 $project_data = json_decode(wp_json_encode($project), true);
322 }
323 return $project_data;
324 }
325
326 public function get_attachment($attachment_id){
327 global $wpdb;
328 $attachment_data = array();
329 $attachment_id = absint($attachment_id);
330 $attachment = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_attachments WHERE id = %d", $attachment_id));
331 if( $attachment ){
332 $attachment_data = json_decode(wp_json_encode($attachment), true);
333 }
334 return $attachment_data;
335 }
336
337 public function has_permission($permission, $task_id){
338 global $current_user,$wppmfunction,$wpdb;
339 $task_id = absint($task_id);
340 $wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
341 $wppm_edit_tasks_permission = get_option('wppm_default_edit_tasks_permission');
342 $wppm_allow_coworkers_add_checklist = get_option('wppm_allow_coworkers_add_checklist');
343 $wppm_allow_coworkers_create_task = get_option('wppm_allow_coworkers_create_task');
344 $wppm_allow_coworkers_change_status = get_option('wppm_allow_coworkers_change_status');
345 $wppm_allow_coworkers_assign_users = get_option('wppm_allow_coworkers_assign_users');
346 if(empty($comment_id)){
347 $comment_id = 0;
348 }
349 $comment_id = absint($comment_id);
350 $task_data = $wppmfunction->get_task($task_id);
351 $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));
352
353 if(!empty($task_data['project'])){
354 $project_id = $task_data['project'];
355 $project_id = absint($project_id);
356 $project_data = $wppmfunction->get_project($project_id);
357 $cu_user_id = absint($current_user->ID);
358 $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));
359 $project_users = $wpdb->get_var($wpdb->prepare("SELECT users FROM {$wpdb->prefix}wppm_project WHERE id = %d", $project_id));
360 $project_users_arr = explode(',',(string)$project_users);
361 }
362 $response = false;
363 $flag = false;
364 if(!empty($task_data)){
365 $co_worker = $task_data['users'];
366 $co_worker_array = explode(",",(string)$co_worker);
367 }
368 if((!empty($project_user_role)) && ($project_user_role == 1) && in_array($current_user->ID,$project_users_arr)){
369 $flag= true;
370 }
371 if($wppm_current_user_capability=='wppm_admin'){
372 $flag = true;
373 }
374 if(!empty($project_data) && $project_data['created_by']==$current_user->ID && $wppm_current_user_capability=='wppm_manager'){
375 $flag = true;
376 }
377 if($current_user->has_cap('manage_options')){
378 $flag = true;
379 }
380 if(!empty($project_id)){
381 $project_id = absint($project_id);
382 $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));
383 }else{
384 $public_proj_meta ="";
385 }
386 switch ($permission) {
387 case 'change_status':
388 case 'view_task':
389 case 'add_task_comment':
390 ((!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;
391 break;
392 case 'change_task_details':
393 (($flag==true) || ($current_user->ID == $task_data['created_by']) || $wppm_edit_tasks_permission == 1) ? $response = true: $response = false;
394 break;
395 case 'add_new_task':
396 (($flag==true) || $wppm_allow_coworkers_create_task == 1) ? $response = true: $response = false;
397 break;
398 case 'add_checklist':
399 (($flag==true) || $wppm_allow_coworkers_add_checklist == 1) ? $response = true: $response = false;
400 break;
401 case 'change_task_status':
402 (($flag==true) || $wppm_allow_coworkers_change_status == 1) ? $response = true: $response = false;
403 break;
404 case 'delete_task':
405 case 'clone_task':
406 (($flag==true) || ($current_user->ID == $task_data['created_by'])) ? $response = true: $response = false;
407 break;
408 case 'assign_task_users':
409 (($flag==true) || $wppm_allow_coworkers_assign_users == 1) ? $response = true: $response = false;
410 break;
411 case 'change_raised_by':
412 case 'edit_checklist':
413 case 'delete_checklist':
414 (($flag==true) ? $response = true: $response = false);
415 break;
416 }
417 return apply_filters( 'wppm_has_permission', $response, $task_id, $permission );
418 }
419
420 public function has_comment_permission($permission, $task_id,$comment_id){
421 global $current_user,$wppmfunction,$wpdb;
422 $task_id = absint($task_id);
423 $comment_id = absint($comment_id);
424 $wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
425 if(empty($comment_id)){
426 $comment_id = 0;
427 }
428 $task_data = $wppmfunction->get_task($task_id);
429 $project_user = array();
430 $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));
431
432 if(isset($task_data['project'])){
433 $project_id = $task_data['project'];
434 $project_id = absint($project_id);
435 $cu_id = absint($current_user->ID);
436 $project_data = $wppmfunction->get_project($project_id);
437 $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));
438 $project_users = $wpdb->get_var($wpdb->prepare("SELECT users FROM {$wpdb->prefix}wppm_project WHERE id = %d", $project_id));
439 $project_users_arr = explode(',',(string)$project_users);
440 }
441 $response = false;
442 $flag = false;
443 if(!empty($task_data)){
444 $co_worker = $task_data['users'];
445 $co_worker_array = explode(",",(string)$co_worker);
446 }
447 if((!empty($project_user)) && ($project_user->role_id == 1) && in_array($current_user->ID,$project_users_arr)){
448 $flag= true;
449 }
450 if($wppm_current_user_capability=='wppm_admin'){
451 $flag = true;
452 }
453
454 if(!empty($project_data) && $project_data['created_by']==$current_user->ID && $wppm_current_user_capability=='wppm_manager'){
455 $flag = true;
456 }
457
458 switch ($permission) {
459 case 'delete_task_thread':
460 case 'edit_task_comment':
461 (($flag==true) || ($current_user->ID == $task_comment->created_by)) ? $response = true: $response = false;
462 break;
463 }
464 return apply_filters( 'wppm_has_comment_permission', $response, $task_id, $comment_id, $permission );
465 }
466
467 public function has_proj_comment_permission($permission, $proj_id,$comment_id){
468 global $current_user,$wppmfunction,$wpdb;
469 $wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
470 $proj_id = absint($proj_id);
471 $comment_id = absint($comment_id);
472 $cu_id = absint($current_user->ID);
473 if(empty($comment_id)){
474 $comment_id = 0;
475 }
476 $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));
477 $project_users = $wpdb->get_var($wpdb->prepare("SELECT users FROM {$wpdb->prefix}wppm_project WHERE id = %d", $proj_id));
478 $project_users_arr = explode(',',(string)$project_users);
479 $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));
480 $response = false;
481 $flag = false;
482 $project_data = $wppmfunction->get_project($proj_id);
483 if((!empty($project_user)) && ($project_user->role_id == 1) && in_array($current_user->ID,$project_users_arr)){
484 $flag= true;
485 }
486 if($wppm_current_user_capability=='wppm_admin'){
487 $flag = true;
488 }
489 if(!empty($project_data) && $project_data['created_by']==$current_user->ID && $wppm_current_user_capability=='wppm_manager'){
490 $flag = true;
491 }
492 switch ($permission) {
493 case 'delete_proj_thread':
494 case 'edit_proj_comment':
495 (($flag==true) || ($current_user->ID == $proj_comment->created_by)) ? $response = true: $response = false;
496 break;
497 }
498 return apply_filters( 'wppm_has_proj_comment_permission', $response, $proj_id, $comment_id, $permission );
499 }
500
501 public function has_project_permission($permission,$project_id){
502 global $current_user,$wppmfunction,$wpdb ;
503 $project_data = $wppmfunction->get_project($project_id);
504 $project_id = absint($project_id);
505 $cu_id = absint($current_user->ID);
506 $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));
507 $project_users = $wpdb->get_var($wpdb->prepare("SELECT users FROM {$wpdb->prefix}wppm_project WHERE id = %d", $project_id));
508 $project_users_arr = explode(',',(string)$project_users);
509 $user = wp_get_current_user();
510 $wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
511 if(!empty($project_data)){
512 $co_worker = $project_data['users'];
513 $co_worker_array = explode(",",(string)$co_worker);
514 }
515 if(!empty($project_id)){
516 $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));
517 }else{
518 $public_proj_meta ="";
519 }
520
521 switch ($permission) {
522 case 'view_project':
523 ((!empty($co_worker_array)) && (in_array($current_user->ID,$co_worker_array )) )? $response = true: $response = false;
524 break;
525 case 'add_proj_comment':
526 ( ((!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;
527 break;
528 case 'change_project_status':
529 case 'assign_project_users':
530 case 'change_project_raised_by':
531 case 'change_project_details':
532 case 'delete_project':
533 $flag = false;
534 if( (!empty($project_user)) && ($project_user->role_id == 1) && in_array($current_user->ID,$project_users_arr)){
535 $flag = true;
536 }
537
538 (((!empty($co_worker_array)) && (in_array($current_user->ID,$co_worker_array) && $flag==true) || $wppm_current_user_capability == 'wppm_admin')) ? $response = true: $response = false;
539 break;
540 }
541 return apply_filters( 'wppm_has_project_permission', $response, $project_id, $permission );
542 }
543
544 public function change_status($task_id, $status_id){
545 global $wpdb,$wppmfunction;
546 $task_data = $wppmfunction->get_task($task_id);
547 $prev_status = $task_data['status'];
548 $values=array(
549 'status'=>esc_sql($status_id)
550 );
551 $wpdb->update($wpdb->prefix.'wppm_task', $values, array('id'=>esc_sql($task_id)));
552 $old_task_status_meta = $wppmfunction->get_task_meta($task_id,'old_task_status',true);
553 if(!empty($old_task_status_meta)){
554 $wppmfunction->delete_task_meta($task_id,'old_task_status');
555 }
556 $wppmfunction->add_task_meta($task_id,'old_task_status',$prev_status);
557
558 do_action('wppm_set_change_task_status', $task_id, $status_id, $prev_status);
559 }
560
561 public function change_raised_by($task_id, $user_id){
562 global $wpdb;
563 $values=array(
564 'created_by'=>absint($user_id)
565 );
566 $wpdb->update($wpdb->prefix.'wppm_task', $values, array('id'=>absint($task_id)));
567 }
568
569 public function change_task_label($task_id, $task_label){
570 global $wpdb;
571 $values=array(
572 'task_name'=>stripslashes($task_label)
573 );
574 $wpdb->update($wpdb->prefix.'wppm_task', $values, array('id'=>absint($task_id)));
575 }
576
577 public function change_task_project_label($task_id, $project_label){
578 global $wpdb;
579 $values=array(
580 'project'=>absint($project_label)
581 );
582 $wpdb->update($wpdb->prefix.'wppm_task', $values, array('id'=>absint($task_id)));
583 }
584
585 public function change_start_date($task_id, $task_start_date){
586 global $wpdb;
587 $values=array(
588 'start_date'=>$task_start_date
589 );
590 $wpdb->update($wpdb->prefix.'wppm_task', $values, array('id'=>absint($task_id)));
591 }
592
593 public function change_end_date($task_id, $task_end_date){
594 global $wpdb;
595 $values=array(
596 'end_date'=>$task_end_date
597 );
598 $wpdb->update($wpdb->prefix.'wppm_task', $values, array('id'=>absint($task_id)));
599 }
600
601 public function change_priority($task_id, $task_priority){
602 global $wpdb;
603 $values=array(
604 'priority'=>absint($task_priority)
605 );
606 $wpdb->update($wpdb->prefix.'wppm_task', $values, array('id'=>absint($task_id)));
607 }
608
609 public function change_description($task_id, $task_description){
610 global $wpdb;
611 $task_description = !empty($task_description) ? wp_kses_post($task_description) : '';
612 $values=array(
613 'description'=>$task_description
614 );
615 $wpdb->update($wpdb->prefix.'wppm_task', $values, array('id'=>absint($task_id)));
616 }
617
618 public function change_project($task_id,$proj_id){
619 global $wpdb,$wppmfunction;
620 $task_data = $wppmfunction->get_task($task_id);
621 $old_proj = $task_data['project'];
622 $old_proj = absint( $old_proj);
623 $proj_id = absint( $proj_id);
624 $project_data = $wppmfunction->get_project($proj_id);
625 $task_assign_users = $task_data['users'];
626 $tusers_array = array();
627 if(!empty($task_data['users'])){
628 $task_users_array = explode(",",(string)$task_assign_users);
629 }
630 if(!empty($project_data['users'])){
631 $project_users = explode(",",(string)$project_data['users']);
632 }
633 if(!empty($project_users)){
634 if(!empty($task_users_array)){
635 foreach($task_users_array as $tuser){
636 if(!in_array($tuser,$project_users)){
637 $wpdb->delete( $wpdb->prefix.'wppm_project_users', array( 'proj_id' => "$proj_id",'user_id'=>"$tuser") );
638 }
639 elseif(in_array($tuser,$project_users)){
640 $tusers_array[] = $tuser;
641 $tuser = absint($tuser);
642 $sql = $wpdb->prepare("SELECT role_id FROM {$wpdb->prefix}wppm_project_users WHERE proj_id = %d AND user_id = %d", $old_proj, $tuser);
643 $old_proj_user_role = $wpdb->get_var( $sql );
644 $sql = $wpdb->prepare("SELECT role_id FROM {$wpdb->prefix}wppm_project_users WHERE proj_id = %d AND user_id = %d", $proj_id, $tuser);
645 $proj_users_role = $wpdb->get_var( $sql );
646 if(!empty( $old_proj_user_role) && $old_proj_user_role!=$proj_users_role){
647 $value=array(
648 'role_id'=>absint($proj_users_role)
649 );
650 $wpdb->update($wpdb->prefix.'wppm_project_users', $value, array('proj_id'=>"$proj_id", 'user_id'=>"$tuser"));
651 }
652 }
653 }
654 }
655 }
656 $tusers = implode(",",$tusers_array);
657 $values=array(
658 'project'=>absint($proj_id),
659 'users'=>absint($tusers)
660 );
661 $wpdb->update($wpdb->prefix.'wppm_task', $values, array('id'=>absint($task_id)));
662 }
663
664 public function get_task_comment($comment_id){
665 global $wpdb;
666 $task_comment_data = array();
667 $comment_id = absint($comment_id);
668 $task_comment = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task_comment WHERE id=%d", $comment_id));
669 if( $task_comment ){
670 $task_comment_data = json_decode(wp_json_encode($task_comment), true);
671 }
672 return $task_comment_data;
673 }
674
675 public function get_proj_comment($comment_id){
676 global $wpdb;
677 $project_comment_data = array();
678 $comment_id = absint($comment_id);
679 $project_comment = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_project_comment WHERE id=%d", $comment_id));
680 if( $project_comment ){
681 $project_comment_data = json_decode(wp_json_encode($project_comment), true);
682 }
683 return $project_comment_data;
684 }
685
686 public function change_task_comment($comment_id,$comment_body){
687 global $wpdb;
688 $comment_id = absint($comment_id);
689 $comment_body = !empty($comment_body) ? wp_kses_post($comment_body) : '';
690 $values=array(
691 'body'=>$comment_body
692 );
693 $wpdb->update($wpdb->prefix.'wppm_task_comment', $values, array('id'=>"$comment_id"));
694 }
695
696 public function change_proj_comment($comment_id,$comment_body){
697 global $wpdb;
698 $comment_id = absint($comment_id);
699 $comment_body = !empty($comment_body) ? wp_kses_post($comment_body) : '';
700 $values=array(
701 'body'=>$comment_body
702 );
703 $wpdb->update($wpdb->prefix.'wppm_project_comment', $values, array('id'=>"$comment_id"));
704 }
705
706 public function change_project_label($project_id,$project_label){
707 global $wpdb;
708 $project_id = absint($project_id);
709 $values=array(
710 'project_name'=>esc_sql($project_label)
711 );
712 $wpdb->update($wpdb->prefix.'wppm_project', $values, array('id'=>"$project_id"));
713 }
714
715 public function change_project_start_date($project_id, $project_start_date){
716 global $wpdb;
717 $project_id = absint($project_id);
718 $project_start_date = esc_sql($project_start_date);
719 $values=array(
720 'start_date'=>$project_start_date
721 );
722 $wpdb->update($wpdb->prefix.'wppm_project', $values, array('id'=>"$project_id"));
723 }
724
725 public function change_project_end_date($project_id, $project_end_date){
726 global $wpdb;
727 $project_id = absint($project_id);
728 $project_end_date = esc_sql($project_end_date);
729 $values=array(
730 'end_date'=>$project_end_date
731 );
732 $wpdb->update($wpdb->prefix.'wppm_project', $values, array('id'=>$project_id));
733 }
734
735 public function change_category($project_id, $project_category){
736 global $wpdb;
737 $project_id = absint($project_id);
738 $project_category = absint($project_category);
739 $values=array(
740 'cat_id'=>$project_category
741 );
742 $wpdb->update($wpdb->prefix.'wppm_project', $values, array('id'=>"$project_id"));
743 }
744
745 public function change_project_description($project_id, $project_description){
746 global $wpdb;
747 $project_id = absint($project_id);
748 $project_description = (string) ( $project_description ?? '' );
749 $values = array(
750 'description' => wp_kses_post( $project_description )
751 );
752 $wpdb->update($wpdb->prefix.'wppm_project', $values, array('id'=>"$project_id"));
753 }
754
755 public function change_project_status($project_id,$status_id){
756 global $wpdb,$wppmfunction,$current_user;
757 $change_status_value= array();
758 $proj_data = $wppmfunction->get_project($project_id);
759 $prev_status = $proj_data['status'];
760 $cu_id = absint($current_user->ID);
761 $values=array(
762 'status'=>absint($status_id)
763 );
764 $project_id = absint($project_id);
765 $wpdb->update($wpdb->prefix.'wppm_project', $values, array('id'=>$project_id));
766 $old_project_status_meta = $wppmfunction->get_project_meta($project_id,'old_project_status',true);
767 if(!empty($old_project_status_meta)){
768 $wppmfunction->delete_project_meta($project_id,'old_project_status');
769 }
770 $change_status_value = array('prev_status'=>"$prev_status",'new_status'=>"$status_id");
771 $change_status_obj = serialize($change_status_value);
772 $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" );
773 $wpdb->insert($wpdb->prefix . 'wppm_project_comment',$log_values);
774 $log_id = absint($wpdb->insert_id);
775 $proj_log_values = array('proj_id'=>"$project_id",'comment_id'=>"$log_id",'comment_type'=>'change_proj_status');
776 $wpdb->insert($wpdb->prefix . 'wppm_project_comment_meta',$proj_log_values);
777 $wppmfunction->add_project_meta($project_id,'old_project_status',$prev_status);
778 do_action('wppm_set_change_project_status', $project_id, $status_id, $prev_status);
779 }
780
781 public function change_project_raised_by($project_id, $user_id){
782 global $wpdb;
783 $values=array(
784 'created_by'=>absint($user_id)
785 );
786 $wpdb->update($wpdb->prefix.'wppm_project', $values, array('id'=>"$project_id"));
787 }
788
789 // Email Notification types
790 public function get_email_notification_types(){
791 $notification_types = array(
792 'new_project'=>esc_html__('New Project','taskbuilder'),
793 'new_task'=>esc_html__('New Task','taskbuilder'),
794 'change_project_status' => esc_html__('Change Project Status','taskbuilder'),
795 'change_task_status' => esc_html__('Change Task Status','taskbuilder'),
796 'change_project_assign_users' => esc_html__('Change Project Assign Users','taskbuilder'),
797 'change_task_assign_users' => esc_html__('Change Task Assign Users','taskbuilder'),
798 'new_discussion' => esc_html__('New Comment','taskbuilder'),
799 'new_proj_discussion' =>esc_html__('New Project Comment','taskbuilder')
800 );
801 return apply_filters('wppm_en_types',$notification_types);
802 }
803
804 public function check_rtl(){
805 $rtl_locale = array('ar','ary','ckb','haz','he_IL','fa_IR','ps','ur','ug_CN');
806 if(in_array(get_locale(),$rtl_locale)){
807 return 'rtl';
808 }else{
809 return 'ltr';
810 }
811 }
812
813 public function add_project_meta($proj_id,$meta_key,$meta_value){
814 global $wpdb;
815 $wpdb->insert(
816 $wpdb->prefix . 'wppm_project_meta',
817 array(
818 'project_id' =>$proj_id,
819 'meta_key' => $meta_key,
820 'meta_value' =>$meta_value
821 ));
822 }
823
824 public function add_task_meta($task_id,$meta_key,$meta_value){
825 global $wpdb;
826 $wpdb->insert(
827 $wpdb->prefix . 'wppm_task_meta',
828 array(
829 'task_id' => $task_id,
830 'meta_key' => $meta_key,
831 'meta_value' =>$meta_value
832 ));
833 }
834
835 public function get_project_meta($project_id,$meta_key,$flag = false){
836 global $wpdb,$wppmfunction;
837 $project_id = absint($project_id);
838 $meta_key = esc_sql($meta_key);
839 if($flag){
840 $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));
841 $project_meta = isset($get_meta) ? stripslashes($get_meta) : '';
842
843 } else {
844 $project_meta = array();
845 $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));
846 if( (!empty($results)) ){
847 foreach ($results as $result) {
848 if(!empty($result)){
849 $project_meta[]= stripslashes($result->meta_value);
850 }
851 }
852 }
853 }
854 return $project_meta;
855 }
856
857 public function get_task_meta($task_id,$meta_key,$flag = false){
858 global $wpdb,$wppmfunction;
859 $task_id = absint($task_id);
860 $meta_key = esc_sql($meta_key);
861 if($flag){
862 $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));
863 $task_meta = isset($get_meta) ? stripslashes($get_meta) : '';
864
865 } else {
866 $task_meta = array();
867 $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));
868 if( (!empty($results)) ){
869 foreach ($results as $result) {
870 if(!empty($result)){
871 $task_meta[]= stripslashes($result->meta_value);
872 }
873 }
874 }
875 }
876 return $task_meta;
877 }
878
879 public function get_previously_assigned_users($project_id){
880 global $wpdb,$wppmfunction;
881 $prev_assigned_users = $wppmfunction->get_project_meta($project_id,'prev_assigned_users');
882 $user_emails = array();
883 if(!empty($prev_assigned_users)){
884 foreach ($prev_assigned_users as $user) {
885 $userdata = get_userdata($user);
886 $user_emails[] = $userdata->user_email;
887
888 }
889 }
890 return apply_filters( 'wppm_get_prev_assigned_users_emails', $user_emails ,$project_id);
891 }
892
893 public function get_project_creator_email($project_id){
894 global $wpdb,$wppmfunction;
895 $project_data = $wppmfunction->get_project($project_id,'created_by');
896 $userdata = get_userdata($project_data['created_by']);
897 if(!empty( $userdata)){
898 $proj_creator_email[] = $userdata->user_email;
899 }
900 return apply_filters( 'wppm_get_project_creator_email', $proj_creator_email ,$project_id);
901 }
902
903 public function get_task_creator_email($task_id){
904 global $wpdb,$wppmfunction;
905 $task_data = $wppmfunction->get_task($task_id,'created_by');
906 $userdata = get_userdata($task_data['created_by']);
907 if(!empty( $userdata)){
908 $task_creator_email[] = $userdata->user_email;
909 }
910 return apply_filters( 'wppm_get_task_creator_email', $task_creator_email ,$task_id);
911 }
912
913 public function get_previously_assigned_task_users($task_id){
914 global $wpdb,$wppmfunction;
915 $prev_assigned_task_users = $wppmfunction->get_task_meta($task_id,'prev_assigned_task_users');
916 $user_emails = array();
917 if(!empty($prev_assigned_task_users)){
918 foreach ($prev_assigned_task_users as $user) {
919 if(!empty($user)){
920 $userdata = get_userdata($user);
921 $user_emails[] = $userdata->user_email;
922 }
923 }
924 }
925 return apply_filters( 'wppm_get_prev_assigned_task_users_emails', $user_emails ,$task_id);
926 }
927 /**
928 * Update project meta for project
929 */
930 function update_project_meta($project_id ,$meta_key ,$meta_value){
931 global $wpdb;
932 $project_id = absint($project_id);
933 $meta_key = esc_sql($meta_key);
934 $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));
935 $wpdb->update($wpdb->prefix.'wppm_project_meta', $meta_value, array('project_id'=>$project_id,'meta_key' => "$meta_key"));
936 }
937
938 /**
939 * Update task meta for task
940 */
941 function update_task_meta($task_id ,$meta_key ,$meta_value){
942 global $wpdb;
943 $task_id = absint($task_id);
944 $meta_key = esc_sql($meta_key);
945 $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));
946 $wpdb->update($wpdb->prefix.'wppm_task_meta', $meta_value, array('task_id'=>$task_id,'meta_key' => "$meta_key"));
947 }
948
949 function delete_project_meta($project_id ,$meta_key){
950 global $wpdb;
951 $project_id = absint($project_id);
952 $meta_key = ($meta_key);
953 $wpdb->delete( $wpdb->prefix.'wppm_project_meta', array( 'project_id' => "$project_id",'meta_key'=>"$meta_key") );
954 }
955
956 function delete_task_meta($task_id ,$meta_key){
957 global $wpdb;
958 $task_id = absint($task_id);
959 $meta_key = ($meta_key);
960 $wpdb->delete( $wpdb->prefix.'wppm_task_meta', array( 'task_id' => "$task_id",'meta_key'=>"$meta_key") );
961 }
962
963 public function replace_macro($str,$project_id){
964 include WPPM_ABSPATH . 'includes/replace_macro.php';
965 return $str;
966 }
967
968 public function replace_task_macro($str,$task_id){
969 include WPPM_ABSPATH . 'includes/replace_task_macro.php';
970 return $str;
971 }
972
973 public function get_old_project_status_name($id){
974 global $wppmfunction, $wpdb;
975 $old_project_status = $wppmfunction->get_project_meta($id,'old_project_status',true);
976 $old_project_status = absint($old_project_status);
977 $status_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}wppm_project_statuses WHERE id = %d",$old_project_status));
978 return $status_name;
979 }
980
981 public function get_new_project_status_name($status_id){
982 global $wpdb;
983 $status_id = absint($status_id);
984 $status_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}wppm_project_statuses WHERE id = %d",$status_id));
985 return $status_name;
986 }
987
988 public function get_old_task_status_name($task_id){
989 global $wppmfunction, $wpdb;
990 $old_task_status = $wppmfunction->get_task_meta($task_id,'old_task_status',true);
991 $old_task_status = absint($old_task_status);
992 $status_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}wppm_task_statuses WHERE id = %d",$old_task_status));
993 return $status_name;
994 }
995
996 public function get_new_task_status_name($status_id){
997 global $wpdb;
998 $status_id = absint($status_id);
999 $status_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}wppm_task_statuses WHERE id = %d",$status_id));
1000 return $status_name;
1001 }
1002
1003 public function get_project_category_name($cat_id){
1004 global $wpdb;
1005 $cat_id = absint($cat_id);
1006 if(!empty($cat_id)){
1007 $cat_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}wppm_project_categories WHERE id = %d",$cat_id));
1008 }else{
1009 $cat_name = "";
1010 }
1011 return $cat_name;
1012 }
1013
1014 public function get_project_assigned_users_names($project_id){
1015 global $wppmfunction;
1016 $wppm_project_data = $wppmfunction->get_project($project_id);
1017 if(!empty($wppm_project_data['users'])){
1018 $wppm_project_assign_users_array = explode(",", $wppm_project_data['users']);
1019 }else{
1020 $wppm_project_assign_users_array = array();
1021 }
1022 $users_names = array();
1023 if(!empty($wppm_project_assign_users_array)){
1024 foreach ($wppm_project_assign_users_array as $user_id) {
1025 if(!empty($user_id)){
1026 $userdata = get_userdata( $user_id );
1027 if(!empty($userdata)){
1028 $users_names[] = $userdata->display_name;
1029 }
1030 }
1031 }
1032 }
1033 return implode(', ', $users_names);
1034 }
1035
1036 public function get_task_assigned_users_names($task_id){
1037 global $wppmfunction;
1038 $wppm_task_data = $wppmfunction->get_task($task_id);
1039 $wppm_task_assign_users_array = explode(",", (string)$wppm_task_data['users']);
1040 $users_names = array();
1041 if(!empty($wppm_task_assign_users_array)){
1042 foreach ($wppm_task_assign_users_array as $user_id) {
1043 if(!empty($user_id)){
1044 $userdata = get_userdata( $user_id );
1045 if(!empty($userdata)){
1046 $users_names[] = $userdata->display_name;
1047 }
1048 }
1049 }
1050 }
1051 return implode(', ', $users_names);
1052 }
1053
1054 public function get_project_previously_assigned_users_names($project_id){
1055 global $wppmfunction;
1056 $wppm_project_assign_users = $wppmfunction->get_project_meta($project_id,'prev_assigned_users');
1057 $users_names = array();
1058 if(!empty($wppm_project_assign_users)){
1059 foreach ($wppm_project_assign_users as $user) {
1060 if(!empty($user)){
1061 $userdata = get_userdata( $user );
1062 $users_names[] = $userdata->display_name;
1063 }
1064 }
1065 }
1066 return implode(', ', $users_names);
1067 }
1068
1069 public function get_task_previously_assigned_users_names($task_id){
1070 global $wppmfunction;
1071 $wppm_task_assign_users = $wppmfunction->get_task_meta($task_id,'prev_assigned_task_users');
1072 $users_names = array();
1073 if(!empty($wppm_task_assign_users)){
1074 foreach ($wppm_task_assign_users as $user) {
1075 if(!empty($user)){
1076 $userdata = get_userdata( $user );
1077 $users_names[] = $userdata->display_name;
1078 }
1079 }
1080 }
1081 return implode(', ', $users_names);
1082 }
1083
1084 public function get_task_priority_name($priority){
1085 global $wpdb;
1086 $priority = absint($priority);
1087 $priority_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}wppm_task_priorities WHERE id = %d",$priority));
1088 return $priority_name;
1089 }
1090
1091 public function get_last_comment_user_name($task_id){
1092 global $wpdb;
1093 $task_id = absint($task_id);
1094 $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));
1095 if(!empty($task_comment_creator)){
1096 $user = get_userdata( $task_comment_creator );
1097 return $user->display_name;
1098 }
1099 }
1100
1101 public function get_last_comment_body($task_id){
1102 global $wpdb;
1103 $task_id = absint($task_id);
1104 $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));
1105 return $task_comment;
1106 }
1107
1108 public function create_duplicate_task($ptask_id, $project_id,$internal_code_flag=false){
1109 include WPPM_ABSPATH . 'includes/admin/tasks/open_task/wppm_set_clone_task.php';
1110 }
1111
1112 public function get_last_comment_proj_user_name($project_id){
1113 global $wpdb;
1114 $project_id = absint($project_id);
1115 $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));
1116 if(!empty($proj_comment_creator)){
1117 $user = get_userdata( $proj_comment_creator );
1118 return $user->display_name;
1119 }
1120 }
1121
1122 public function get_proj_comment_body($project_id){
1123 global $wpdb;
1124 $project_id = absint($project_id);
1125 $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));
1126 return $proj_comment;
1127 }
1128
1129 public function get_project_url($project_id, $view){
1130 global $wpdb,$wppmfunction;
1131 $project_id = absint($project_id);
1132 $page_settings = get_option( 'wppm-page-settings' );
1133 if ( $view == '0' ) {
1134 $url = admin_url( 'admin.php?page=wppm-projects&section=project-list&id=' . $project_id );
1135 } else {
1136 $url = get_permalink( $page_settings['project-url-page'] );
1137 $auth_id = $wppmfunction->get_project_meta($project_id,'project_auth_code',true);
1138
1139 $url = add_query_arg(
1140 array(
1141 'project-id' => $project_id,
1142 'auth-code' => $auth_id,
1143
1144 ),
1145 $url
1146 );
1147 }
1148
1149 return $url;
1150 }
1151
1152 public function get_task_url($task_id, $view){
1153 global $wpdb,$wppmfunction;
1154 $task_id = absint($task_id);
1155 $page_settings = get_option( 'wppm-page-settings' );
1156 if ( $view == '0' ) {
1157 $url = admin_url( 'admin.php?page=wppm-tasks&section=task-list&id=' . $task_id );
1158 } else{
1159 $url = get_permalink( $page_settings['task-url-page'] );
1160 $auth_id = $this->wppm_get_auth_code($task_id);
1161 $url = add_query_arg(
1162 array(
1163 'task-id' => $task_id,
1164 'auth-code' => $auth_id,
1165 ),
1166 $url
1167 );
1168
1169 }
1170
1171 return $url;
1172 }
1173
1174 public function wppm_user_role(){
1175 $user_role = array(
1176 'wppm_admin' => array(
1177 'label' => esc_html__('WPPM Administrator','taskbuilder'),
1178 ),
1179 'wppm_manager' => array(
1180 'label' => esc_html__('WPPM Manager','taskbuilder'),
1181 )
1182 );
1183 return $user_role;
1184 }
1185
1186 public static function wppm_toolbar_options_setting() {
1187 $toolbar = array(
1188 array(
1189 'name' => esc_attr__( 'Bold', 'taskbuilder' ),
1190 'value' => 'bold',
1191 ),
1192 array(
1193 'name' => esc_attr__( 'Italic', 'taskbuilder' ),
1194 'value' => 'italic',
1195 ),
1196 array(
1197 'name' => esc_attr__( 'Underline', 'taskbuilder' ),
1198 'value' => 'underline',
1199 ),
1200 array(
1201 'name' => esc_attr__( 'Blockquote', 'taskbuilder' ),
1202 'value' => 'blockquote',
1203 ),
1204 array(
1205 'name' => esc_attr__( 'Align', 'taskbuilder' ),
1206 'value' => 'align',
1207 ),
1208 array(
1209 'name' => esc_attr__( 'Bulleted list', 'taskbuilder' ),
1210 'value' => 'bullist',
1211 ),
1212 array(
1213 'name' => esc_attr__( 'Numbered list', 'taskbuilder' ),
1214 'value' => 'numlist',
1215 ),
1216 array(
1217 'name' => esc_attr__( 'Right to left', 'taskbuilder' ),
1218 'value' => 'rtl',
1219 ),
1220 array(
1221 'name' => esc_attr__( 'Link', 'taskbuilder' ),
1222 'value' => 'link',
1223 ),
1224 array(
1225 'name' => esc_attr__( 'Image', 'taskbuilder' ),
1226 'value' => 'wppm_insert_editor_img',
1227 ),
1228 array(
1229 'name' => esc_attr__( 'Text Color', 'taskbuilder' ),
1230 'value' => 'forecolor',
1231 ),
1232 array(
1233 'name' => esc_attr__( 'Text Background Color', 'taskbuilder' ),
1234 'value' => 'backcolor',
1235 ),
1236 array(
1237 'name' => esc_attr__( 'Strikethrough', 'taskbuilder' ),
1238 'value' => 'strikethrough',
1239 ),
1240 );
1241 return $toolbar;
1242 }
1243
1244 public static function wppm_load_setting_header_html() {
1245 ?>
1246 <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; ">
1247 <div class="wppm-header-title" style="display: flex; align-items: center; gap: 3px;">
1248 <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;"/>
1249 <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>
1250 </div>
1251 <div class="wppm-header-button" style="display: flex; justify-content: flex-end; gap: 3px;">
1252 <div class="wppm-btn
1253 " 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);">
1254 <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;"/>
1255 <a href="https://taskbuilder.net/help/" target="__blank" style="color:#fff"><?php esc_html_e( 'Help', 'taskbuilder' )?></a>
1256 </div>
1257 <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);">
1258 <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;"/>
1259 <a href="https://taskbuilder.net/support/?wpsc-section=ticket-list" target="__blank" style="color:#fff"><?php esc_html_e( 'Support', 'taskbuilder' )?></a>
1260 </div>
1261 <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);">
1262 <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;"/>
1263 <a href="https://taskbuilder.net/pricing/" target="__blank" style="color:#fff"><?php esc_html_e( 'Get pro', 'taskbuilder' )?></a>
1264 </div>
1265 </div>
1266 </div>
1267 <?php
1268 }
1269
1270 public function wppm_get_duration($start_date, $end_date){
1271 if ( empty($start_date) || empty($end_date) || $start_date=='0000-00-00 00:00:00' || $end_date =='0000-00-00 00:00:00') {
1272 return '';
1273 }
1274
1275 $start_ts = strtotime($start_date);
1276 $end_ts = strtotime($end_date);
1277
1278 if ( $end_ts <= $start_ts ) {
1279 return '0 min';
1280 }
1281
1282 $diff = $end_ts - $start_ts;
1283
1284 $days = floor($diff / 86400);
1285 $hours = floor(($diff % 86400) / 3600);
1286 $minutes = floor(($diff % 3600) / 60);
1287
1288 $duration = [];
1289
1290 if ($days > 0) $duration[] = $days . 'd';
1291 if ($hours > 0) $duration[] = $hours . 'h';
1292 if ($minutes > 0 || empty($duration)) $duration[] = $minutes . 'm';
1293
1294 return implode(' ', $duration);
1295
1296 }
1297
1298 public function wppm_highlight_user_mentions($content, $current_user_id) {
1299
1300 return preg_replace_callback(
1301 '/<span[^>]*class="wppm-mention"[^>]*data-user-id="(\d+)"[^>]*>(.*?)<\/span>/is',
1302 function($matches) use ($current_user_id) {
1303
1304 $user_id = intval($matches[1]);
1305 $text = $matches[2];
1306
1307 // already processed → skip
1308 if (strpos($matches[0], 'wppm-mention-me') !== false) {
1309 return $matches[0];
1310 }
1311
1312 if ($user_id === $current_user_id) {
1313 return '<span class="wppm-mention wppm-mention-me" data-user-id="' . esc_attr($user_id) . '">' . $text . '</span>';
1314 }
1315
1316 return '<span class="wppm-mention" data-user-id="' . esc_attr($user_id) . '">' . $text . '</span>';
1317 },
1318 $content
1319 );
1320 }
1321 function wppm_clean_mentions_html($content) {
1322 // Remove dropdown items
1323 $content = preg_replace('/<div[^>]*class="mention-item"[^>]*>.*?<\/div>/is', '', $content);
1324
1325 // Remove mention dropdown container
1326 $content = preg_replace('/<div[^>]*id="wppm_mention_list"[^>]*>.*?<\/div>/is', '', $content);
1327
1328 return $content;
1329 }
1330
1331 function wppm_extract_mentions($comment) {
1332 preg_match_all('/data-user-id="(\d+)"/', $comment, $matches);
1333 return $matches[1];
1334 }
1335
1336 function wppm_get_users_from_mentions($user_ids) {
1337 $users = [];
1338 foreach ($user_ids as $user_id) {
1339 $user = get_user_by('id', intval($user_id));
1340 if ($user) {
1341 $users[] = $user;
1342 }
1343 }
1344 return $users;
1345 }
1346
1347 function wppm_send_mention_email($email_addresses, $comment, $task_id) {
1348 $page_setting = get_option('wppm-page-settings');
1349 $from_name = get_option('wppm_en_from_name');
1350 $from_email = get_option('wppm_en_from_email');
1351 $view = $page_setting['task-url-page'];
1352 $subject = esc_html__("You were mentioned in a comment", "taskbuilder");
1353 $to = isset($email_addresses[0]) ? $email_addresses[0] : '';
1354 if (!$to) {
1355 return;
1356 }
1357 unset($email_addresses[0]);
1358 $headers = "From: {$from_name} <{$from_email}>\r\n";
1359 foreach ($email_addresses as $email_address) {
1360 $headers .= "BCC: {$email_address}\r\n";
1361 }
1362 $headers .= "Content-Type: text/html; charset=UTF-8\r\n";
1363 $task_url = $this->get_task_url($task_id, $view);
1364 $message = esc_html__("Hello,", "taskbuilder");
1365 $message .= "<br><br>";
1366 $message .= esc_html__("You were mentioned in a comment:", "taskbuilder");
1367 $message .= "<br><br>";
1368 $message .= nl2br(esc_html(strip_tags($comment)));
1369 $message .= "<br><br>";
1370 $message .= esc_html__("View Task:", "taskbuilder") . " ";
1371 $message .= '<a class="wppm_link" href="' . esc_url($task_url) . '" target="_blank">' . esc_html__("View Task", "taskbuilder") . '</a>';
1372 wp_mail($to, $subject, $message, $headers);
1373 do_action('wppm_after_sent_mention_mail', $email_addresses, $comment, $task_id);
1374 }
1375
1376 function wppm_insert_notification($user_id, $message, $link,$is_read,$type) {
1377 global $wpdb;
1378 $wpdb->insert(
1379 $wpdb->prefix . 'wppm_notifications',
1380 [
1381 'user_id' => $user_id,
1382 'message' => $message,
1383 'link' => $link,
1384 'is_read' => $is_read,
1385 'notification_type'=>$type,
1386 'created_at' => current_time('mysql')
1387 ]
1388 );
1389 }
1390 }
1391 endif;
1392 $GLOBALS['wppmfunction'] = new WPPM_Functions();