PluginProbe
Taskbuilder – Project Management & Task Management Tool With Kanban Board / trunk
Taskbuilder – Project Management & Task Management Tool With Kanban Board vtrunk
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 1.0.6 All 57 releases
taskbuilder / includes / class-wppm-functions.php

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

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