Как можно настроить отправку уведомления после того, как статус задачи будет изменен на "закрыто"?

Не могу понять, почему код не работает, хотя статусы у меня совпадают. Можете ли помочь? Вот код: <br/> <br/> <pre><code>AddEventHandler("tasks", "OnTaskUpdate", "OnTaskUpdateHandler");

function OnTaskUpdateHandler($taskId, $arFields) {
    $taskData = CTaskItem::getInstance($taskId, 1);
    $taskStatus = $taskData-&gt;data["STATUS"];

    if ($taskStatus == 5) { // Проверяем, что статус задачи равен "Закрыто"
        $taskCreatedBy = $taskData-&gt;data["CREATED_BY"]; // Получаем ID постановщика задачи

        $notificationParams = array(
            "TO_USER_ID" =&gt; $taskCreatedBy, // Постановщик задачи  
            "NOTIFY_TYPE" =&gt; IM_NOTIFY_FROM,
            "NOTIFY_MODULE" =&gt; "tasks",
            "NOTIFY_EVENT" =&gt; "task_update",
            "NOTIFY_MESSAGE" =&gt; "Задача #".$taskId." была закрыта.",
        );

        CIMNotify::Add($notificationParams); // Отправляем уведомление  
    }
}</code></pre>
  • 30 сентября 2024 г. 5:54
Ответы на вопрос 2
Давайте посмотрим на ваш код и попробуем понять, почему он может не работать.

1. **Проверка статуса**: Вы проверяете, равен ли статус задачи `5`, что, как вы отметили, соответствует статусу "Закрыто". Убедитесь, что действительно статус "Закрыто" имеет значение `5`. Иногда статусы могут быть определены через константы или перечисления.

2. **Правильность обработки события**: Убедитесь, что ваше событие `OnTaskUpdate` обрабатывается корректно и вызывается. Возможно, стоит добавить логирование в начале вашей функции, чтобы убедиться, что она срабатывает.

3. **Получение данных о задаче**: Убедитесь, что вы получаете корректные данные о задаче через `CTaskItem::getInstance($taskId, 1)`. Возможно, у вас нет нужных прав доступа или задача была удалена/изменена между обработкой события.

4. **Параметры уведомления**: Убедитесь, что параметры уведомления передаются правильно. Используйте `CIMNotify::Add($notificationParams)` только если у вас есть такой метод и он доступен. 

5. **Отсутствие ошибок**: Проверьте, нет ли ошибок в журнале или консоли (если у вас есть доступ к ней). Иногда ошибки могут давать подсказки, что идет не так.

Попробуйте следующий улучшенный код с добавлением логирования:

```php
AddEventHandler("tasks", "OnTaskUpdate", "OnTaskUpdateHandler");

function OnTaskUpdateHandler($taskId, $arFields) {
    $taskData = CTaskItem::getInstance($taskId, 1);
    
    if (!$taskData) {
        // Логируем, если задача не найдена
        error_log("Задача с ID $taskId не найдена.");
        return;
    }

    $taskStatus = $taskData->data["STATUS"];

    // Логируем статус задачи
    error_log("Статус задачи $taskId: $taskStatus");

    if ($taskStatus == 5) { // Проверяем, что статус задачи равен "Закрыто"
        $taskCreatedBy = $taskData->data["CREATED_BY"]; // Получаем ID постановщика задачи

        // Логируем ID создателя задачи
        error_log("Постановщик задачи $taskId: $taskCreatedBy");

        $notificationParams = array(
            "TO_USER_ID" => $taskCreatedBy, // Постановщик задачи  
            "NOTIFY_TYPE" => IM_NOTIFY_FROM,
            "NOTIFY_MODULE" => "tasks",
            "NOTIFY_EVENT" => "task_update",
            "NOTIFY_MESSAGE" => "Задача #".$taskId." была закрыта.",
        );

        if (CIMNotify::Add($notificationParams)) {
            error_log("Уведомление отправлено для задачи $taskId.");
        } else {
            error_log("Не удалось отправить уведомление для задачи $taskId.");
        }
    }
}
```

Этот код добавляет несколько логов, которые могут помочь вам понять, на каком этапе происходит проблема. Вы можете проверить вывод логов, чтобы увидеть, работает ли ваш обработчик событий и какие значения он получает.
Без лишних слов, вот так: 

// Подписываемся на событие через современный механизм
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandlerCompatible("tasks", "OnTaskUpdate", "OnTaskUpdateHandler");

function OnTaskUpdateHandler($taskId, $editedFields, $originalFields)
{
	// Если статус не меняется, ничего делать не нужно
	if ( !array_key_exists('STATUS', $editedFields) )
	{
		return true;
	}

	// Если статус меняется НЕ в состояние completed - ничего делать не нужно 
	if ( intval($editedFields["STATUS"]) != \Bitrix\Tasks\Internals\Task\Status::COMPLETED )
	{
		return true;
	}

	// Если вы меняете что-то другое, например название завершенной задачи, а статус просто летит за компанию, то делать ничего не нужно
	if ( $editedFields["STATUS"] == $editedFields["originalFields"] )
	{
		return true;
	}

	// Наш обработчик не имеет смысла, если модуль "Веб-мессенджер" не подключен
	if (!\Bitrix\Main\Loader::includeModule('im'))
	{
		return true;
	}

	/**
	 * Посмотреть поля можно через этот метод.
	 * Они будут в той же директории где и текущий файл, в файле log.log
	 */
	//\Bitrix\Main\Diag\Debug::dumpToFile(
	//	[
	//		'$taskId'        => $taskId,
	//		'$arFields'      => $arFields,
	//		'$eventTaskData' => $eventTaskData
	//	],
	//	date('d.m.Y H:i:s'),
	//	str_replace($_SERVER['DOCUMENT_ROOT'], '', __DIR__.'/log.log')
	//);

    $notificationParams = [
		"TO_USER_ID"   => $originalFields["CREATED_BY"],
		"FROM_USER_ID" => $originalFields["CREATED_BY"],
		"NOTIFY_TYPE" => IM_NOTIFY_SYSTEM,
		"NOTIFY_MODULE" => 'tasks', 
		"NOTIFY_MESSAGE" => "Задача #".$taskId." была закрыта.",
	];

	\CIMNotify::Add($notificationParams);
}
Похожие вопросы