• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/classes/general/timermanager.php
  • Класс: CTaskTimerManager
  • Вызов: CTaskTimerManager::stop
public function stop($taskId = 0)
{
	global $CACHE_MANAGER;

	if ($taskId)
	{
		$task = CTaskItem::getInstance($taskId, $this->userId);
		if (!$task->checkAccess(ActionDictionary::ACTION_TASK_TIME_TRACKING))
		{
			return false;
		}
	}

	$timer = CTaskTimerCore::stop($this->userId, $taskId);

	$dateFormat = Date::convertFormatToPhp(CSite::GetDateFormat());
	$userOffset = User::getTimeZoneOffset($this->userId);

	$dateStart = date($dateFormat, ($timer['TIMER_STARTED_AT'] ?? null) + $userOffset);
	$dateStop = date($dateFormat, ($timer['TIMER_STARTED_AT'] ?? null) + ($timer['TIMER_ACCUMULATOR'] ?? null) + $userOffset);

	$this->cachedLastTimer = null;

	if ($timer !== false && $timer['TIMER_ACCUMULATOR'] > 0)
	{
		/** @noinspection PhpDeprecationInspection */
		$elapsedTime = new CTaskElapsedTime();
		$elapsedTime->add(
			[
				'USER_ID' => $this->userId,
				'TASK_ID' => $timer['TASK_ID'],
				'SECONDS' => $timer['TIMER_ACCUMULATOR'],
				'COMMENT_TEXT' => '',
				'CREATED_DATE' => $dateStart,
				'DATE_START' => $dateStart,
				'DATE_STOP' => $dateStop,
			],
			[
				'SOURCE_SYSTEM' => 'Y',
			]
		);

		$task = CTaskItem::getInstance($timer['TASK_ID'], $this->userId);

		try
		{
			$taskData = $task->getData(false);
		}
		catch (TasksException $e)
		{
			return false;
		}

		$timeElapsed = [
			$this->userId => $taskData['TIME_SPENT_IN_LOGS'],
		];
		$affectedUsers = array_unique(
			array_merge(
				[$this->userId, $taskData['RESPONSIBLE_ID']],
				(array)$taskData['ACCOMPLICES']
			)
		);
		foreach ($affectedUsers as $userId)
		{
			$CACHE_MANAGER->ClearByTag("tasks_user_{$userId}");

			if ((int)$userId !== $this->userId)
			{
				$timeElapsed[$userId] = $taskData['TIME_SPENT_IN_LOGS'];

				$affectedUserTimer = CTaskTimerCore::get($userId, $timer['TASK_ID']);
				if ($affectedUserTimer !== false && $affectedUserTimer['TIMER_STARTED_AT'] > 0)
				{
					$timeElapsed[$userId] += time() - $affectedUserTimer['TIMER_STARTED_AT'];
				}
			}
		}

		PushService::addEvent(
			$affectedUsers,
			[
				'module_id' => 'tasks',
				'command' => PushCommand::TASK_TIMER_STOPPED,
				'params' => [
					'taskId' => (int)$timer['TASK_ID'],
					'userId' => $this->userId,
					'timeElapsed' => $timeElapsed,
				],
			]
		);
	}

	return $timer;
}