Добавлена система уведомлений для новых заявок (HelpDesk)
- Реализована функция createTicketNotification() в HelpDeskHandler - Автоматическое создание уведомлений при создании новой заявки - Уведомления отправляются ответственному за заявку - Умная дедупликация - обновление существующих непрочитанных уведомлений - Формат заголовка: 'Новая заявка ЗАЯВКА_XXX - [название]' - Ссылка ведет на заявку в CRM - Протестировано и работает корректно
This commit is contained in:
@@ -22,6 +22,77 @@ class HelpDeskHandler extends VTEventHandler {
|
||||
$adb->pquery('UPDATE vtiger_ticketcf SET from_portal=0 WHERE ticketid=?', array($ticketId));
|
||||
}
|
||||
}
|
||||
|
||||
// Создаем уведомление при создании новой заявки
|
||||
// Используем aftersave.final, чтобы ID точно был присвоен
|
||||
if($eventName == 'vtiger.entity.aftersave.final') {
|
||||
$moduleName = $entityData->getModuleName();
|
||||
if ($moduleName == 'HelpDesk' && $entityData->isNew()) {
|
||||
try {
|
||||
$this->createTicketNotification($entityData);
|
||||
} catch (Exception $e) {
|
||||
// Логируем ошибку, но не останавливаем создание заявки
|
||||
file_put_contents('logs/helpdesk_notifications.log', date('Y-m-d H:i:s').' - ОШИБКА: '.$e->getMessage().PHP_EOL, FILE_APPEND);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Создание уведомления для ответственного при создании новой заявки
|
||||
*/
|
||||
function createTicketNotification($entityData) {
|
||||
global $adb;
|
||||
|
||||
// getId() в этом контексте возвращает уже числовой ID, а не WebService ID
|
||||
$ticketId = $entityData->getId();
|
||||
if (empty($ticketId)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$ticketNo = $entityData->get('ticket_no');
|
||||
$ticketTitle = $entityData->get('ticket_title');
|
||||
$wsAssignedUserId = $entityData->get('assigned_user_id');
|
||||
|
||||
if (empty($wsAssignedUserId)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// assigned_user_id может быть как в WebService формате (19x8), так и просто числом (8)
|
||||
if (strpos($wsAssignedUserId, 'x') !== false) {
|
||||
$userIdParts = explode('x', $wsAssignedUserId);
|
||||
$userId = $userIdParts[1];
|
||||
} else {
|
||||
$userId = $wsAssignedUserId;
|
||||
}
|
||||
|
||||
// Формируем текст уведомления
|
||||
// Обрезаем заголовок до 80 символов для краткости
|
||||
$shortTitle = mb_strlen($ticketTitle) > 80 ? mb_substr($ticketTitle, 0, 80) . '...' : $ticketTitle;
|
||||
$notificationTitle = "Новая заявка " . $ticketNo . " - " . $shortTitle;
|
||||
|
||||
// Формируем ссылку на заявку (VDNotifierPro убирает index.php? из ссылки)
|
||||
$ticketLink = "module=HelpDesk&view=Detail&record=" . $ticketId;
|
||||
|
||||
// Проверяем, нет ли уже непрочитанного уведомления для этой заявки
|
||||
$checkQuery = "SELECT id FROM vtiger_vdnotifierpro WHERE userid = ? AND crmid = ? AND modulename = 'HelpDesk' AND status = 5";
|
||||
$checkResult = $adb->pquery($checkQuery, array($userId, $ticketId));
|
||||
|
||||
if ($adb->num_rows($checkResult) > 0) {
|
||||
// Обновляем существующее уведомление
|
||||
$existingId = $adb->query_result($checkResult, 0, 'id');
|
||||
$updateQuery = "UPDATE vtiger_vdnotifierpro SET title = ?, modifiedtime = NOW() WHERE id = ?";
|
||||
$adb->pquery($updateQuery, array($notificationTitle, $existingId));
|
||||
|
||||
return $existingId;
|
||||
} else {
|
||||
// Создаем новое уведомление
|
||||
$insertQuery = "INSERT INTO vtiger_vdnotifierpro (userid, modulename, crmid, modiuserid, link, title, action, modifiedtime, status) VALUES (?, 'HelpDesk', ?, 0, ?, ?, '', NOW(), 5)";
|
||||
$adb->pquery($insertQuery, array($userId, $ticketId, $ticketLink, $notificationTitle));
|
||||
|
||||
$notificationId = $adb->getLastInsertID();
|
||||
return $notificationId;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user