Issues (1844)

Security Analysis    not enabled

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  Header Injection
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

class/NotificationService.php (121 issues)

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
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
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
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
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
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
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
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
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
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
The condition is_numeric($user) is always true.
Loading history...
402
                $uid          = $user;
403
                $staffHandler = $this->helper->getHandler('Staff');
0 ignored issues
show
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
$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
$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
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
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
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
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
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
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
The assignment to $success is dead and can be removed.
Loading history...
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
The assignment to $success is dead and can be removed.
Loading history...
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
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...
The assignment to $newid is dead and can be removed.
Loading history...
764
        $uname = $newuser->getVar('uname');
0 ignored issues
show
The assignment to $uname is dead and can be removed.
Loading history...
765
        $email = $newuser->getVar('email');
0 ignored issues
show
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
The assignment to $success is dead and can be removed.
Loading history...
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
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
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...
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
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
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
The assignment to $uname is dead and can be removed.
Loading history...
835
        $email = $user->getVar('email');
0 ignored issues
show
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
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...
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
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
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
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
The assignment to $success is dead and can be removed.
Loading history...
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
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
The assignment to $staff_setting is dead and can be removed.
Loading history...
976
        $user_setting  = $settings->getVar('user_setting') ?? '';
0 ignored issues
show
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
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...
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
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
The assignment to $staff_setting is dead and can be removed.
Loading history...
1020
        $user_setting  = $settings->getVar('user_setting') ?? '';
0 ignored issues
show
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
The assignment to $success is dead and can be removed.
Loading history...
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
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
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
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
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
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
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...
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...
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
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...
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
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
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
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...
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
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
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
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...
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
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
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
The assignment to $success is dead and can be removed.
Loading history...
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
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
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
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
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
The assignment to $success is dead and can be removed.
Loading history...
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
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
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
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...
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
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...
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
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
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
The assignment to $success is dead and can be removed.
Loading history...
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
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
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
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
The assignment to $success is dead and can be removed.
Loading history...
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
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
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
The assignment to $success is dead and can be removed.
Loading history...
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
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
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...
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
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
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
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...
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
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...
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
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
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...
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
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...
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