NotificationService::getXoopsUsers()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 17
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 12
c 0
b 0
f 0
nc 3
nop 2
dl 0
loc 17
rs 9.8666
1
<?php declare(strict_types=1);
2
3
namespace XoopsModules\Xhelp;
4
5
/*
6
 * You may not change or alter any portion of this comment or credits
7
 * of supporting developers from this source code or any supporting source code
8
 * which is considered copyrighted (c) material of the original comment or credit authors.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
 */
14
15
/**
16
 * @copyright    {@link https://xoops.org/ XOOPS Project}
17
 * @license      {@link https://www.gnu.org/licenses/gpl-2.0.html GNU GPL 2 or later}
18
 * @author       Brian Wahoff <[email protected]>
19
 * @author       XOOPS Development Team
20
 */
21
22
if (!\defined('XHELP_CONSTANTS_INCLUDED')) {
23
    exit();
24
}
25
26
//require_once XHELP_BASE_PATH . '/functions.php';
27
// require_once XHELP_CLASS_PATH . '/Service.php';
28
29
/**
30
 * NotificationService class
31
 *
32
 * Part of the Messaging Subsystem.  Uses the xoopsNotificationHandler class to send emails to users
33
 *
34
 *
35
 * @author  Brian Wahoff <[email protected]>
36
 */
37
class NotificationService extends Service
38
{
39
    /**
40
     * Instance of the staff object
41
     *
42
     * @var object
43
     */
44
    public $staffHandler;
45
    /**
46
     * Instance of the xoops text sanitizer
47
     *
48
     * @var object
49
     */
50
    public $myTextSanitizer;
51
    /**
52
     * Path to the mail_template directory
53
     *
54
     * @var string
55
     */
56
    public $templateDir = '';
57
    /**
58
     * Instance of the module object
59
     *
60
     * @var object
61
     */
62
    public $module;
63
    /**
64
     * Instance of the notification object
65
     *
66
     * @var object
67
     */
68
    public $notificationHandler;
69
    /**
70
     * Instance of the status object
71
     *
72
     * @var object
73
     */
74
    public $statusHandler;
75
76
    /**
77
     * Class Constructor
78
     */
79
    public function __construct()
80
    {
81
        global $xoopsConfig, $xoopsModule;
82
        $db                        = \XoopsDatabaseFactory::getDatabaseConnection();
83
        $this->myTextSanitizer     = \MyTextSanitizer::getInstance();
84
        $this->templateDir         = $this->getTemplateDir($xoopsConfig['language']);
85
        $this->module              = Utility::getModule();
86
        $this->staffHandler        = new StaffHandler($db);
87
        $this->notificationHandler = new NotificationHandler($db);
88
        $this->statusHandler       = new StatusHandler($db);
89
        $this->helper              = Helper::getInstance();
0 ignored issues
show
Bug introduced by
The property helper is declared private in XoopsModules\Xhelp\Service and cannot be accessed from this context.
Loading history...
90
        $this->init();
91
    }
92
93
    /**
94
     * Retrieve the email_template object that is requested
95
     *
96
     * @param string|int $category ID or name of item
97
     * @param string     $event    name of event
98
     * @param object     $module   $xoopsModule object
99
     * @param mixed      $template_id
100
     *
101
     * @return bool|array
102
     */
103
    public function getEmailTpl($category, string $event, object $module, &$template_id)
104
    {
105
        $templates = $module->getInfo('_email_tpl');   // Gets $modversion['_email_tpl'] array from xoops_version.php
106
107
        foreach ($templates as $tpl_id => $tpl) {
108
            if ($tpl['category'] == $category && $tpl['name'] == $event) {
109
                $template_id = $tpl_id;
110
111
                return $tpl;
112
            }
113
        }
114
115
        return false;
116
    }
117
118
    /*
119
     * Returns a group of $staffRole objects
120
     *
121
     * @access int $dept ID of department
122
     * @access array $aMembers array of all possible staff members
123
     *
124
     * @access private
125
     */
126
127
    /**
128
     * @param int|string $dept
129
     * @param array      $aMembers
130
     * @return array
131
     */
132
    public function &getStaffRoles($dept, array $aMembers): array
133
    {
134
        $staffRoleHandler = $this->helper->getHandler('StaffRole');
0 ignored issues
show
Bug introduced by
The property helper is declared private in XoopsModules\Xhelp\Service and cannot be accessed from this context.
Loading history...
135
136
        // Retrieve roles of all members
137
        $criteria = new \CriteriaCompo(new \Criteria('uid', '(' . \implode(',', $aMembers) . ')', 'IN'));
138
        $criteria->add(new \Criteria('deptid', $dept));
139
        $staffRoles = $staffRoleHandler->getObjects($criteria, false);    // array of staff role objects
140
141
        return $staffRoles;
142
    }
143
144
    /*
145
     * Gets a list of staff members that have the notification selected
146
     *
147
     * @access object $staffRoles staffRole objects
148
     * @access array $aMembers array of all possible staff members
149
     * @access array $staff_options array of acceptable departments
150
     *
151
     * @access private
152
     */
153
154
    /**
155
     * @param array $staffRoles
156
     * @param array $aMembers
157
     * @param array $staff_options
158
     * @return array
159
     */
160
    public function &getEnabledStaff(array $staffRoles, array $aMembers, array $staff_options): array
161
    {
162
        // Get only staff members that have permission for this notification
163
        $enabled_staff = [];
164
        foreach ($aMembers as $aMember) {
165
            foreach ($staffRoles as $staffRole) {
166
                if ($staffRole->getVar('uid') == $aMember && \in_array($staffRole->getVar('roleid'), $staff_options)) {
167
                    $enabled_staff[$aMember] = $aMember;
168
                    break;
169
                }
170
            }
171
        }
172
        unset($aMembers);
173
174
        return $enabled_staff;
175
    }
176
177
    /*
178
     * Used to retrieve a list of xoops user objects
179
     *
180
     * @param array $enabled_staff array of staff members that have the notification enabled
181
     *
182
     * @access private
183
     */
184
185
    /**
186
     * @param array $enabled_staff
187
     * @param bool  $active_only
188
     * @return array
189
     */
190
    public function &getXoopsUsers(array $enabled_staff, bool $active_only = true): array
191
    {
192
        $xoopsUsers = [];
193
        /** @var \XoopsMemberHandler $memberHandler */
194
        $memberHandler = \xoops_getHandler('member');
195
        if (\count($enabled_staff) > 0) {
196
            $criteria = new \CriteriaCompo(new \Criteria('uid', '(' . \implode(',', $enabled_staff) . ')', 'IN'));
197
        } else {
198
            return $xoopsUsers;
199
        }
200
        if ($active_only) {
201
            $criteria->add(new \Criteria('level', '0', '>'));
202
        }
203
        $xoopsUsers = $memberHandler->getUsers($criteria, true);      // xoopsUser objects
204
        unset($enabled_staff);
205
206
        return $xoopsUsers;
207
    }
208
209
    /**
210
     * Returns only the accepted staff members after having their permissions checked
211
     * @param array        $aMembers    array of all possible staff members
212
     * @param Ticket|int   $ticket      xhelp_ticket object
213
     * @param Notification $settings    xhelp_notification object
214
     * @param int          $submittedBy ID of ticket submitter
215
     * @return array  of XoopsUser objects
216
     */
217
    public function &checkStaffSetting(array $aMembers, $ticket, Notification $settings, int $submittedBy): array
0 ignored issues
show
Unused Code introduced by
The parameter $submittedBy is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

217
    public function &checkStaffSetting(array $aMembers, $ticket, Notification $settings, /** @scrutinizer ignore-unused */ int $submittedBy): array

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
218
    {
219
        //        $submittedBy = (int)$submittedBy;
220
        $dept = $ticket;
221
        if (\is_object($ticket)) {
222
            $dept = $ticket->getVar('department');
223
        }
224
        $staff_setting = $settings->getVar('staff_setting') ?? '';
0 ignored issues
show
Unused Code introduced by
The assignment to $staff_setting is dead and can be removed.
Loading history...
225
        $staff_options = $settings->getVar('staff_options') ?? '';
226
227
        $staffRoles    = $this->getStaffRoles($dept, $aMembers);     // Get list of the staff members' roles
228
        $enabled_staff = $this->getEnabledStaff($staffRoles, $aMembers, $staff_options);
0 ignored issues
show
Bug introduced by
It seems like $staff_options can also be of type boolean and null and string; however, parameter $staff_options of XoopsModules\Xhelp\Notif...vice::getEnabledStaff() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

228
        $enabled_staff = $this->getEnabledStaff($staffRoles, $aMembers, /** @scrutinizer ignore-type */ $staff_options);
Loading history...
229
        $xoopsUsers    = $this->getXoopsUsers($enabled_staff);
230
231
        return $xoopsUsers;
232
    }
233
234
    /**
235
     * Returns an array of staff UID's
236
     *
237
     * @param array      $members xhelp_staff objects
238
     * @param string|int $submittedBy
239
     * @param bool       $removeSubmitter
240
     * @return array
241
     */
242
    private function &makeMemberArray(array $members, $submittedBy, bool $removeSubmitter = false): array
243
    {
244
        $aMembers    = [];
245
        $submittedBy = (int)$submittedBy;
246
        foreach ($members as $member) {   // Full list of dept members
247
            if ($removeSubmitter) {
248
                if ($member->getVar('uid') == $submittedBy) { // Remove the staff member that submitted from the email list
249
                    continue;
250
                }
251
252
                $aMembers[$member->getVar('uid')] = $member->getVar('uid');
253
            } else {
254
                $aMembers[$member->getVar('uid')] = $member->getVar('uid');
255
            }
256
        }
257
258
        return $aMembers;
259
    }
260
261
    /**
262
     * Returns emails of staff belonging to an event
263
     *
264
     * @param Ticket|int   $ticket
265
     * @param int          $event_id    bit_value of event
266
     * @param Notification $settings
267
     * @param int|null     $submittedBy ID of user submitting event - should only be used when there is a response
268
     * @return array
269
     * @internal param int $dept ID of department
270
     */
271
    public function &getSubscribedStaff($ticket, int $event_id, Notification $settings, int $submittedBy = null): array
272
    {
273
        global $xoopsUser;
274
275
        $arr = [];
276
        /** @var \XoopsModules\Xhelp\MembershipHandler $membershipHandler */
277
        $membershipHandler = $this->helper->getHandler('Membership');
0 ignored issues
show
Bug introduced by
The property helper is declared private in XoopsModules\Xhelp\Service and cannot be accessed from this context.
Loading history...
278
        /** @var \XoopsMemberHandler $memberHandler */
279
        $memberHandler = \xoops_getHandler('member');
280
281
        if (\is_object($ticket)) {
282
            if (!$submittedBy) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $submittedBy of type integer|null is loosely compared to false; this is ambiguous if the integer can be 0. You might want to explicitly use === null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
283
                $submittedBy = $ticket->getVar('uid');
284
            }
285
            $owner = $ticket->getVar('ownership');
0 ignored issues
show
Unused Code introduced by
The assignment to $owner is dead and can be removed.
Loading history...
286
            $dept  = $ticket->getVar('department');
287
        } else {
288
            $dept = (int)$ticket;
289
        }
290
        $submittedBy = (int)$submittedBy;
291
292
        $staff_setting = $settings->getVar('staff_setting') ?? '';
293
        $staff_options = $settings->getVar('staff_options') ?? '';
0 ignored issues
show
Unused Code introduced by
The assignment to $staff_options is dead and can be removed.
Loading history...
294
        switch ($staff_setting) {
295
            case \XHELP_NOTIF_STAFF_DEPT:   // Department Staff can receive notification
296
                $members    = $membershipHandler->membershipByDept($dept);  // Staff objects
297
                $aMembers   = $this->makeMemberArray($members, $submittedBy, true);
298
                $xoopsUsers = $this->checkStaffSetting($aMembers, $ticket, $settings, $submittedBy);
299
                break;
300
            case \XHELP_NOTIF_STAFF_OWNER:   // Ticket Owner can receive notification
301
                $members = $membershipHandler->membershipByDept($dept);
302
                if (0 != $ticket->getVar('ownership')) {      // If there is a ticket owner
303
                    $ticket_owner            = $ticket->getVar('ownership');
304
                    $aMembers[$ticket_owner] = $ticket_owner;
0 ignored issues
show
Comprehensibility Best Practice introduced by
$aMembers was never initialized. Although not strictly required by PHP, it is generally a good practice to add $aMembers = array(); before regardless.
Loading history...
305
                    $criteria                = new \Criteria('uid', '(' . \implode(',', $aMembers) . ')', 'IN');
306
                    unset($aMembers);
307
                    $xoopsUsers = $memberHandler->getUsers($criteria, true);      // xoopsUser objects
308
                } else {                                    // If no ticket owner, send to dept staff
309
                    $aMembers   = $this->makeMemberArray($members, 0, true);
310
                    $xoopsUsers = $this->checkStaffSetting($aMembers, $ticket, $settings, $submittedBy);
311
                }
312
                break;
313
            case \XHELP_NOTIF_STAFF_NONE:   // Notification is turned off
314
            default:
315
                return $arr;
316
        }
317
318
        //Sort users based on Notification Preference
319
        foreach ($xoopsUsers as $xUser) {
320
            $cMember = $members[$xUser->getVar('uid')];
321
322
            if (!empty($cMember) && ($xUser->uid() != $xoopsUser->uid())) {
323
                if ($this->isSubscribed($cMember, $event_id)) {
324
                    if (2 == $xUser->getVar('notify_method')) {       // Send by email
325
                        $arr['email'][] = $members[$xUser->getVar('uid')]->getVar('email');
326
                    } elseif (1 == $xUser->getVar('notify_method')) { // Send by pm
327
                        $arr['pm'][] = $xUser;
328
                    }
329
                }
330
            }
331
        }
332
333
        return $arr;
334
    }
335
336
    /**
337
     * Returns emails of users belonging to a ticket
338
     *
339
     * @param int $ticketId ID of ticket
340
     * @return array
341
     */
342
    public function &getSubscribedUsers(int $ticketId): array
343
    {
344
        global $xoopsUser;
345
346
        //        $ticketId = (int)$ticketId;
347
348
        /** @var \XoopsModules\Xhelp\TicketEmailsHandler $ticketEmailsHandler */
349
        $ticketEmailsHandler = $this->helper->getHandler('TicketEmails');
0 ignored issues
show
Bug introduced by
The property helper is declared private in XoopsModules\Xhelp\Service and cannot be accessed from this context.
Loading history...
350
        /** @var \XoopsMemberHandler $memberHandler */
351
        $memberHandler = \xoops_getHandler('member');
352
353
        //Get all Subscribed users, except for the current user
354
        $criteria = new \CriteriaCompo(new \Criteria('ticketid', (string)$ticketId));
355
        $criteria->add(new \Criteria('suppress', '0'));
356
        $criteria->add(new \Criteria('email', $xoopsUser->email(), '<>'));
357
358
        $users = $ticketEmailsHandler->getObjects($criteria);    // xhelp_ticketEmail objects
359
360
        $aUsers = [];
361
        $arr    = [];
362
        foreach ($users as $user) {
363
            if (0 != $user->getVar('uid')) {
364
                $aUsers[$user->getVar('email')] = $user->getVar('uid');
365
            } else {
366
                // Add users with just email to array
367
                $arr['email'][] = $user->getVar('email');
368
            }
369
        }
370
371
        $xoopsUsers = [];
372
        if (!empty($aUsers)) {
373
            $criteria   = new \Criteria('uid', '(' . \implode(',', $aUsers) . ')', 'IN');
374
            $xoopsUsers = $memberHandler->getUsers($criteria, true);  // xoopsUser objects
375
        }
376
        unset($aUsers);
377
378
        // @todo - replace notify_method integers with constants
379
        // Add users with uid
380
        foreach ($xoopsUsers as $xUser) {  // Find which method user prefers for sending message
381
            if (2 == $xUser->getVar('notify_method')) {
382
                $arr['email'][] = $xUser->getVar('email');
383
            } elseif (1 == $xUser->getVar('notify_method')) {
384
                $arr['pm'][] = $xUser;
385
            }
386
        }
387
388
        return $arr;
389
    }
390
391
    /**
392
     * Checks to see if the staff member is subscribed to receive the notification for this event
393
     *
394
     * @param int|Staff $user     userid/staff object of staff member
395
     * @param int       $event_id value of the event
396
     * @return bool              true is suscribed, false if not
397
     */
398
    public function isSubscribed($user, int $event_id): bool
399
    {
400
        if (!\is_object($user)) {          //If user is not an object, retrieve a staff object using the uid
401
            if (\is_numeric($user)) {
0 ignored issues
show
introduced by
The condition is_numeric($user) is always true.
Loading history...
402
                $uid          = $user;
403
                $staffHandler = $this->helper->getHandler('Staff');
0 ignored issues
show
Bug introduced by
The property helper is declared private in XoopsModules\Xhelp\Service and cannot be accessed from this context.
Loading history...
404
                if (!$user = $staffHandler->getByUid($uid)) {
405
                    return false;
406
                }
407
            }
408
        }
409
410
        return ($user->getVar('notify') & (2 ** $event_id)) > 0;
411
    }
412
413
    /**
414
     * Retrieve a user's email address
415
     *
416
     * @param int $uid user's id
417
     * @return array array's email
418
     */
419
    public function getUserEmail(int $uid): array
420
    {
421
        global $xoopsUser;
422
        $arr = [];
423
        $uid = $uid;
424
425
        if ($uid == $xoopsUser->getVar('uid')) {      // If $uid == current user's uid
426
            if (2 == $xoopsUser->getVar('notify_method')) {
427
                $arr['email'][] = $xoopsUser->getVar('email');     // return their email
428
            } elseif (1 == $xoopsUser->getVar('notify_method')) {
429
                $arr['pm'][] = $xoopsUser;
430
            }
431
        } else {
432
            /** @var \XoopsMemberHandler $memberHandler */
433
            $memberHandler = \xoops_getHandler('member');     //otherwise...
434
            $member        = $memberHandler->getUser($uid);
435
            if ($member) {
0 ignored issues
show
introduced by
$member is of type XoopsUser, thus it always evaluated to true.
Loading history...
436
                if (2 == $member->getVar('notify_method')) {
437
                    $arr['email'][] = $member->getVar('email');
438
                } elseif (1 == $member->getVar('notify_method')) {
439
                    $arr['pm'][] = $member;
440
                }
441
            } else {
442
                $arr['email'][] = '';
443
            }
444
        }
445
446
        return $arr;
447
    }
448
449
    /**
450
     * Retrieves a staff member's email address
451
     *
452
     * @param int             $uid user's id
453
     * @param int|string|null $dept
454
     * @param array|null      $staff_options
455
     * @return array member's email
456
     */
457
    public function getStaffEmail(int $uid, $dept = null, ?array $staff_options = null): array
458
    {
459
        $uid  = $uid;
460
        $dept = (int)$dept;
461
        /** @var \XoopsMemberHandler $memberHandler */
462
        $memberHandler = \xoops_getHandler('member');
463
        $arr           = [];
464
465
        // Check staff roles to staff options making sure the staff has permission
466
        $staffRoles = $this->staffHandler->getRolesByDept($uid, $dept, true);
467
        $bFound     = true;
468
        foreach ($staff_options as $option) {
469
            if (\array_key_exists($option, $staffRoles)) {
470
                $bFound = true;
471
                break;
472
            }
473
474
            $bFound = false;
475
        }
476
        if (!$bFound) {
477
            return $arr;
478
        }
479
480
        $staff = $this->staffHandler->getByUid($uid);
481
        if ($staff) {
482
            $member = $memberHandler->getUser($uid);
483
            if ($member) {
0 ignored issues
show
introduced by
$member is of type XoopsUser, thus it always evaluated to true.
Loading history...
484
                if (2 == $member->getVar('notify_method')) {
485
                    $arr['email'][] = $staff->getVar('email');
486
                } elseif (1 == $member->getVar('notify_method')) {
487
                    $arr['pm'][] = $member;
488
                }
489
            } else {
490
                $arr['email'][] = '';
491
            }
492
        } else {
493
            $arr['email'][] = '';
494
        }
495
496
        return $arr;
497
    }
498
499
    /**
500
     * Send pm and email notifications to selected users
501
     *
502
     * @param object|array $email_tpl object returned from getEmailTpl() function
503
     * @param array        $sendTo    emails and xoopsUser objects
504
     * @param array        $tags      array of notification information
505
     * @param string       $fromEmail
506
     * @return bool TRUE if success, FALSE if no success
507
     */
508
    public function sendEvents($email_tpl, array $sendTo, array $tags, string $fromEmail = ''): bool
509
    {
510
        $ret = true;
511
        if (\array_key_exists('pm', $sendTo)) {
512
            $ret = $ret && $this->sendEventPM($email_tpl, $sendTo, $tags, $fromEmail);
513
        }
514
515
        if (\array_key_exists('email', $sendTo)) {
516
            $ret = $ret && $this->sendEventEmail($email_tpl, $sendTo, $tags, $fromEmail);
517
        }
518
519
        return $ret;
520
    }
521
522
    /**
523
     * Send the pm notification to selected users
524
     *
525
     * @param object|array $email_tpl object returned from getEmailTpl() function
526
     * @param array        $sendTo    xoopsUser objects
527
     * @param array        $tags      array of notification information
528
     * @param string       $fromEmail
529
     * @return bool TRUE if success, FALSE if no success
530
     */
531
    public function sendEventPM($email_tpl, array $sendTo, array $tags, string $fromEmail = ''): bool
0 ignored issues
show
Unused Code introduced by
The parameter $fromEmail is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

531
    public function sendEventPM($email_tpl, array $sendTo, array $tags, /** @scrutinizer ignore-unused */ string $fromEmail = ''): bool

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
532
    {
533
        $notify_pm = '';
0 ignored issues
show
Unused Code introduced by
The assignment to $notify_pm is dead and can be removed.
Loading history...
534
        global $xoopsConfig, $xoopsUser;
535
536
        $notify_pm = $sendTo['pm'];
537
538
        $tags        = \array_merge($tags, $this->getCommonTplVars());          // Retrieve the common template vars and add to array
539
        $xoopsMailer = \xoops_getMailer();
540
        $xoopsMailer->usePM();
541
542
        foreach ($tags as $k => $v) {
543
            $xoopsMailer->assign($k, \preg_replace('/&amp;/i', '&', $v));
544
        }
545
        $xoopsMailer->setTemplateDir($this->templateDir);                // Set template dir
546
        $xoopsMailer->setTemplate($email_tpl['mail_template'] . '.tpl'); // Set the template to be used
547
548
        /** @var \XoopsConfigHandler $configHandler */
549
        $configHandler = \xoops_getHandler('config');
550
        /** @var \XoopsMemberHandler $memberHandler */
551
        $memberHandler     = \xoops_getHandler('member');
552
        $xoopsMailerConfig = $configHandler->getConfigsByCat(\XOOPS_CONF_MAILER);
553
        $xoopsMailer->setFromUser($memberHandler->getUser($xoopsMailerConfig['fromuid']));
554
        $xoopsMailer->setToUsers($notify_pm);
555
        $xoopsMailer->setSubject($email_tpl['mail_subject']);           // Set the subject of the email
556
        $xoopsMailer->setFromName($xoopsConfig['sitename']);            // Set a from address
557
        $success = $xoopsMailer->send(true);
558
559
        return $success;
560
    }
561
562
    /**
563
     * Send the mail notification to selected users
564
     *
565
     * @param object|array $email_tpl object returned from getEmailTpl() function
566
     * @param array        $sendTo    emails returned from getSubscribedStaff() function
567
     * @param array        $tags      array of notification information
568
     * @param string       $fromEmail
569
     * @return bool TRUE if success, FALSE if no success
570
     */
571
    public function sendEventEmail($email_tpl, array $sendTo, array $tags, string $fromEmail = ''): bool
572
    {
573
        $notify_email = '';
0 ignored issues
show
Unused Code introduced by
The assignment to $notify_email is dead and can be removed.
Loading history...
574
        global $xoopsConfig;
575
576
        $notify_email = $sendTo['email'];
577
578
        $tags        = \array_merge($tags, $this->getCommonTplVars());          // Retrieve the common template vars and add to array
579
        $xoopsMailer = \xoops_getMailer();
580
        $xoopsMailer->useMail();
581
582
        foreach ($tags as $k => $v) {
583
            $xoopsMailer->assign($k, \preg_replace('/&amp;/i', '&', $v));
584
        }
585
        $xoopsMailer->setTemplateDir($this->templateDir);                // Set template dir
586
        $xoopsMailer->setTemplate($email_tpl['mail_template'] . '.tpl'); // Set the template to be used
587
        if ('' !== $fromEmail) {
588
            $xoopsMailer->setFromEmail($fromEmail);
589
        }
590
        $xoopsMailer->setToEmails($notify_email);                           // Set who the email goes to
591
        $xoopsMailer->setSubject($email_tpl['mail_subject']);               // Set the subject of the email
592
        $xoopsMailer->setFromName($xoopsConfig['sitename']);                // Set a from address
593
        $success = $xoopsMailer->send(true);
594
595
        return $success;
596
    }
597
598
    /**
599
     * Get a list of the common constants required for notifications
600
     *
601
     * @return array
602
     */
603
    public function &getCommonTplVars(): array
604
    {
605
        global $xoopsConfig;
606
        $tags                 = [];
607
        $tags['X_MODULE']     = $this->module->getVar('name');
608
        $tags['X_SITEURL']    = \XHELP_SITE_URL;
609
        $tags['X_SITENAME']   = $xoopsConfig['sitename'];
610
        $tags['X_ADMINMAIL']  = $xoopsConfig['adminmail'];
611
        $tags['X_MODULE_URL'] = \XHELP_BASE_URL . '/';
612
613
        return $tags;
614
    }
615
616
    /**
617
     * Retrieve the directory where mail templates are stored
618
     *
619
     * @param string $language language used for xoops
620
     * @return string
621
     */
622
    public function getTemplateDir(string $language): string
623
    {
624
        $path = XOOPS_ROOT_PATH . '/modules/xhelp/language/' . $language . '/mail_template';
625
        if (\is_dir($path)) {
626
            return $path;
627
        }
628
629
        return XOOPS_ROOT_PATH . '/modules/xhelp/language/english/mail_template';
630
    }
631
632
    /**
633
     * Returns the number of department notifications
634
     *
635
     * @return int number of department notifications
636
     */
637
    public function getNumDeptNotifications(): int
638
    {
639
        $num       = 0;
640
        $templates = $this->module->getInfo('_email_tpl');
641
        foreach ($templates as $template) {
642
            if ('dept' === $template['category']) {
643
                ++$num;
644
            }
645
        }
646
647
        return $num;
648
    }
649
650
    /**
651
     * Returns the email address of the person causing the fire of the event
652
     *
653
     * @param int $uid uid of the user
654
     * @return array email of user
655
     */
656
    public function getEmail(int $uid): array
657
    {
658
        if (!$isStaff = $this->staffHandler->isStaff($uid)) {
0 ignored issues
show
Unused Code introduced by
The assignment to $isStaff is dead and can be removed.
Loading history...
659
            return $this->getUserEmail($uid);
660
        }
661
662
        return $this->getStaffEmail($uid);
663
    }
664
665
    /**
666
     * Confirm submission to user and notify staff members when new_ticket is triggered
667
     * @param Ticket $ticket Ticket that was added
668
     */
669
    public function new_ticket(Ticket $ticket): void
670
    {
671
        global $xhelp_isStaff;
672
        global $xoopsUser;
673
        $helper = Helper::getInstance();
674
675
        $departmentHandler = $this->helper->getHandler('Department');
0 ignored issues
show
Bug introduced by
The property helper is declared private in XoopsModules\Xhelp\Service and cannot be accessed from this context.
Loading history...
676
        $displayName       = $helper->getConfig('xhelp_displayName');    // Determines if username or real name is displayed
677
678
        $tags                       = [];
679
        $tags['TICKET_ID']          = $ticket->getVar('id');
680
        $tags['TICKET_SUBJECT']     = ($ticket->getVar('subject', 'n'));
681
        $tags['TICKET_DESCRIPTION'] = ($ticket->getVar('description', 'n'));
682
        $tags['TICKET_PRIORITY']    = Utility::getPriority($ticket->getVar('priority'));
683
        $tags['TICKET_POSTED']      = $ticket->posted();
684
        $tags['TICKET_CREATED']     = Utility::getUsername($ticket->getVar('uid'), $displayName);
0 ignored issues
show
Bug introduced by
It seems like $displayName can also be of type null; however, parameter $displayName of XoopsModules\Xhelp\Utility::getUsername() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

684
        $tags['TICKET_CREATED']     = Utility::getUsername($ticket->getVar('uid'), /** @scrutinizer ignore-type */ $displayName);
Loading history...
685
        $tags['TICKET_SUPPORT_KEY'] = ($ticket->getVar('serverid') ? '{' . $ticket->getVar('emailHash') . '}' : '');
686
        $tags['TICKET_URL']         = \XHELP_BASE_URL . '/ticket.php?id=' . $ticket->getVar('id');
687
        $tags['TICKET_DEPARTMENT']  = ($departmentHandler->getNameById($ticket->getVar('department')));
688
689
        $settings = $this->notificationHandler->get(\XHELP_NOTIF_NEWTICKET);
690
        //        $settings      = $this->notificationHandler->create();
691
        $staff_setting = $settings->getVar('staff_setting') ?? '';
692
        $user_setting  = $settings->getVar('user_setting') ?? '';
693
694
        if (\XHELP_NOTIF_STAFF_NONE != $staff_setting) {    // If staff notification is enabled
695
            $email_tpl = $this->getEmailTpl('dept', 'new_ticket', $this->module, $template_id);
696
            if ($email_tpl) {  // Send email to dept members
697
                $sendTo  = $this->getSubscribedStaff($ticket, $email_tpl['bit_value'], $settings);
698
                $success = $this->sendEvents($email_tpl, $sendTo, $tags);
0 ignored issues
show
Unused Code introduced by
The assignment to $success is dead and can be removed.
Loading history...
Bug introduced by
It seems like $email_tpl can also be of type true; however, parameter $email_tpl of XoopsModules\Xhelp\Notif...onService::sendEvents() does only seem to accept array|object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

698
                $success = $this->sendEvents(/** @scrutinizer ignore-type */ $email_tpl, $sendTo, $tags);
Loading history...
699
            }
700
        }
701
        if (\XHELP_NOTIF_USER_NO != $user_setting) {     // If user notification is enabled
702
            if ($ticket->getVar('serverid') > 0) {
703
                //this ticket has been submitted by email
704
                //get department email address
705
                $departmentMailBoxHandler = $this->helper->getHandler('DepartmentMailBox');
706
                $server                   = $departmentMailBoxHandler->get($ticket->getVar('serverid'));
707
708
                $tags['TICKET_SUPPORT_EMAIL'] = $server->getVar('emailaddress');
709
710
                $email_tpl = $this->getEmailTpl('ticket', 'new_this_ticket_via_email', $this->module, $template_id);
711
                if ($email_tpl) {
712
                    $sendTo  = $this->getUserEmail($ticket->getVar('uid'));
713
                    $success = $this->sendEvents($email_tpl, $sendTo, $tags, $server->getVar('emailaddress'));
714
                }
715
            } else { //this ticket has been submitted via the website
716
                if (!$xhelp_isStaff) {
717
                    $email_tpl = $this->getEmailTpl('ticket', 'new_this_ticket', $this->module, $template_id);
718
                    if ($email_tpl) {                                                                                                                                                                                                                                  // Send confirm email to submitter
719
                        $sendTo  = $this->getUserEmail(
720
                            $ticket->getVar('uid')
721
                        );                                                                                                                                                                                                                                             // Will be the only person subscribed
722
                        $success = $this->sendEvents($email_tpl, $sendTo, $tags);
723
                    }
724
                }
725
            }
726
        }
727
    }
728
729
    /**
730
     * Event: new_user_by_email
731
     * Triggered after new user account is created during ticket submission
732
     * @param string     $password Password for new account
733
     * @param \XoopsUser $user     XOOPS user object for new account
734
     */
735
    public function new_user_by_email(string $password, \XoopsUser $user): void
736
    {
737
        // Send Welcome Email to submitter
738
        //global $xoopsUser;
739
740
        $tags                        = [];
741
        $tags['XOOPS_USER_NAME']     = $user->getVar('uname');
742
        $tags['XOOPS_USER_EMAIL']    = $user->getVar('email');
743
        $tags['XOOPS_USER_ID']       = $user->getVar('uname');
744
        $tags['XOOPS_USER_PASSWORD'] = $password;
745
        $tags['X_UACTLINK']          = \XHELP_SITE_URL . '/user.php?op=actv&id=' . $user->getVar('uid') . '&actkey=' . $user->getVar('actkey');
746
747
        $email_tpl = $this->getEmailTpl('ticket', 'new_user_byemail', $this->module, $template_id);
748
        if ($email_tpl) {
749
            $sendTo  = $this->getUserEmail($user->getVar('uid'));
750
            $success = $this->sendEvents($email_tpl, $sendTo, $tags);
0 ignored issues
show
Unused Code introduced by
The assignment to $success is dead and can be removed.
Loading history...
Bug introduced by
It seems like $email_tpl can also be of type true; however, parameter $email_tpl of XoopsModules\Xhelp\Notif...onService::sendEvents() does only seem to accept array|object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

750
            $success = $this->sendEvents(/** @scrutinizer ignore-type */ $email_tpl, $sendTo, $tags);
Loading history...
751
        }
752
    }
753
754
    /**
755
     * Event: new_user_by_email
756
     * Triggered after new user account is created during ticket submission
757
     * @param string     $password  Password for new account
758
     * @param \XoopsUser $xoopsUser XOOPS user object for new account
759
     */
760
    public function new_user_activation0(string $password, \XoopsUser $xoopsUser): void
0 ignored issues
show
Unused Code introduced by
The parameter $xoopsUser is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

760
    public function new_user_activation0(string $password, /** @scrutinizer ignore-unused */ \XoopsUser $xoopsUser): void

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
761
    {
762
        global $xoopsConfig;
763
        $newid = $newuser->getVar('uid');
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $newuser seems to be never defined.
Loading history...
Unused Code introduced by
The assignment to $newid is dead and can be removed.
Loading history...
764
        $uname = $newuser->getVar('uname');
0 ignored issues
show
Unused Code introduced by
The assignment to $uname is dead and can be removed.
Loading history...
765
        $email = $newuser->getVar('email');
0 ignored issues
show
Unused Code introduced by
The assignment to $email is dead and can be removed.
Loading history...
766
767
        $tags                        = [];
768
        $tags['XOOPS_USER_NAME']     = $newuser->getVar('uname');
769
        $tags['XOOPS_USER_EMAIL']    = $newuser->getVar('email');
770
        $tags['XOOPS_USER_ID']       = $newuser->getVar('uname');
771
        $tags['XOOPS_USER_PASSWORD'] = $password;
772
        $tags['X_UACTLINK']          = \XHELP_SITE_URL . '/user.php?op=actv&id=' . $newuser->getVar('uid') . '&actkey=' . $newuser->getVar('actkey');
773
774
        $email_tpl = $this->getEmailTpl('ticket', 'new_user_byemail', $this->module, $template_id);
775
        if ($email_tpl) {
776
            $sendTo  = $this->getUserEmail($newuser->getVar('uid'));
777
            $success = $this->sendEvents($email_tpl, $sendTo, $tags);
0 ignored issues
show
Unused Code introduced by
The assignment to $success is dead and can be removed.
Loading history...
Bug introduced by
It seems like $email_tpl can also be of type true; however, parameter $email_tpl of XoopsModules\Xhelp\Notif...onService::sendEvents() does only seem to accept array|object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

777
            $success = $this->sendEvents(/** @scrutinizer ignore-type */ $email_tpl, $sendTo, $tags);
Loading history...
778
        }
779
    }
780
781
    /**
782
     * Event: new_user_by_email
783
     * Triggered after new user account is created during ticket submission
784
     * @param string     $password  Password for new account
785
     * @param \XoopsUser $xoopsUser XOOPS user object for new account
786
     */
787
    public function new_user_activation1(string $password, \XoopsUser $xoopsUser): void
0 ignored issues
show
Unused Code introduced by
The parameter $xoopsUser is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

787
    public function new_user_activation1(string $password, /** @scrutinizer ignore-unused */ \XoopsUser $xoopsUser): void

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
788
    {
789
        $tags                        = [];
790
        $tags['XOOPS_USER_NAME']     = $user->getVar('uname');
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $user seems to be never defined.
Loading history...
791
        $tags['XOOPS_USER_EMAIL']    = $user->getVar('email');
792
        $tags['XOOPS_USER_ID']       = $user->getVar('uname');
793
        $tags['XOOPS_USER_PASSWORD'] = $password;
794
795
        $email_tpl = $this->getEmailTpl('ticket', 'new_user_activation1', $this->module, $template_id);
796
        if ($email_tpl) {
797
            $sendTo  = $this->getUserEmail($user->getVar('uid'));
798
            $success = $this->sendEvents($email_tpl, $sendTo, $tags);
0 ignored issues
show
Bug introduced by
It seems like $email_tpl can also be of type true; however, parameter $email_tpl of XoopsModules\Xhelp\Notif...onService::sendEvents() does only seem to accept array|object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

798
            $success = $this->sendEvents(/** @scrutinizer ignore-type */ $email_tpl, $sendTo, $tags);
Loading history...
Unused Code introduced by
The assignment to $success is dead and can be removed.
Loading history...
799
        }
800
801
        $_POST['uname'] = $user->getVar('uname');
802
        $_POST['pass']  = $password;
803
804
        // For backward compatibility
805
        $_POST['uname'] = $user->getVar('uname');
806
        $_POST['pass']  = $password;
807
808
        //        $filename   = XOOPS_ROOT_PATH . '/kernel/authenticationservice.php';
809
        //        $foldername = XOOPS_ROOT_PATH . '/include/authenticationservices';
810
        //        if (\file_exists($filename) && \file_exists($foldername)) {     // check for ldap authentication hack
811
        //            /** @var \XoopsAuthFactory $authentication_service */
812
        //            $authentication_service = \xoops_getHandler('authenticationservice');
813
        //            if ($authentication_service) {
814
        //                $authentication_service->checkLogin();
815
        //            } else {
816
        //                require_once XOOPS_ROOT_PATH . '/include/checklogin.php';
817
        //            }
818
        //        } else {
819
        //            require_once XOOPS_ROOT_PATH . '/include/checklogin.php';
820
        //        }
821
        require_once XOOPS_ROOT_PATH . '/include/checklogin.php';
822
    }
823
824
    /**
825
     * Event: new_user_by_email
826
     * Triggered after new user account is created during ticket submission
827
     * @param string     $password  Password for new account
828
     * @param \XoopsUser $xoopsUser XOOPS user object for new account
829
     */
830
    public function new_user_activation2(string $password, \XoopsUser $xoopsUser): void
0 ignored issues
show
Unused Code introduced by
The parameter $xoopsUser is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

830
    public function new_user_activation2(string $password, /** @scrutinizer ignore-unused */ \XoopsUser $xoopsUser): void

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
831
    {
832
        global $xoopsConfig;
833
        $newid = $user->getVar('uid');
0 ignored issues
show
Unused Code introduced by
The assignment to $newid is dead and can be removed.
Loading history...
Comprehensibility Best Practice introduced by
The variable $user seems to be never defined.
Loading history...
834
        $uname = $user->getVar('uname');
0 ignored issues
show
Unused Code introduced by
The assignment to $uname is dead and can be removed.
Loading history...
835
        $email = $user->getVar('email');
0 ignored issues
show
Unused Code introduced by
The assignment to $email is dead and can be removed.
Loading history...
836
837
        $tags                        = [];
838
        $tags['XOOPS_USER_NAME']     = $user->getVar('uname');
839
        $tags['XOOPS_USER_EMAIL']    = $user->getVar('email');
840
        $tags['XOOPS_USER_ID']       = $user->getVar('uname');
841
        $tags['XOOPS_USER_PASSWORD'] = $password;
842
843
        $email_tpl = $this->getEmailTpl('ticket', 'new_user_activation2', $this->module, $template_id);
844
        if ($email_tpl) {
845
            $sendTo  = $this->getUserEmail($user->getVar('uid'));
846
            $success = $this->sendEvents($email_tpl, $sendTo, $tags);
0 ignored issues
show
Bug introduced by
It seems like $email_tpl can also be of type true; however, parameter $email_tpl of XoopsModules\Xhelp\Notif...onService::sendEvents() does only seem to accept array|object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

846
            $success = $this->sendEvents(/** @scrutinizer ignore-type */ $email_tpl, $sendTo, $tags);
Loading history...
Unused Code introduced by
The assignment to $success is dead and can be removed.
Loading history...
847
        }
848
    }
849
850
    /**
851
     * Event: new_response
852
     * Triggered after a response has been added to a ticket
853
     * @param Ticket|int $ticket   Ticket containing response
854
     * @param Response   $response Response that was added
855
     */
856
    public function new_response($ticket, Response $response): void
857
    {
858
        // If response is from staff member, send message to ticket submitter
859
        // If response is from submitter, send message to owner, if no owner, send to department
860
861
        global $xoopsUser, $xoopsConfig;
862
        $helper = Helper::getInstance();
863
864
        $departmentHandler = $this->helper->getHandler('Department');
0 ignored issues
show
Bug introduced by
The property helper is declared private in XoopsModules\Xhelp\Service and cannot be accessed from this context.
Loading history...
865
866
        if (!\is_object($ticket) && 0 === $ticket) {
867
            $ticketHandler = $this->helper->getHandler('Ticket');
868
            $ticket        = $ticketHandler->get($response->getVar('ticketid'));
869
        }
870
871
        $b_email_ticket = false;
0 ignored issues
show
Unused Code introduced by
The assignment to $b_email_ticket is dead and can be removed.
Loading history...
872
        $from           = '';
873
874
        $tags                         = [];
875
        $tags['TICKET_ID']            = $ticket->getVar('id');
876
        $tags['TICKET_URL']           = \XHELP_BASE_URL . '/ticket.php?id=' . $ticket->getVar('id');
877
        $tags['TICKET_RESPONSE']      = ($response->getVar('message', 'n'));
878
        $tags['TICKET_SUBJECT']       = ($ticket->getVar('subject', 'n'));
879
        $tags['TICKET_TIMESPENT']     = $response->getVar('timeSpent');
880
        $tags['TICKET_STATUS']        = Utility::getStatus($ticket->getVar('status'));
881
        $displayName                  = $helper->getConfig('xhelp_displayName');    // Determines if username or real name is displayed
882
        $tags['TICKET_RESPONDER']     = Utility::getUsername($xoopsUser->getVar('uid'), $displayName);
0 ignored issues
show
Bug introduced by
It seems like $displayName can also be of type null; however, parameter $displayName of XoopsModules\Xhelp\Utility::getUsername() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

882
        $tags['TICKET_RESPONDER']     = Utility::getUsername($xoopsUser->getVar('uid'), /** @scrutinizer ignore-type */ $displayName);
Loading history...
883
        $tags['TICKET_POSTED']        = $response->posted('m');
884
        $tags['TICKET_SUPPORT_KEY']   = '';
885
        $tags['TICKET_SUPPORT_EMAIL'] = $xoopsConfig['adminmail'];
886
887
        if ($ticket->getVar('serverid') > 0) {
888
            $departmentMailBoxHandler = $this->helper->getHandler('DepartmentMailBox');
889
890
            $server = $departmentMailBoxHandler->get($ticket->getVar('serverid'));
891
            if ($server) {
892
                $from                         = $server->getVar('emailaddress');
893
                $tags['TICKET_SUPPORT_KEY']   = '{' . $ticket->getVar('emailHash') . '}';
894
                $tags['TICKET_SUPPORT_EMAIL'] = $from;
895
            }
896
        }
897
        $owner = $ticket->getVar('ownership');
898
        if (0 == $owner) {
899
            $tags['TICKET_OWNERSHIP'] = \_XHELP_NO_OWNER;
900
        } else {
901
            $tags['TICKET_OWNERSHIP'] = Utility::getUsername($owner, $displayName);
902
        }
903
        $tags['TICKET_DEPARTMENT'] = ($departmentHandler->getNameById($ticket->getVar('department')));
904
905
        $settings      = $this->notificationHandler->get(\XHELP_NOTIF_NEWRESPONSE);
906
        $staff_setting = $settings->getVar('staff_setting') ?? '';
907
        $user_setting  = $settings->getVar('user_setting') ?? '';
908
909
        $sendTo = [];
910
        /** @var \XoopsMemberHandler $memberHandler */
911
        $memberHandler  = \xoops_getHandler('member');
912
        $response_user  = $memberHandler->getUser($response->getVar('uid'));
913
        $response_email = $response_user->getVar('email');
914
915
        $aUsers = $this->getSubscribedUsers($ticket->getVar('id'));
916
917
        if (\in_array($response_email, $aUsers)) {  // If response from a submitter, send to staff and other submitters
918
            if (\XHELP_NOTIF_STAFF_NONE != $staff_setting) {        // Staff notification is enabled
919
                $email_tpl = $this->getEmailTpl('dept', 'new_response', $this->module, $template_id);
920
                if ($email_tpl) {       // Send to staff members
921
                    $sendTo  = $this->getSubscribedStaff($ticket, $email_tpl['bit_value'], $settings, $response->getVar('uid'));
922
                    $success = $this->sendEvents($email_tpl, $sendTo, $tags);
0 ignored issues
show
Unused Code introduced by
The assignment to $success is dead and can be removed.
Loading history...
Bug introduced by
It seems like $email_tpl can also be of type true; however, parameter $email_tpl of XoopsModules\Xhelp\Notif...onService::sendEvents() does only seem to accept array|object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

922
                    $success = $this->sendEvents(/** @scrutinizer ignore-type */ $email_tpl, $sendTo, $tags);
Loading history...
923
                }
924
            }
925
            unset($aUsers[$ticket->getVar('uid')]); // Remove response submitter from array
926
            $sendTo = $aUsers;                      // Get array of user emails to send
927
        } else {    // If response from staff, send to submitters
928
            // Also send to staff members if no owner
929
            if (\XHELP_NOTIF_STAFF_NONE != $staff_setting) {    // If notification is on
930
                $email_tpl = $this->getEmailTpl('dept', 'new_response', $this->module, $template_id);
931
                if ($email_tpl) {       // Send to staff members
932
                    if (0 == $ticket->getVar('ownership')) {
933
                        $sendTo = $this->getSubscribedStaff($ticket, $email_tpl['bit_value'], $settings, $response->getVar('uid'));
934
                    }
935
                    $success = $this->sendEvents($email_tpl, $sendTo, $tags);
936
                }
937
            }
938
            $sendTo = $aUsers;
939
        }
940
        if (2 != $user_setting && 0 === $response->getVar('private')) {
941
            $email_tpl = $this->getEmailTpl('ticket', 'new_this_response', $this->module, $template_id);
942
            if ($email_tpl) {    // Send to users
943
                $success = $this->sendEvents($email_tpl, $sendTo, $tags, $from);
944
            }
945
        }
946
    }
947
948
    /**
949
     * Event: update_priority
950
     * Triggered after a ticket priority is modified
951
     * Also See: batch_priority
952
     * @param Ticket $ticket      Ticket that was modified
953
     * @param int    $oldpriority Previous ticket priority
954
     */
955
    public function update_priority(Ticket $ticket, int $oldpriority): void
956
    {
957
        //notify staff department of change
958
        //notify submitter
959
        global $xoopsUser;
960
961
        $departmentHandler = $this->helper->getHandler('Department');
0 ignored issues
show
Bug introduced by
The property helper is declared private in XoopsModules\Xhelp\Service and cannot be accessed from this context.
Loading history...
962
963
        $tags               = [];
964
        $tags['TICKET_ID']  = $ticket->getVar('id');
965
        $tags['TICKET_URL'] = \XHELP_BASE_URL . '/ticket.php?id=' . $ticket->getVar('id');
966
        // Added by marcan to get the ticket's subject available in the mail template
967
        $tags['TICKET_SUBJECT'] = ($ticket->getVar('subject', 'n'));
968
        // End of addition by marcan
969
        $tags['TICKET_OLD_PRIORITY'] = Utility::getPriority($oldpriority);
970
        $tags['TICKET_PRIORITY']     = Utility::getPriority($ticket->getVar('priority'));
971
        $tags['TICKET_UPDATEDBY']    = $xoopsUser->getVar('uname');
972
        $tags['TICKET_DEPARTMENT']   = ($departmentHandler->getNameById($ticket->getVar('department')));
973
974
        $settings      = $this->notificationHandler->get(\XHELP_NOTIF_EDITPRIORITY);
975
        $staff_setting = $settings->getVar('staff_setting') ?? '';
0 ignored issues
show
Unused Code introduced by
The assignment to $staff_setting is dead and can be removed.
Loading history...
976
        $user_setting  = $settings->getVar('user_setting') ?? '';
0 ignored issues
show
Unused Code introduced by
The assignment to $user_setting is dead and can be removed.
Loading history...
977
978
        $email_tpl = $this->getEmailTpl('dept', 'changed_priority', $this->module, $template_id);
979
        if ($email_tpl) {   // Notify staff dept
980
            $sendTo  = $this->getSubscribedStaff($ticket, $email_tpl['bit_value'], $settings);
981
            $success = $this->sendEvents($email_tpl, $sendTo, $tags);
0 ignored issues
show
Bug introduced by
It seems like $email_tpl can also be of type true; however, parameter $email_tpl of XoopsModules\Xhelp\Notif...onService::sendEvents() does only seem to accept array|object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

981
            $success = $this->sendEvents(/** @scrutinizer ignore-type */ $email_tpl, $sendTo, $tags);
Loading history...
Unused Code introduced by
The assignment to $success is dead and can be removed.
Loading history...
982
        }
983
        $email_tpl = $this->getEmailTpl('ticket', 'changed_this_priority', $this->module, $template_id);
984
        if ($email_tpl) {    // Notify submitter
985
            $sendTo  = $this->getSubscribedUsers($ticket->getVar('id'));
986
            $success = $this->sendEvents($email_tpl, $sendTo, $tags);
987
        }
988
    }
989
990
    /**
991
     * Event: update_status
992
     * Triggered after a ticket status change
993
     * Also See: batch_status, close_ticket, reopen_ticket
994
     * @param Ticket $ticket    The ticket that was modified
995
     * @param Status $oldstatus The previous ticket status
996
     * @param Status $newstatus The new ticket status
997
     */
998
    public function update_status(Ticket $ticket, Status $oldstatus, Status $newstatus): void
999
    {
1000
        //notify staff department of change
1001
        //notify submitter
1002
        global $xoopsUser;
1003
        $departmentHandler = $this->helper->getHandler('Department');
0 ignored issues
show
Bug introduced by
The property helper is declared private in XoopsModules\Xhelp\Service and cannot be accessed from this context.
Loading history...
1004
1005
        $tags               = [];
1006
        $tags['TICKET_ID']  = $ticket->getVar('id');
1007
        $tags['TICKET_URL'] = \XHELP_BASE_URL . '/ticket.php?id=' . $ticket->getVar('id');
1008
        // Added by marcan to get the ticket's subject available in the mail template
1009
        $tags['TICKET_SUBJECT'] = ($ticket->getVar('subject', 'n'));
1010
        // End of addition by marcan
1011
        $tags['TICKET_OLD_STATUS'] = $oldstatus->getVar('description');
1012
        $tags['TICKET_OLD_STATE']  = Utility::getState($oldstatus->getVar('state'));
1013
        $tags['TICKET_STATUS']     = $newstatus->getVar('description');
1014
        $tags['TICKET_STATE']      = Utility::getState($newstatus->getVar('state'));
1015
        $tags['TICKET_UPDATEDBY']  = $xoopsUser->getVar('uname');
1016
        $tags['TICKET_DEPARTMENT'] = ($departmentHandler->getNameById($ticket->getVar('department')));
1017
1018
        $settings      = $this->notificationHandler->get(\XHELP_NOTIF_EDITSTATUS);
1019
        $staff_setting = $settings->getVar('staff_setting') ?? '';
0 ignored issues
show
Unused Code introduced by
The assignment to $staff_setting is dead and can be removed.
Loading history...
1020
        $user_setting  = $settings->getVar('user_setting') ?? '';
0 ignored issues
show
Unused Code introduced by
The assignment to $user_setting is dead and can be removed.
Loading history...
1021
1022
        $email_tpl = $this->getEmailTpl('dept', 'changed_status', $this->module, $template_id);
1023
        if ($email_tpl) {
1024
            $sendTo  = $this->getSubscribedStaff($ticket, $email_tpl['bit_value'], $settings);
1025
            $success = $this->sendEvents($email_tpl, $sendTo, $tags);
0 ignored issues
show
Unused Code introduced by
The assignment to $success is dead and can be removed.
Loading history...
Bug introduced by
It seems like $email_tpl can also be of type true; however, parameter $email_tpl of XoopsModules\Xhelp\Notif...onService::sendEvents() does only seem to accept array|object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1025
            $success = $this->sendEvents(/** @scrutinizer ignore-type */ $email_tpl, $sendTo, $tags);
Loading history...
1026
        }
1027
        $email_tpl = $this->getEmailTpl('ticket', 'changed_this_status', $this->module, $template_id);
1028
        if ($email_tpl) {
1029
            //$sendTo = $this->getEmail($ticket->getVar('uid'));
1030
            $sendTo  = $this->getSubscribedUsers($ticket->getVar('id'));
1031
            $success = $this->sendEvents($email_tpl, $sendTo, $tags);
1032
        }
1033
    }
1034
1035
    /**
1036
     * Event: update_owner
1037
     * Triggered after ticket ownership change (Individual)
1038
     * Also See: batch_owner
1039
     * @param Ticket          $ticket   Ticket that was changed
1040
     * @param int|string|null $oldOwner UID of previous owner
1041
     * @param int             $newOwner UID of new owner
1042
     */
1043
    public function update_owner(Ticket $ticket, $oldOwner, int $newOwner): void
0 ignored issues
show
Unused Code introduced by
The parameter $newOwner is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

1043
    public function update_owner(Ticket $ticket, $oldOwner, /** @scrutinizer ignore-unused */ int $newOwner): void

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
1044
    {
1045
        //notify old owner, if assigned
1046
        //notify new owner
1047
        //notify submitter
1048
        global $xoopsUser;
1049
        $helper = Helper::getInstance();
1050
1051
        $departmentHandler = $this->helper->getHandler('Department');
0 ignored issues
show
Bug introduced by
The property helper is declared private in XoopsModules\Xhelp\Service and cannot be accessed from this context.
Loading history...
1052
1053
        $displayName = $helper->getConfig('xhelp_displayName');    // Determines if username or real name is displayed
1054
1055
        $tags                       = [];
1056
        $tags['TICKET_ID']          = $ticket->getVar('id');
1057
        $tags['TICKET_URL']         = \XHELP_BASE_URL . '/ticket.php?id=' . $ticket->getVar('id');
1058
        $tags['TICKET_SUBJECT']     = ($ticket->getVar('subject', 'n'));
1059
        $tags['TICKET_DESCRIPTION'] = ($ticket->getVar('description', 'n'));
1060
        $tags['TICKET_OWNER']       = Utility::getUsername($ticket->getVar('ownership'), $displayName);
0 ignored issues
show
Bug introduced by
It seems like $displayName can also be of type null; however, parameter $displayName of XoopsModules\Xhelp\Utility::getUsername() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1060
        $tags['TICKET_OWNER']       = Utility::getUsername($ticket->getVar('ownership'), /** @scrutinizer ignore-type */ $displayName);
Loading history...
1061
        $tags['SUBMITTED_OWNER']    = $xoopsUser->getVar('uname');
1062
        $tags['TICKET_STATUS']      = Utility::getStatus($ticket->getVar('status'));
0 ignored issues
show
Bug introduced by
It seems like $ticket->getVar('status') can also be of type array and array; however, parameter $status of XoopsModules\Xhelp\Utility::getStatus() does only seem to accept integer|string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1062
        $tags['TICKET_STATUS']      = Utility::getStatus(/** @scrutinizer ignore-type */ $ticket->getVar('status'));
Loading history...
1063
        $tags['TICKET_PRIORITY']    = Utility::getPriority($ticket->getVar('priority'));
1064
        $tags['TICKET_DEPARTMENT']  = ($departmentHandler->getNameById($ticket->getVar('department')));
1065
1066
        $settings      = $this->notificationHandler->get(\XHELP_NOTIF_EDITOWNER);
1067
        $staff_setting = $settings->getVar('staff_setting') ?? '';
1068
        $user_setting  = $settings->getVar('user_setting') ?? '';
1069
        $staff_options = $settings->getVar('staff_options') ?? '';
1070
1071
        $sendTo = [];
1072
        if (\XHELP_NOTIF_STAFF_OWNER == $staff_setting) {
1073
            if (!empty($oldOwner)
1074
                && \_XHELP_NO_OWNER != $oldOwner) {                               // If there was an owner
1075
                $email_tpl = $this->getEmailTpl('dept', 'new_owner', $this->module, $template_id);
1076
                if ($email_tpl) {      // Send them an email
1077
                    if ($this->isSubscribed($oldOwner, $email_tpl['bit_value'])) {    // Check if the owner is subscribed
0 ignored issues
show
Bug introduced by
It seems like $oldOwner can also be of type string; however, parameter $user of XoopsModules\Xhelp\Notif...Service::isSubscribed() does only seem to accept XoopsModules\Xhelp\Staff|integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1077
                    if ($this->isSubscribed(/** @scrutinizer ignore-type */ $oldOwner, $email_tpl['bit_value'])) {    // Check if the owner is subscribed
Loading history...
1078
                        $sendTo  = $this->getStaffEmail($oldOwner, $ticket->getVar('department'), $staff_options);
0 ignored issues
show
Bug introduced by
It seems like $ticket->getVar('department') can also be of type array and array; however, parameter $dept of XoopsModules\Xhelp\Notif...ervice::getStaffEmail() does only seem to accept integer|null|string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1078
                        $sendTo  = $this->getStaffEmail($oldOwner, /** @scrutinizer ignore-type */ $ticket->getVar('department'), $staff_options);
Loading history...
Bug introduced by
It seems like $oldOwner can also be of type string; however, parameter $uid of XoopsModules\Xhelp\Notif...ervice::getStaffEmail() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1078
                        $sendTo  = $this->getStaffEmail(/** @scrutinizer ignore-type */ $oldOwner, $ticket->getVar('department'), $staff_options);
Loading history...
Bug introduced by
It seems like $staff_options can also be of type string; however, parameter $staff_options of XoopsModules\Xhelp\Notif...ervice::getStaffEmail() does only seem to accept array|null, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1078
                        $sendTo  = $this->getStaffEmail($oldOwner, $ticket->getVar('department'), /** @scrutinizer ignore-type */ $staff_options);
Loading history...
1079
                        $success = $this->sendEvents($email_tpl, $sendTo, $tags);
0 ignored issues
show
Bug introduced by
It seems like $email_tpl can also be of type true; however, parameter $email_tpl of XoopsModules\Xhelp\Notif...onService::sendEvents() does only seem to accept array|object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1079
                        $success = $this->sendEvents(/** @scrutinizer ignore-type */ $email_tpl, $sendTo, $tags);
Loading history...
Unused Code introduced by
The assignment to $success is dead and can be removed.
Loading history...
1080
                    }
1081
                }
1082
            }
1083
            if (0 != $ticket->getVar('ownership')
1084
                && $ticket->getVar('ownership') != $xoopsUser->getVar('uid')) { // If owner is not current user
1085
                $email_tpl = $this->getEmailTpl('dept', 'new_owner', $this->module, $template_id);
1086
                if ($email_tpl) {      // Send new owner email
1087
                    if ($this->isSubscribed($ticket->getVar('ownership'), $email_tpl['bit_value'])) {    // Check if the owner is subscribed
1088
                        $sendTo  = $this->getStaffEmail($ticket->getVar('ownership'), $ticket->getVar('department'), $staff_options);
1089
                        $success = $this->sendEvents($email_tpl, $sendTo, $tags);
1090
                    }
1091
                }
1092
            }
1093
        } elseif (\XHELP_NOTIF_STAFF_DEPT == $staff_setting) { // Notify entire department
1094
            $email_tpl = $this->getEmailTpl('dept', 'new_owner', $this->module, $template_id);
1095
            if ($email_tpl) {
1096
                $sendTo  = $this->getSubscribedStaff($ticket, $email_tpl['bit_value'], $settings);
1097
                $success = $this->sendEvents($email_tpl, $sendTo, $tags);
1098
            }
1099
        }
1100
1101
        if (\XHELP_NOTIF_USER_NO != $user_setting) {
1102
            $email_tpl = $this->getEmailTpl('ticket', 'new_this_owner', $this->module, $template_id);
1103
            if ($email_tpl) {   // Send to ticket submitter
1104
                $sendTo  = $this->getSubscribedUsers($ticket->getVar('id'));
1105
                $success = $this->sendEvents($email_tpl, $sendTo, $tags);
1106
            }
1107
        }
1108
    }
1109
1110
    /**
1111
     * Event: close_ticket
1112
     * Triggered after a ticket's status change from a status
1113
     * with a state of XHELP_STATE_UNRESOLVED to a status
1114
     * with a state of XHELP_STATE_RESOLVED
1115
     * Also See: update_status, reopen_ticket
1116
     * @param Ticket $ticket The ticket that was closed
1117
     */
1118
    public function close_ticket(Ticket $ticket): void
1119
    {
1120
        global $xoopsUser;
1121
        $departmentHandler = $this->helper->getHandler('Department');
0 ignored issues
show
Bug introduced by
The property helper is declared private in XoopsModules\Xhelp\Service and cannot be accessed from this context.
Loading history...
1122
1123
        $tags                       = [];
1124
        $tags['TICKET_ID']          = $ticket->getVar('id');
1125
        $tags['TICKET_SUBJECT']     = ($ticket->getVar('subject', 'n'));
1126
        $tags['TICKET_DESCRIPTION'] = ($ticket->getVar('description', 'n'));
1127
        $tags['TICKET_STATUS']      = Utility::getStatus($ticket->getVar('status'));
0 ignored issues
show
Bug introduced by
It seems like $ticket->getVar('status') can also be of type array and array; however, parameter $status of XoopsModules\Xhelp\Utility::getStatus() does only seem to accept integer|string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1127
        $tags['TICKET_STATUS']      = Utility::getStatus(/** @scrutinizer ignore-type */ $ticket->getVar('status'));
Loading history...
1128
        $tags['TICKET_CLOSEDBY']    = $xoopsUser->getVar('uname');
1129
        $tags['TICKET_URL']         = \XHELP_BASE_URL . '/ticket.php?id=' . $ticket->getVar('id');
1130
        $tags['TICKET_DEPARTMENT']  = ($departmentHandler->getNameById($ticket->getVar('department')));
1131
1132
        $settings      = $this->notificationHandler->get(\XHELP_NOTIF_CLOSETICKET);
1133
        $staff_setting = $settings->getVar('staff_setting') ?? '';
1134
        $user_setting  = $settings->getVar('user_setting') ?? '';
1135
1136
        $sendTo = [];
1137
        if (\XHELP_NOTIF_STAFF_NONE != $staff_setting) {
1138
            $email_tpl = $this->getEmailTpl('dept', 'close_ticket', $this->module, $template_id);
1139
            if ($email_tpl) {        // Send to department, not to staff member
1140
                $sendTo  = $this->getSubscribedStaff($ticket, $email_tpl['bit_value'], $settings);
1141
                $success = $this->sendEvents($email_tpl, $sendTo, $tags);
0 ignored issues
show
Bug introduced by
It seems like $email_tpl can also be of type true; however, parameter $email_tpl of XoopsModules\Xhelp\Notif...onService::sendEvents() does only seem to accept array|object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1141
                $success = $this->sendEvents(/** @scrutinizer ignore-type */ $email_tpl, $sendTo, $tags);
Loading history...
Unused Code introduced by
The assignment to $success is dead and can be removed.
Loading history...
1142
            }
1143
        }
1144
1145
        if (\XHELP_NOTIF_USER_NO != $user_setting) {
1146
            if ($xoopsUser->getVar('uid') != $ticket->getVar('uid')) {        // If not closed by submitter
1147
                $email_tpl = $this->getEmailTpl('ticket', 'close_this_ticket', $this->module, $template_id);
1148
                if ($email_tpl) {        // Send to submitter
1149
                    //$sendTo = $this->getEmail($ticket->getVar('uid'));
1150
                    $sendTo  = $this->getSubscribedUsers($ticket->getVar('id'));
1151
                    $success = $this->sendEvents($email_tpl, $sendTo, $tags);
1152
                }
1153
            }
1154
        }
1155
    }
1156
1157
    /**
1158
     * Event: delete_ticket
1159
     * Triggered after a ticket is deleted
1160
     * @param Ticket $ticket Ticket that was deleted
1161
     */
1162
    public function delete_ticket(Ticket $ticket): void
1163
    {
1164
        //notify staff department
1165
        //notify submitter
1166
        global $xoopsUser, $xoopsModule;
1167
        $departmentHandler = $this->helper->getHandler('Department');
0 ignored issues
show
Bug introduced by
The property helper is declared private in XoopsModules\Xhelp\Service and cannot be accessed from this context.
Loading history...
1168
1169
        $tags                       = [];
1170
        $tags['TICKET_ID']          = $ticket->getVar('id');
1171
        $tags['TICKET_SUBJECT']     = ($ticket->getVar('subject', 'n'));
1172
        $tags['TICKET_DESCRIPTION'] = ($ticket->getVar('description', 'n'));
1173
        $tags['TICKET_PRIORITY']    = Utility::getPriority($ticket->getVar('priority'));
1174
        $tags['TICKET_STATUS']      = Utility::getStatus($ticket->getVar('status'));
0 ignored issues
show
Bug introduced by
It seems like $ticket->getVar('status') can also be of type array and array; however, parameter $status of XoopsModules\Xhelp\Utility::getStatus() does only seem to accept integer|string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1174
        $tags['TICKET_STATUS']      = Utility::getStatus(/** @scrutinizer ignore-type */ $ticket->getVar('status'));
Loading history...
1175
        $tags['TICKET_POSTED']      = $ticket->posted();
1176
        $tags['TICKET_DELETEDBY']   = $xoopsUser->getVar('uname');
1177
        $tags['TICKET_DEPARTMENT']  = ($departmentHandler->getNameById($ticket->getVar('department')));
1178
1179
        $settings      = $this->notificationHandler->get(\XHELP_NOTIF_DELTICKET);
1180
        $staff_setting = $settings->getVar('staff_setting') ?? '';
1181
        $user_setting  = $settings->getVar('user_setting') ?? '';
1182
1183
        if (\XHELP_NOTIF_STAFF_NONE != $staff_setting) {
1184
            $email_tpl = $this->getEmailTpl('dept', 'removed_ticket', $this->module, $template_id);
1185
            if ($email_tpl) { // Send to dept staff
1186
                $sendTo  = $this->getSubscribedStaff($ticket, $email_tpl['bit_value'], $settings);
1187
                $success = $this->sendEvents($email_tpl, $sendTo, $tags);
0 ignored issues
show
Bug introduced by
It seems like $email_tpl can also be of type true; however, parameter $email_tpl of XoopsModules\Xhelp\Notif...onService::sendEvents() does only seem to accept array|object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1187
                $success = $this->sendEvents(/** @scrutinizer ignore-type */ $email_tpl, $sendTo, $tags);
Loading history...
Unused Code introduced by
The assignment to $success is dead and can be removed.
Loading history...
1188
            }
1189
        }
1190
1191
        if (\XHELP_NOTIF_USER_NO != $user_setting) {
1192
            $status = $this->statusHandler->get($ticket->getVar('status'));
1193
            if (2 != $status->getVar('state')) {
1194
                $email_tpl = $this->getEmailTpl('ticket', 'removed_this_ticket', $this->module, $template_id);
1195
                if ($email_tpl) {  // Send to submitter
1196
                    //$sendTo = $this->getEmail($ticket->getVar('uid'));
1197
                    $sendTo  = $this->getSubscribedUsers($ticket->getVar('id'));
1198
                    $success = $this->sendEvents($email_tpl, $sendTo, $tags);
1199
                }
1200
            }
1201
        }
1202
    }
1203
1204
    /**
1205
     * Event: edit_ticket
1206
     * Triggered after a ticket is modified
1207
     * @param array|Ticket $oldTicket  Ticket information before modifications
1208
     * @param Ticket       $ticketInfo Ticket information after modifications
1209
     */
1210
    public function edit_ticket($oldTicket, Ticket $ticketInfo): void
1211
    {
1212
        //notify staff department of change
1213
        //notify submitter
1214
        global $xoopsUser;
1215
        $departmentHandler = $this->helper->getHandler('Department');
0 ignored issues
show
Bug introduced by
The property helper is declared private in XoopsModules\Xhelp\Service and cannot be accessed from this context.
Loading history...
1216
1217
        $tags                           = [];
1218
        $tags['TICKET_URL']             = \XHELP_BASE_URL . '/ticket.php?id=' . $ticketInfo->getVar('id');
1219
        $tags['TICKET_OLD_SUBJECT']     = ($oldTicket['subject']);
1220
        $tags['TICKET_OLD_DESCRIPTION'] = ($oldTicket['description']);
1221
        $tags['TICKET_OLD_PRIORITY']    = Utility::getPriority($oldTicket['priority']);
1222
        $tags['TICKET_OLD_STATUS']      = $oldTicket['status'];
1223
        $tags['TICKET_OLD_DEPARTMENT']  = $oldTicket['department'];
1224
        $tags['TICKET_OLD_DEPTID']      = $oldTicket['department_id'];
1225
1226
        $tags['TICKET_ID']          = $ticketInfo->getVar('id');
1227
        $tags['TICKET_SUBJECT']     = ($ticketInfo->getVar('subject', 'n'));
1228
        $tags['TICKET_DESCRIPTION'] = ($ticketInfo->getVar('description', 'n'));
1229
        $tags['TICKET_PRIORITY']    = Utility::getPriority($ticketInfo->getVar('priority'));
1230
        $tags['TICKET_STATUS']      = Utility::getStatus($ticketInfo->getVar('status'));
0 ignored issues
show
Bug introduced by
It seems like $ticketInfo->getVar('status') can also be of type array and array; however, parameter $status of XoopsModules\Xhelp\Utility::getStatus() does only seem to accept integer|string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1230
        $tags['TICKET_STATUS']      = Utility::getStatus(/** @scrutinizer ignore-type */ $ticketInfo->getVar('status'));
Loading history...
1231
        $tags['TICKET_MODIFIED']    = $xoopsUser->getVar('uname');
1232
        if ($tags['TICKET_OLD_DEPTID'] != $ticketInfo->getVar('department')) {
1233
            $department                = $departmentHandler->get($ticketInfo->getVar('department'));
1234
            $tags['TICKET_DEPARTMENT'] = $department->getVar('department');
1235
        } else {
1236
            $tags['TICKET_DEPARTMENT'] = $tags['TICKET_OLD_DEPARTMENT'];
1237
        }
1238
1239
        $settings      = $this->notificationHandler->get(\XHELP_NOTIF_EDITTICKET);
1240
        $staff_setting = $settings->getVar('staff_setting') ?? '';
1241
        $user_setting  = $settings->getVar('user_setting') ?? '';
1242
1243
        if (\XHELP_NOTIF_STAFF_NONE != $staff_setting) {
1244
            $email_tpl = $this->getEmailTpl('dept', 'modified_ticket', $this->module, $template_id);
1245
            if ($email_tpl) {            // Send to dept staff
1246
                $sendTo  = $this->getSubscribedStaff($ticketInfo, $email_tpl['bit_value'], $settings);
1247
                $success = $this->sendEvents($email_tpl, $sendTo, $tags);
0 ignored issues
show
Unused Code introduced by
The assignment to $success is dead and can be removed.
Loading history...
Bug introduced by
It seems like $email_tpl can also be of type true; however, parameter $email_tpl of XoopsModules\Xhelp\Notif...onService::sendEvents() does only seem to accept array|object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1247
                $success = $this->sendEvents(/** @scrutinizer ignore-type */ $email_tpl, $sendTo, $tags);
Loading history...
1248
            }
1249
        }
1250
        if (\XHELP_NOTIF_USER_NO != $user_setting) {
1251
            $email_tpl = $this->getEmailTpl('ticket', 'modified_this_ticket', $this->module, $template_id);
1252
            if ($email_tpl) {     // Send to ticket submitter
1253
                $sendTo  = $this->getSubscribedUsers($ticketInfo->getVar('id'));
1254
                $success = $this->sendEvents($email_tpl, $sendTo, $tags);
1255
            }
1256
        }
1257
    }
1258
1259
    /**
1260
     * Event: edit_response
1261
     * Triggered after a response has been modified
1262
     * Also See: new_response
1263
     * @param Ticket   $ticket
1264
     * @param Response $response    Modified response
1265
     * @param Ticket   $oldticket   Ticket before modifications
1266
     * @param Response $oldresponse Response modifications
1267
     * @internal param Ticket $nticket Ticket after modifications
1268
     */
1269
    public function edit_response(Ticket $ticket, Response $response, Ticket $oldticket, Response $oldresponse): void
1270
    {
1271
        //if not modified by response submitter, notify response submitter
1272
        //notify ticket submitter
1273
        global $xoopsUser;
1274
        $helper = Helper::getInstance();
1275
1276
        $departmentHandler = $this->helper->getHandler('Department');
0 ignored issues
show
Bug introduced by
The property helper is declared private in XoopsModules\Xhelp\Service and cannot be accessed from this context.
Loading history...
1277
        $displayName       = $helper->getConfig('xhelp_displayName');    // Determines if username or real name is displayed
1278
1279
        $tags                         = [];
1280
        $tags['TICKET_URL']           = \XHELP_BASE_URL . '/ticket.php?id=' . $ticket->getVar('id');
1281
        $tags['TICKET_OLD_RESPONSE']  = ($oldresponse->getVar('message', 'n'));
1282
        $tags['TICKET_OLD_TIMESPENT'] = $oldresponse->getVar('timeSpent');
1283
        $tags['TICKET_OLD_STATUS']    = Utility::getStatus($oldticket->getVar('status'));
0 ignored issues
show
Bug introduced by
It seems like $oldticket->getVar('status') can also be of type array and array; however, parameter $status of XoopsModules\Xhelp\Utility::getStatus() does only seem to accept integer|string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1283
        $tags['TICKET_OLD_STATUS']    = Utility::getStatus(/** @scrutinizer ignore-type */ $oldticket->getVar('status'));
Loading history...
1284
        $tags['TICKET_OLD_RESPONDER'] = Utility::getUsername($oldresponse->getVar('uid'), $displayName);
0 ignored issues
show
Bug introduced by
It seems like $displayName can also be of type null; however, parameter $displayName of XoopsModules\Xhelp\Utility::getUsername() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1284
        $tags['TICKET_OLD_RESPONDER'] = Utility::getUsername($oldresponse->getVar('uid'), /** @scrutinizer ignore-type */ $displayName);
Loading history...
1285
        $owner                        = $oldticket->getVar('ownership');
1286
        $tags['TICKET_OLD_OWNERSHIP'] = ($owner = 0 ? \_XHELP_NO_OWNER : Utility::getUsername($owner, $displayName));
0 ignored issues
show
Unused Code introduced by
The assignment to $owner is dead and can be removed.
Loading history...
1287
        $tags['TICKET_ID']            = $ticket->getVar('id');
1288
        $tags['RESPONSE_ID']          = $response->getVar('id');
1289
        $tags['TICKET_RESPONSE']      = ($response->getVar('message', 'n'));
1290
        $tags['TICKET_TIMESPENT']     = $response->getVar('timeSpent');
1291
        $tags['TICKET_STATUS']        = Utility::getStatus($ticket->getVar('status'));
1292
        $tags['TICKET_RESPONDER']     = $xoopsUser->getVar('uname');
1293
        $tags['TICKET_POSTED']        = $response->posted();
1294
        $owner                        = $ticket->getVar('ownership');
1295
        $tags['TICKET_OWNERSHIP']     = ($owner = 0 ? \_XHELP_NO_OWNER : Utility::getUsername($owner, $displayName));
1296
        $tags['TICKET_DEPARTMENT']    = ($departmentHandler->getNameById($ticket->getVar('department')));
1297
1298
        // Added by marcan to get the ticket's subject available in the mail template
1299
        $tags['TICKET_SUBJECT'] = ($ticket->getVar('subject', 'n'));
1300
        // End of addition by marcan
1301
1302
        $settings      = $this->notificationHandler->get(\XHELP_NOTIF_EDITRESPONSE);
1303
        $staff_setting = $settings->getVar('staff_setting') ?? '';
1304
        $user_setting  = $settings->getVar('user_setting') ?? '';
1305
1306
        if (\XHELP_NOTIF_STAFF_NONE != $staff_setting) {
1307
            $email_tpl = $this->getEmailTpl('dept', 'modified_response', $this->module, $template_id);
1308
            if ($email_tpl) {  // Notify dept staff
1309
                $sendTo  = $this->getSubscribedStaff($ticket, $email_tpl['bit_value'], $settings, $response->getVar('uid'));
1310
                $success = $this->sendEvents($email_tpl, $sendTo, $tags);
0 ignored issues
show
Unused Code introduced by
The assignment to $success is dead and can be removed.
Loading history...
Bug introduced by
It seems like $email_tpl can also be of type true; however, parameter $email_tpl of XoopsModules\Xhelp\Notif...onService::sendEvents() does only seem to accept array|object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1310
                $success = $this->sendEvents(/** @scrutinizer ignore-type */ $email_tpl, $sendTo, $tags);
Loading history...
1311
            }
1312
        }
1313
1314
        if (\XHELP_NOTIF_USER_NO != $user_setting) {
1315
            if (0 == $response->getVar('private')) {  // Make sure if response is private, don't sent to user
1316
                $email_tpl = $this->getEmailTpl('ticket', 'modified_this_response', $this->module, $template_id);
1317
                if ($email_tpl) {   // Notify ticket submitter
1318
                    $sendTo  = $this->getSubscribedUsers($ticket->getVar('id'));
1319
                    $success = $this->sendEvents($email_tpl, $sendTo, $tags);
1320
                }
1321
            }
1322
        }
1323
    }
1324
1325
    /**
1326
     * Event: batch_dept
1327
     * Triggered after a batch ticket department change
1328
     * @param array $oldTickets The Ticket objects that were modified
1329
     * @param int   $dept       The new department for the tickets
1330
     * @return bool
1331
     */
1332
    public function batch_dept(array $oldTickets, int $dept): bool
1333
    {
1334
        global $xoopsUser;
1335
1336
        $departmentHandler = $this->helper->getHandler('Department');
0 ignored issues
show
Bug introduced by
The property helper is declared private in XoopsModules\Xhelp\Service and cannot be accessed from this context.
Loading history...
1337
        $sDept             = $departmentHandler->getNameById($dept);
1338
1339
        $settings      = $this->notificationHandler->get(\XHELP_NOTIF_EDITTICKET);
1340
        $staff_setting = $settings->getVar('staff_setting') ?? '';
1341
        $user_setting  = $settings->getVar('user_setting') ?? '';
1342
1343
        if (\XHELP_NOTIF_STAFF_NONE != $staff_setting) {
1344
            $dept_email_tpl = $this->getEmailTpl('dept', 'modified_ticket', $this->module, $template_id);
1345
            if ($dept_email_tpl) {            // Send to dept staff
1346
                $deptEmails = $this->getSubscribedStaff($dept, $dept_email_tpl['bit_value'], $settings, $xoopsUser->getVar('uid'));
0 ignored issues
show
Unused Code introduced by
The assignment to $deptEmails is dead and can be removed.
Loading history...
1347
            }
1348
        } else {
1349
            $dept_email_tpl = false;
1350
        }
1351
1352
        $user_email_tpl = false;
1353
        if (\XHELP_NOTIF_USER_NO != $user_setting) {
1354
            $user_email_tpl = $this->getEmailTpl('ticket', 'modified_this_ticket', $this->module, $template_id);
1355
        }
1356
1357
        foreach ($oldTickets as $oldTicket) {
1358
            $tags                           = [];
1359
            $tags['TICKET_OLD_SUBJECT']     = ($oldTicket->getVar('subject', 'n'));
1360
            $tags['TICKET_OLD_DESCRIPTION'] = ($oldTicket->getVar('description', 'n'));
1361
            $tags['TICKET_OLD_PRIORITY']    = Utility::getPriority($oldTicket->getVar('priority'));
1362
            $tags['TICKET_OLD_STATUS']      = Utility::getStatus($oldTicket->getVar('status'));
1363
            $tags['TICKET_OLD_DEPARTMENT']  = $departmentHandler->getNameById($oldTicket->getVar('department'));
1364
            $tags['TICKET_OLD_DEPTID']      = $oldTicket->getVar('department');
1365
1366
            $tags['TICKET_ID']          = $oldTicket->getVar('id');
1367
            $tags['TICKET_SUBJECT']     = $tags['TICKET_OLD_SUBJECT'];
1368
            $tags['TICKET_DESCRIPTION'] = $tags['TICKET_OLD_DESCRIPTION'];
1369
            $tags['TICKET_PRIORITY']    = $tags['TICKET_OLD_PRIORITY'];
1370
            $tags['TICKET_STATUS']      = $tags['TICKET_OLD_STATUS'];
1371
            $tags['TICKET_MODIFIED']    = $xoopsUser->getVar('uname');
1372
            $tags['TICKET_DEPARTMENT']  = $sDept;
1373
            $tags['TICKET_URL']         = \XHELP_BASE_URL . '/ticket.php?id=' . $oldTicket->getVar('id');
1374
1375
            if ($dept_email_tpl) {
1376
                $deptEmails = $this->getSubscribedStaff($oldTicket, $dept_email_tpl['bit_value'], $settings, $xoopsUser->getVar('uid'));
1377
                $success    = $this->sendEvents($dept_email_tpl, $deptEmails, $tags);
0 ignored issues
show
Bug introduced by
It seems like $dept_email_tpl can also be of type true; however, parameter $email_tpl of XoopsModules\Xhelp\Notif...onService::sendEvents() does only seem to accept array|object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1377
                $success    = $this->sendEvents(/** @scrutinizer ignore-type */ $dept_email_tpl, $deptEmails, $tags);
Loading history...
Unused Code introduced by
The assignment to $success is dead and can be removed.
Loading history...
1378
            }
1379
            if ($user_email_tpl) {
1380
                //$sendTo = $this->getEmail($oldTicket->getVar('uid'));
1381
                $sendTo  = $this->getSubscribedUsers($oldTicket->getVar('id'));
1382
                $success = $this->sendEvents($user_email_tpl, $sendTo, $tags);
1383
            }
1384
        }
1385
1386
        return true;
1387
    }
1388
1389
    /**
1390
     * Event: batch_priority
1391
     * Triggered after a batch ticket priority change
1392
     * @param array $tickets  The Ticket objects that were modified
1393
     * @param int   $priority The new ticket priority
1394
     */
1395
    public function batch_priority(array $tickets, int $priority): void
0 ignored issues
show
Unused Code introduced by
The parameter $priority is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

1395
    public function batch_priority(array $tickets, /** @scrutinizer ignore-unused */ int $priority): void

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $tickets is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

1395
    public function batch_priority(/** @scrutinizer ignore-unused */ array $tickets, int $priority): void

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
1396
    {
1397
        global $xoopsUser;
1398
1399
        [$tickets, $priority] = $args;
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $args seems to be never defined.
Loading history...
1400
        $departmentHandler = $this->helper->getHandler('Department');
0 ignored issues
show
Bug introduced by
The property helper is declared private in XoopsModules\Xhelp\Service and cannot be accessed from this context.
Loading history...
1401
1402
        $settings      = $this->notificationHandler->get(\XHELP_NOTIF_EDITPRIORITY);
1403
        $staff_setting = $settings->getVar('staff_setting') ?? '';
1404
        $user_setting  = $settings->getVar('user_setting') ?? '';
1405
1406
        if (\XHELP_NOTIF_STAFF_NONE != $staff_setting) {
1407
            $dept_email_tpl = $this->getEmailTpl('dept', 'changed_priority', $this->module, $template_id);
1408
        } else {
1409
            $dept_email_tpl = false;
1410
        }
1411
        if (\XHELP_NOTIF_USER_NO != $user_setting) {
1412
            $user_email_tpl = $this->getEmailTpl('ticket', 'changed_this_priority', $this->module, $template_id);
1413
        } else {
1414
            $user_email_tpl = false;
1415
        }
1416
        $uname    = $xoopsUser->getVar('uname');
1417
        $uid      = $xoopsUser->getVar('uid');
0 ignored issues
show
Unused Code introduced by
The assignment to $uid is dead and can be removed.
Loading history...
1418
        $priority = Utility::getPriority($priority);
1419
1420
        foreach ($tickets as $ticket) {
1421
            $tags                        = [];
1422
            $tags['TICKET_ID']           = $ticket->getVar('id');
1423
            $tags['TICKET_OLD_PRIORITY'] = Utility::getPriority($ticket->getVar('priority'));
1424
            $tags['TICKET_PRIORITY']     = $priority;
1425
            $tags['TICKET_UPDATEDBY']    = $uname;
1426
            $tags['TICKET_URL']          = \XHELP_BASE_URL . '/ticket.php?id=' . $ticket->getVar('id');
1427
            // Added by marcan to get the ticket's subject available in the mail template
1428
            $tags['TICKET_SUBJECT'] = ($ticket->getVar('subject', 'n'));
1429
            // End of addition by marcan
1430
            $tags['TICKET_DEPARTMENT'] = ($departmentHandler->getNameById($ticket->getVar('department')));
1431
1432
            if ($dept_email_tpl) {
1433
                $sendTo  = $this->getSubscribedStaff($ticket, $dept_email_tpl['bit_value'], $settings);
1434
                $success = $this->sendEvents($dept_email_tpl, $sendTo, $tags);
0 ignored issues
show
Unused Code introduced by
The assignment to $success is dead and can be removed.
Loading history...
Bug introduced by
It seems like $dept_email_tpl can also be of type true; however, parameter $email_tpl of XoopsModules\Xhelp\Notif...onService::sendEvents() does only seem to accept array|object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1434
                $success = $this->sendEvents(/** @scrutinizer ignore-type */ $dept_email_tpl, $sendTo, $tags);
Loading history...
1435
            }
1436
1437
            if ($user_email_tpl) {
1438
                //$sendTo = $this->getEmail($ticket->getVar('uid'));
1439
                $sendTo  = $this->getSubscribedUsers($ticket->getVar('id'));
1440
                $success = $this->sendEvents($user_email_tpl, $sendTo, $tags);
1441
            }
1442
            unset($tags);
1443
        }
1444
    }
1445
1446
    /**
1447
     * Event: batch_owner
1448
     * Triggered after a batch ticket ownership change
1449
     * @param array $tickets The Ticket objects that were modified
1450
     * @param int   $owner   The XOOPS UID of the new owner
1451
     * @return bool
1452
     */
1453
    public function batch_owner(array $tickets, int $owner): bool
1454
    {
1455
        //notify old owner, if assigned
1456
        //notify new owner
1457
        //notify submitter
1458
        global $xoopsUser;
1459
        $helper = Helper::getInstance();
1460
1461
        $departmentHandler = $this->helper->getHandler('Department');
0 ignored issues
show
Bug introduced by
The property helper is declared private in XoopsModules\Xhelp\Service and cannot be accessed from this context.
Loading history...
1462
1463
        $displayName = $helper->getConfig('xhelp_displayName');    // Determines if username or real name is displayed
1464
1465
        $settings      = $this->notificationHandler->get(\XHELP_NOTIF_EDITOWNER);
1466
        $staff_setting = $settings->getVar('staff_setting') ?? '';
1467
        $user_setting  = $settings->getVar('user_setting') ?? '';
1468
        $staff_options = $settings->getVar('staff_options') ?? '';
1469
1470
        if (\XHELP_NOTIF_STAFF_NONE != $staff_setting) {
1471
            $dept_email_tpl = $this->getEmailTpl('dept', 'new_owner', $this->module, $template_id);
1472
        } else {
1473
            $dept_email_tpl = false;
1474
        }
1475
        if (\XHELP_NOTIF_USER_NO != $user_setting) {
1476
            $user_email_tpl = $this->getEmailTpl('ticket', 'new_this_owner', $this->module, $template_id);
1477
        } else {
1478
            $user_email_tpl = false;
1479
        }
1480
        $new_owner    = Utility::getUsername($owner, $displayName);
0 ignored issues
show
Bug introduced by
It seems like $displayName can also be of type null; however, parameter $displayName of XoopsModules\Xhelp\Utility::getUsername() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1480
        $new_owner    = Utility::getUsername($owner, /** @scrutinizer ignore-type */ $displayName);
Loading history...
1481
        $submitted_by = $xoopsUser->getVar('uname');
1482
        $uid          = $xoopsUser->getVar('uid');
1483
1484
        foreach ($tickets as $ticket) {
1485
            $tags                       = [];
1486
            $tags['TICKET_ID']          = $ticket->getVar('id');
1487
            $tags['TICKET_SUBJECT']     = ($ticket->getVar('subject', 'n'));
1488
            $tags['TICKET_DESCRIPTION'] = ($ticket->getVar('description', 'n'));
1489
            $tags['TICKET_OWNER']       = $new_owner;
1490
            $tags['SUBMITTED_OWNER']    = $submitted_by;
1491
            $tags['TICKET_STATUS']      = Utility::getStatus($ticket->getVar('status'));
1492
            $tags['TICKET_PRIORITY']    = Utility::getPriority($ticket->getVar('priority'));
1493
            $tags['TICKET_URL']         = \XHELP_BASE_URL . '/ticket.php?id=' . $ticket->getVar('id');
1494
            $tags['TICKET_DEPARTMENT']  = ($departmentHandler->getNameById($ticket->getVar('department')));
1495
1496
            $sendTo = [];
1497
            if (0 != $ticket->getVar('ownership')) {                               // If there was an owner
1498
                if ($dept_email_tpl) {      // Send them an email
1499
                    if ($this->isSubscribed($ticket->getVar('ownership'), $dept_email_tpl['bit_value'])) {    // Check if the owner is subscribed
1500
                        $sendTo  = $this->getStaffEmail($ticket->getVar('ownership'), $ticket->getVar('department'), $staff_options);
0 ignored issues
show
Bug introduced by
It seems like $staff_options can also be of type string; however, parameter $staff_options of XoopsModules\Xhelp\Notif...ervice::getStaffEmail() does only seem to accept array|null, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1500
                        $sendTo  = $this->getStaffEmail($ticket->getVar('ownership'), $ticket->getVar('department'), /** @scrutinizer ignore-type */ $staff_options);
Loading history...
1501
                        $success = $this->sendEvents($dept_email_tpl, $sendTo, $tags);
0 ignored issues
show
Unused Code introduced by
The assignment to $success is dead and can be removed.
Loading history...
Bug introduced by
It seems like $dept_email_tpl can also be of type true; however, parameter $email_tpl of XoopsModules\Xhelp\Notif...onService::sendEvents() does only seem to accept array|object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1501
                        $success = $this->sendEvents(/** @scrutinizer ignore-type */ $dept_email_tpl, $sendTo, $tags);
Loading history...
1502
                    }
1503
                }
1504
            }
1505
            if ($owner != $uid) {
1506
                if ($dept_email_tpl) { // Send new owner email
1507
                    if ($this->isSubscribed($owner, $dept_email_tpl['bit_value'])) {    // Check if the owner is subscribed
1508
                        $sendTo  = $this->getStaffEmail($owner, $ticket->getVar('department'), $staff_options);
1509
                        $success = $this->sendEvents($dept_email_tpl, $sendTo, $tags);
1510
                    }
1511
                }
1512
            }
1513
            if ($user_email_tpl) {
1514
                //$sendTo = $this->getEmail($ticket->getVar('uid'));
1515
                $sendTo  = $this->getSubscribedUsers($ticket->getVar('id'));
1516
                $success = $this->sendEvents($user_email_tpl, $sendTo, $tags);
1517
            }
1518
        }
1519
1520
        return true;
1521
    }
1522
1523
    /**
1524
     * Event: batch_status
1525
     * Triggered after a batch ticket status change
1526
     * @param array $tickets   The Ticket objects that were modified
1527
     * @param int   $newstatus The new ticket status
1528
     * @return bool
1529
     */
1530
    public function batch_status(array $tickets, int $newstatus): bool
1531
    {
1532
        //notify staff department of change
1533
        //notify submitter
1534
        global $xoopsUser;
1535
        $departmentHandler = $this->helper->getHandler('Department');
0 ignored issues
show
Bug introduced by
The property helper is declared private in XoopsModules\Xhelp\Service and cannot be accessed from this context.
Loading history...
1536
1537
        $settings      = $this->notificationHandler->get(\XHELP_NOTIF_EDITSTATUS);
1538
        $staff_setting = $settings->getVar('staff_setting') ?? '';
1539
        $user_setting  = $settings->getVar('user_setting') ?? '';
1540
1541
        if (\XHELP_NOTIF_STAFF_NONE != $staff_setting) {
1542
            $dept_email_tpl = $this->getEmailTpl('dept', 'changed_status', $this->module, $template_id);
1543
        } else {
1544
            $dept_email_tpl = false;
1545
        }
1546
        if (\XHELP_NOTIF_USER_NO != $user_setting) {
1547
            $user_email_tpl = $this->getEmailTpl('ticket', 'changed_this_status', $this->module, $template_id);
1548
        } else {
1549
            $user_email_tpl = false;
1550
        }
1551
        $sStatus = Utility::getStatus($newstatus);
1552
        $uname   = $xoopsUser->getVar('uname');
1553
        $uid     = $xoopsUser->getVar('uid');
0 ignored issues
show
Unused Code introduced by
The assignment to $uid is dead and can be removed.
Loading history...
1554
1555
        foreach ($tickets as $ticket) {
1556
            $tags               = [];
1557
            $tags['TICKET_ID']  = $ticket->getVar('id');
1558
            $tags['TICKET_URL'] = \XHELP_BASE_URL . '/ticket.php?id=' . $ticket->getVar('id');
1559
1560
            // Added by marcan to get the ticket's subject available in the mail template
1561
            $tags['TICKET_SUBJECT'] = ($ticket->getVar('subject', 'n'));
1562
            // End of addition by marcan
1563
1564
            $tags['TICKET_OLD_STATUS'] = Utility::getStatus($ticket->getVar('status'));
1565
            $tags['TICKET_STATUS']     = $sStatus;
1566
            $tags['TICKET_UPDATEDBY']  = $uname;
1567
            $tags['TICKET_DEPARTMENT'] = ($departmentHandler->getNameById($ticket->getVar('department')));
1568
1569
            if ($dept_email_tpl) {
1570
                $sendTo  = $this->getSubscribedStaff($ticket, $dept_email_tpl['bit_value'], $settings);
1571
                $success = $this->sendEvents($dept_email_tpl, $sendTo, $tags);
0 ignored issues
show
Unused Code introduced by
The assignment to $success is dead and can be removed.
Loading history...
Bug introduced by
It seems like $dept_email_tpl can also be of type true; however, parameter $email_tpl of XoopsModules\Xhelp\Notif...onService::sendEvents() does only seem to accept array|object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1571
                $success = $this->sendEvents(/** @scrutinizer ignore-type */ $dept_email_tpl, $sendTo, $tags);
Loading history...
1572
            }
1573
            if ($user_email_tpl) {
1574
                $sendTo  = $this->getSubscribedUsers($ticket->getVar('id'));
1575
                $success = $this->sendEvents($user_email_tpl, $sendTo, $tags);
1576
            }
1577
        }
1578
1579
        return true;
1580
    }
1581
1582
    /**
1583
     * Event: batch_delete_ticket
1584
     * Triggered after a batch ticket deletion
1585
     * @param array $tickets The Ticket objects that were deleted
1586
     * @return bool
1587
     */
1588
    public function batch_delete_ticket(array $tickets): bool
1589
    {
1590
        //notify staff department
1591
        //notify submitter (if ticket is not closed)
1592
        global $xoopsUser, $xoopsModule;
1593
1594
        $uname             = $xoopsUser->getVar('uname');
1595
        $uid               = $xoopsUser->getVar('uid');
1596
        $staffHandler      = $this->helper->getHandler('Staff');
0 ignored issues
show
Bug introduced by
The property helper is declared private in XoopsModules\Xhelp\Service and cannot be accessed from this context.
Loading history...
1597
        $isStaff           = $staffHandler->isStaff($uid);
1598
        $departmentHandler = $this->helper->getHandler('Department');
1599
1600
        $settings      = $this->notificationHandler->get(\XHELP_NOTIF_DELTICKET);
1601
        $staff_setting = $settings->getVar('staff_setting') ?? '';
1602
        $user_setting  = $settings->getVar('user_setting') ?? '';
1603
1604
        if (\XHELP_NOTIF_STAFF_NONE != $staff_setting) {
1605
            $dept_email_tpl = $this->getEmailTpl('dept', 'removed_ticket', $this->module, $template_id);
1606
        } else {
1607
            $dept_email_tpl = false;
1608
        }
1609
        if (\XHELP_NOTIF_USER_NO != $user_setting) {
1610
            $user_email_tpl = $this->getEmailTpl('ticket', 'removed_this_ticket', $this->module, $template_id);
1611
        } else {
1612
            $user_email_tpl = false;
1613
        }
1614
1615
        foreach ($tickets as $ticket) {
1616
            $tags                       = [];
1617
            $tags['TICKET_ID']          = $ticket->getVar('id');
1618
            $tags['TICKET_SUBJECT']     = ($ticket->getVar('subject', 'n'));
1619
            $tags['TICKET_DESCRIPTION'] = ($ticket->getVar('description', 'n'));
1620
            $tags['TICKET_PRIORITY']    = Utility::getPriority($ticket->getVar('priority'));
1621
            $tags['TICKET_STATUS']      = Utility::getStatus($ticket->getVar('status'));
1622
            $tags['TICKET_POSTED']      = $ticket->posted();
1623
            $tags['TICKET_DELETEDBY']   = $uname;
1624
            $tags['TICKET_DEPARTMENT']  = ($departmentHandler->getNameById($ticket->getVar('department')));
1625
1626
            if ($dept_email_tpl) {
1627
                $sendTo  = $this->getSubscribedStaff($ticket, $dept_email_tpl['bit_value'], $settings);
1628
                $success = $this->sendEvents($dept_email_tpl, $sendTo, $tags);
0 ignored issues
show
Bug introduced by
It seems like $dept_email_tpl can also be of type true; however, parameter $email_tpl of XoopsModules\Xhelp\Notif...onService::sendEvents() does only seem to accept array|object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1628
                $success = $this->sendEvents(/** @scrutinizer ignore-type */ $dept_email_tpl, $sendTo, $tags);
Loading history...
Unused Code introduced by
The assignment to $success is dead and can be removed.
Loading history...
1629
            }
1630
1631
            if ($user_email_tpl) {
1632
                $status = $this->statusHandler->get($ticket->getVar('status'));
1633
                if ($isStaff || (!$isStaff && 2 != $status->getVar('state'))) {           // Send to ticket submitter
1634
                    //$sendTo = $this->getEmail($ticket->getVar('uid'));
1635
                    $sendTo  = $this->getSubscribedUsers($ticket->getVar('id'));
1636
                    $success = $this->sendEvents($user_email_tpl, $sendTo, $tags);
1637
                }
1638
            }
1639
        }
1640
1641
        return true;
1642
    }
1643
1644
    /**
1645
     * Event: batch_response
1646
     * Triggered after a batch response addition
1647
     * Note: the $response->getVar('ticketid') field is empty for this function
1648
     * @param array    $tickets  The Ticket objects that were modified
1649
     * @param Response $response The response added to each ticket
1650
     */
1651
    public function batch_response(array $tickets, Response $response): void
1652
    {
1653
        global $xoopsUser, $xoopsConfig;
1654
        $helper         = Helper::getInstance();
1655
        $dept_email_tpl = [];
1656
1657
        $displayName              = $helper->getConfig('xhelp_displayName');    // Determines if username or real name is displayed
1658
        $responseText             = ($response->getVar('message', 'n'));
1659
        $uname                    = $xoopsUser->getVar('uname');
1660
        $uid                      = $xoopsUser->getVar('uid');
1661
        $updated                  = \formatTimestamp(\time(), 'm');
1662
        $private                  = $response->getVar('private');
1663
        $departmentMailBoxHandler = $this->helper->getHandler('DepartmentMailBox');
0 ignored issues
show
Bug introduced by
The property helper is declared private in XoopsModules\Xhelp\Service and cannot be accessed from this context.
Loading history...
1664
        $mailBoxes                = $departmentMailBoxHandler->getObjects(null, true);
1665
        $departmentHandler        = $this->helper->getHandler('Department');
1666
1667
        $settings      = $this->notificationHandler->get(\XHELP_NOTIF_NEWRESPONSE);
1668
        $staff_setting = $settings->getVar('staff_setting') ?? '';
1669
        $user_setting  = $settings->getVar('user_setting') ?? '';
1670
        $staff_options = $settings->getVar('staff_options') ?? '';
1671
1672
        if (\XHELP_NOTIF_STAFF_NONE != $staff_setting) {
1673
            $dept_email_tpl = $this->getEmailTpl('dept', 'new_response', $this->module, $template_id);
1674
        } else {
1675
            $dept_email_tpl = false;
1676
        }
1677
        if (\XHELP_NOTIF_USER_NO != $user_setting) {
1678
            $user_email_tpl = $this->getEmailTpl('ticket', 'new_this_response', $this->module, $template_id);
1679
        } else {
1680
            $user_email_tpl = false;
1681
        }
1682
1683
        foreach ($tickets as $ticket) {
1684
            $bFromEmail                = false;
1685
            $tags                      = [];
1686
            $tags['TICKET_ID']         = $ticket->getVar('id');
1687
            $tags['TICKET_RESPONSE']   = $responseText;
1688
            $tags['TICKET_SUBJECT']    = $ticket->getVar('subject');
1689
            $tags['TICKET_TIMESPENT']  = $response->getVar('timeSpent');
1690
            $tags['TICKET_STATUS']     = Utility::getStatus($ticket->getVar('status'));
1691
            $tags['TICKET_RESPONDER']  = $uname;
1692
            $tags['TICKET_POSTED']     = $updated;
1693
            $tags['TICKET_URL']        = \XHELP_BASE_URL . '/ticket.php?id=' . $ticket->getVar('id');
1694
            $tags['TICKET_DEPARTMENT'] = ($departmentHandler->getNameById($ticket->getVar('department')));
1695
1696
            $owner = $ticket->getVar('ownership');
1697
            if (0 == $owner) {
1698
                $tags['TICKET_OWNERSHIP'] = \_XHELP_NO_OWNER;
1699
            } else {
1700
                $tags['TICKET_OWNERSHIP'] = Utility::getUsername($owner, $displayName);
0 ignored issues
show
Bug introduced by
It seems like $displayName can also be of type null; however, parameter $displayName of XoopsModules\Xhelp\Utility::getUsername() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1700
                $tags['TICKET_OWNERSHIP'] = Utility::getUsername($owner, /** @scrutinizer ignore-type */ $displayName);
Loading history...
1701
            }
1702
1703
            if ($ticket->getVar('serverid') > 0) {
1704
                //Ticket was submitted via email
1705
                $mailBox = $mailBoxes[$ticket->getVar('serverid')];
1706
                if (\is_object($mailBox)) {
1707
                    $bFromEmail = true;
1708
                }
1709
            }
1710
1711
            if ($bFromEmail) {
1712
                $from                         = $mailBox->getVar('emailaddress');
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $mailBox does not seem to be defined for all execution paths leading up to this point.
Loading history...
1713
                $tags['TICKET_SUPPORT_EMAIL'] = $from;
1714
                $tags['TICKET_SUPPORT_KEY']   = '{' . $ticket->getVar('emailHash') . '}';
1715
            } else {
1716
                $from                         = '';
1717
                $tags['TICKET_SUPPORT_EMAIL'] = $xoopsConfig['adminmail'];
1718
                $tags['TICKET_SUPPORT_KEY']   = '';
1719
            }
1720
1721
            $sendTo = [];
1722
            if ($ticket->getVar('uid') != $uid && 0 === $response->getVar('private')) { // If response from staff member
1723
                if (0 == $private) {
1724
                    if ($user_email_tpl) {
1725
                        $sendTo  = $this->getUserEmail($ticket->getVar('uid'));
1726
                        $success = $this->sendEvents($user_email_tpl, $sendTo, $tags, $from);
0 ignored issues
show
Bug introduced by
It seems like $user_email_tpl can also be of type true; however, parameter $email_tpl of XoopsModules\Xhelp\Notif...onService::sendEvents() does only seem to accept array|object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1726
                        $success = $this->sendEvents(/** @scrutinizer ignore-type */ $user_email_tpl, $sendTo, $tags, $from);
Loading history...
Unused Code introduced by
The assignment to $success is dead and can be removed.
Loading history...
1727
                    }
1728
                } elseif ($dept_email_tpl) {
1729
                    if (0 != $ticket->getVar('ownership')) {
1730
                        $sendTo = $this->getStaffEmail($owner, $ticket->getVar('department'), $staff_options);
0 ignored issues
show
Bug introduced by
It seems like $staff_options can also be of type string; however, parameter $staff_options of XoopsModules\Xhelp\Notif...ervice::getStaffEmail() does only seem to accept array|null, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1730
                        $sendTo = $this->getStaffEmail($owner, $ticket->getVar('department'), /** @scrutinizer ignore-type */ $staff_options);
Loading history...
Unused Code introduced by
The assignment to $sendTo is dead and can be removed.
Loading history...
1731
                    } else {
1732
                        $sendTo = $this->getSubscribedStaff($ticket, $dept_email_tpl['bit_value'], $settings);
1733
                    }
1734
                }
1735
            } elseif ($dept_email_tpl) {// If response from submitter
1736
                if (0 != $ticket->getVar('ownership')) {  // If ticket has owner, send to owner
1737
                    if ($this->isSubscribed($owner, $dept_email_tpl['bit_value'])) {    // Check if the owner is subscribed
1738
                        $sendTo = $this->getStaffEmail($owner, $ticket->getVar('department'), $staff_options);
1739
                    }
1740
                } else {                                    // If ticket has no owner, send to department
1741
                    $sendTo = $this->getSubscribedStaff($ticket, $dept_email_tpl['bit_value'], $settings);
1742
                }
1743
                $success = $this->sendEvents($dept_email_tpl, $sendTo, $tags);
1744
            }
1745
        }
1746
    }
1747
1748
    /**
1749
     * Event: merge_tickets
1750
     * Triggered after two tickets are merged
1751
     * @param int $ticket1   First ticketid being merged
1752
     * @param int $ticket2   Second ticketid being merged
1753
     * @param int $newTicket Resulting ticketid after merge
1754
     */
1755
    public function merge_tickets(int $ticket1, int $ticket2, int $newTicket): void
1756
    {
1757
        global $xoopsUser;
1758
        /** @var \XoopsModules\Xhelp\TicketHandler $ticketHandler */
1759
        $ticketHandler = $this->helper->getHandler('Ticket');
0 ignored issues
show
Bug introduced by
The property helper is declared private in XoopsModules\Xhelp\Service and cannot be accessed from this context.
Loading history...
1760
        /** @var \XoopsModules\Xhelp\Ticket $ticket */
1761
        $ticket = $ticketHandler->get($newTicket);
1762
1763
        $tags                  = [];
1764
        $tags['TICKET_MERGER'] = $xoopsUser->getVar('uname');
1765
        $tags['TICKET1']       = $ticket1;
1766
        $tags['TICKET2']       = $ticket2;
1767
        $tags['TICKET_URL']    = \XHELP_BASE_URL . '/ticket.php?id=' . $newTicket;
1768
1769
        $settings      = $this->notificationHandler->get(\XHELP_NOTIF_MERGETICKET);
1770
        $staff_setting = $settings->getVar('staff_setting') ?? '';
1771
        $user_setting  = $settings->getVar('user_setting') ?? '';
1772
1773
        if (\XHELP_NOTIF_STAFF_NONE != $staff_setting) {
1774
            $email_tpl = $this->getEmailTpl('dept', 'merge_ticket', $this->module, $template_id);
1775
            if ($email_tpl) {   // Send email to dept members
1776
                $sendTo  = $this->getSubscribedStaff($ticket, $email_tpl['bit_value'], $settings);
1777
                $success = $this->sendEvents($email_tpl, $sendTo, $tags);
0 ignored issues
show
Bug introduced by
It seems like $email_tpl can also be of type true; however, parameter $email_tpl of XoopsModules\Xhelp\Notif...onService::sendEvents() does only seem to accept array|object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1777
                $success = $this->sendEvents(/** @scrutinizer ignore-type */ $email_tpl, $sendTo, $tags);
Loading history...
Unused Code introduced by
The assignment to $success is dead and can be removed.
Loading history...
1778
            }
1779
        }
1780
1781
        if (\XHELP_NOTIF_USER_NO != $user_setting) {
1782
            $email_tpl = $this->getEmailTpl('ticket', 'merge_this_ticket', $this->module, $template_id);
1783
            if ($email_tpl) {    // Send confirm email to submitter
1784
                //$sendTo = $this->getEmail($ticket->getVar('uid'));
1785
                $sendTo  = $this->getSubscribedUsers($newTicket);
1786
                $success = $this->sendEvents($email_tpl, $sendTo, $tags);
1787
            }
1788
        }
1789
    }
1790
1791
    /**
1792
     * Event: new_faq
1793
     * Triggered after FAQ addition
1794
     * @param Ticket $ticket Ticket used as base for FAQ
1795
     * @param Faq    $faq    FAQ that was added
1796
     */
1797
    public function new_faq(Ticket $ticket, Faq $faq): void
0 ignored issues
show
Unused Code introduced by
The parameter $faq is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

1797
    public function new_faq(Ticket $ticket, /** @scrutinizer ignore-unused */ Faq $faq): void

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $ticket is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

1797
    public function new_faq(/** @scrutinizer ignore-unused */ Ticket $ticket, Faq $faq): void

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
1798
    {
1799
    }
1800
1801
    /**
1802
     * Only have 1 instance of class used
1803
     * @return Service {@link Service}
1804
     */
1805
    public static function getInstance(): Service
1806
    {
1807
        static $instance;
1808
        if (null === $instance) {
1809
            $instance = new static();
1810
        }
1811
1812
        return $instance;
1813
    }
1814
1815
    public function attachEvents(): void
1816
    {
1817
        $this->attachEvent('batch_delete_ticket', $this);
1818
        $this->attachEvent('batch_dept', $this);
1819
        $this->attachEvent('batch_owner', $this);
1820
        $this->attachEvent('batch_priority', $this);
1821
        $this->attachEvent('batch_response', $this);
1822
        $this->attachEvent('batch_status', $this);
1823
        $this->attachEvent('close_ticket', $this);
1824
        $this->attachEvent('delete_ticket', $this);
1825
        $this->attachEvent('edit_response', $this);
1826
        $this->attachEvent('edit_ticket', $this);
1827
        $this->attachEvent('merge_tickets', $this);
1828
        $this->attachEvent('new_response', $this);
1829
        $this->attachEvent('new_ticket', $this);
1830
        $this->attachEvent('update_owner', $this);
1831
        $this->attachEvent('update_priority', $this);
1832
        $this->attachEvent('update_status', $this);
1833
    }
1834
}
1835