• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/classes/general/timermanager.php
  • Класс: CTaskTimerManager
  • Вызов: CTaskTimerManager::onBeforeTaskUpdate
static function onBeforeTaskUpdate($id, $fields, $task)
{
	if ($userId = User::getId())
	{
		$oTimer  = self::getInstance($userId);
		$arTimer = $oTimer->getLastTimer();

		$completeStatuses = [
			Status::SUPPOSEDLY_COMPLETED,
			Status::COMPLETED,
			Status::DEFERRED,
		];
		$oldStatus = (int)($task['REAL_STATUS'] ?? null);
		$newStatus = (int)($fields['STATUS'] ?? null);

		// If task on timer & completed by logged in user, stop timer
		if (
			$arTimer
			&& $arTimer['TASK_ID'] == $task['ID']
			&& !in_array($oldStatus, $completeStatuses, true)
			&& in_array($newStatus, $completeStatuses, true)
			&& ($userId == $task['RESPONSIBLE_ID'] || in_array($userId, (array)$task['ACCOMPLICES']))
		)
		{
			$oTimer->stop();
		}
	}

	// If users are not responsible or accomplices in task elsemore,
	// stop they timers
	$oldMembers = array_unique(
		array_merge(
			[$task['RESPONSIBLE_ID']],
			$task['ACCOMPLICES']
		)
	);
	$newMembers = array_unique(
		array_merge(
			[($fields['RESPONSIBLE_ID'] ?? $task['RESPONSIBLE_ID'])],
			($fields['ACCOMPLICES'] ?? $task['ACCOMPLICES'])
		)
	);
	$eliminatedMembers = array_diff($oldMembers, $newMembers);

	self::stopTimerForUsers($task['ID'], $eliminatedMembers);
}