Добавлена система уведомлений для новых заявок (HelpDesk)

- Реализована функция createTicketNotification() в HelpDeskHandler
- Автоматическое создание уведомлений при создании новой заявки
- Уведомления отправляются ответственному за заявку
- Умная дедупликация - обновление существующих непрочитанных уведомлений
- Формат заголовка: 'Новая заявка ЗАЯВКА_XXX - [название]'
- Ссылка ведет на заявку в CRM
- Протестировано и работает корректно
This commit is contained in:
Fedor
2025-10-16 17:44:48 +03:00
parent 119a74b0e8
commit 7b8a18b680

View File

@@ -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;
}
}
}