function getReopenStatus() { global $cfg; $status = null; if ($this->isReopenable() && ($c = $this->getConfiguration()) && isset($c['reopenstatus'])) { $status = TicketStatus::lookup($c['reopenstatus'] ?: $cfg->getDefaultTicketStatusId()); } return $status && !strcasecmp($status->getState(), 'open') ? $status : null; }
function postNote($vars, &$errors, $poster, $alert = true) { global $cfg, $thisstaff; //Who is posting the note - staff or system? $vars['staffId'] = 0; $vars['poster'] = 'SYSTEM'; if ($poster && is_object($poster)) { $vars['staffId'] = $poster->getId(); $vars['poster'] = $poster->getName(); } elseif ($poster) { //string $vars['poster'] = $poster; } if (!($note = $this->getThread()->addNote($vars, $errors))) { return null; } $alert = $alert && (isset($vars['flags']) ? !$vars['flags']['bounce'] && !$vars['flags']['auto-reply'] : true); // Get assigned staff just in case the ticket is closed. $assignee = $this->getStaff(); if ($vars['note_status_id'] && ($status = TicketStatus::lookup($vars['note_status_id']))) { if ($this->setStatus($status)) { $this->reload(); } } // If alerts are not enabled then return a success. if (!$alert || !$cfg->alertONNewNote() || !($dept = $this->getDept())) { return $note; } if (($email = $dept->getAlertEmail()) && ($tpl = $dept->getTemplate()) && ($msg = $tpl->getNoteAlertMsgTemplate())) { $msg = $this->replaceVars($msg->asArray(), array('note' => $note)); // Alert recipients $recipients = array(); //Last respondent. if ($cfg->alertLastRespondentONNewNote()) { $recipients[] = $this->getLastRespondent(); } // Assigned staff / team if ($cfg->alertAssignedONNewNote()) { if ($assignee && $assignee instanceof Staff) { $recipients[] = $assignee; } if ($team = $this->getTeam()) { $recipients = array_merge($recipients, $team->getMembers()); } } // Dept manager if ($cfg->alertDeptManagerONNewNote() && $dept && $dept->getManagerId()) { $recipients[] = $dept->getManager(); } $options = array('inreplyto' => $note->getEmailMessageId(), 'references' => $note->getEmailReferences(), 'thread' => $note); $isClosed = $this->isClosed(); $sentlist = array(); foreach ($recipients as $k => $staff) { if (!is_object($staff) || !$staff->isAvailable() || isset($sentlist[$staff->getEmail()]) || $note->getStaffId() == $staff->getId() || $isClosed && !$this->checkStaffAccess($staff)) { continue; } $alert = $this->replaceVars($msg, array('recipient' => $staff)); $email->sendAlert($staff->getEmail(), $alert['subj'], $alert['body'], null, $options); $sentlist[$staff->getEmail()] = 1; } } return $note; }
function postNote($vars, &$errors, $poster, $alert = true) { global $cfg, $thisstaff; //Who is posting the note - staff or system? $vars['staffId'] = 0; $vars['poster'] = 'SYSTEM'; if ($poster && is_object($poster)) { $vars['staffId'] = $poster->getId(); $vars['poster'] = $poster->getName(); } elseif ($poster) { //string $vars['poster'] = $poster; } if (!$vars['ip_address'] && $_SERVER['REMOTE_ADDR']) { $vars['ip_address'] = $_SERVER['REMOTE_ADDR']; } if (!($note = $this->getThread()->addNote($vars, $errors))) { return null; } $alert = $alert && (isset($vars['flags']) ? !$vars['flags']['bounce'] && !$vars['flags']['auto-reply'] : true); // Get assigned staff just in case the ticket is closed. $assignee = $this->getStaff(); if ($vars['note_status_id'] && ($status = TicketStatus::lookup($vars['note_status_id']))) { if ($this->setStatus($status)) { $this->reload(); } } $activity = $vars['activity'] ?: _S('New Internal Note'); $this->onActivity(array('activity' => $activity, 'threadentry' => $note, 'assignee' => $assignee), $alert); return $note; }
function setSelectedTicketsStatus($state) { global $thisstaff, $ost; $errors = $info = array(); if (!$thisstaff || !$thisstaff->canManageTickets()) { $errors['err'] = sprintf('%s %s', sprintf(__('You do not have permission %s.'), __('to mass manage tickets')), __('Contact admin for such access')); } elseif (!$_REQUEST['tids'] || !count($_REQUEST['tids'])) { $errors['err'] = sprintf(__('You must select at least %s.'), __('one ticket')); } elseif (!($status = TicketStatus::lookup($_REQUEST['status_id']))) { $errors['status_id'] = sprintf('%s %s', __('Unknown or invalid'), __('status')); } elseif (!$errors) { // Make sure the agent has permission to set the status switch (mb_strtolower($status->getState())) { case 'open': if (!$thisstaff->canCloseTickets() && !$thisstaff->canCreateTickets()) { $errors['err'] = sprintf(__('You do not have permission %s.'), __('to reopen tickets')); } break; case 'closed': if (!$thisstaff->canCloseTickets()) { $errors['err'] = sprintf(__('You do not have permission %s.'), __('to resolve/close tickets')); } break; case 'deleted': if (!$thisstaff->canDeleteTickets()) { $errors['err'] = sprintf(__('You do not have permission %s.'), __('to archive/delete tickets')); } break; default: $errors['err'] = sprintf('%s %s', __('Unknown or invalid'), __('status')); } } $count = count($_REQUEST['tids']); if (!$errors) { $i = 0; $comments = $_REQUEST['comments']; foreach ($_REQUEST['tids'] as $tid) { if (($ticket = Ticket::lookup($tid)) && $ticket->getStatusId() != $status->getId() && $ticket->checkStaffAccess($thisstaff) && $ticket->setStatus($status, $comments)) { $i++; } } if (!$i) { $errors['err'] = sprintf(__('Unable to change status for %s'), _N('the selected ticket', 'any of the selected tickets', $count)); } else { // Assume success if ($i == $count) { if (!strcasecmp($status->getState(), 'deleted')) { $msg = sprintf(__('Successfully deleted %s.'), _N('selected ticket', 'selected tickets', $count)); } else { $msg = sprintf(__('Successfully changed status of %1$s to %2$s'), _N('selected ticket', 'selected tickets', $count), $status->getName()); } $_SESSION['::sysmsgs']['msg'] = $msg; } else { if (!strcasecmp($status->getState(), 'deleted')) { $warn = sprintf(__('Successfully deleted %s.'), sprintf(__('%1$d of %2$d selected tickets'), $i, $count)); } else { $warn = sprintf(__('%1$d of %2$d %3$s status changed to %4$s'), $i, $count, _N('selected ticket', 'selected tickets', $count), $status->getName()); } $_SESSION['::sysmsgs']['warn'] = $warn; } Http::response(201, 'Successfully processed'); } } return self::_changeSelectedTicketsStatus($state, $info, $errors); }