• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/replicator/template/taskrepeater.php
  • Класс: BitrixTasksReplicatorTemplateTaskRepeater
  • Вызов: TaskRepeater::calculateNextReplicationTimeTS
private function calculateNextReplicationTimeTS(): Result
{
	$result = new Result();

	$iterationCount = 0;
	$currentExecutionTime = $this->executionService->getTemplateCurrentExecutionTime();
	$currentUserTimezoneTS = User::getTimeZoneOffsetCurrentUser();
	$lastExecutionTime = $currentExecutionTime;
	do
	{
		$nextExecutionTimeResult = $this->executionService->getTemplateNextExecutionTime($lastExecutionTime);
		$nextExecutionTimeData = $nextExecutionTimeResult->getData();
		$nextExecutionTimeTS = $nextExecutionTimeData['time'];
		$this->writeToTemplateHistoryWithOldResult($nextExecutionTimeTS, $lastExecutionTime);

		if ($nextExecutionTimeTS <= 0)
		{
			$message = Loc::getMessage('TASKS_REPEATER_PROCESS_STOPPED');
			if ($message)
			{
				$this->templateHistoryService->write($message, $result);
			}
			$result->addError(new Error(Loc::getMessage('TASKS_REPEATER_PROCESS_STOPPED')));

			return $result;
		}

		$lastExecutionTimeTS = MakeTimeStamp($lastExecutionTime);
		$nextExecutionTime = UI::formatDateTime($nextExecutionTimeTS);

		if (($nextExecutionTime && $lastExecutionTimeTS >= $nextExecutionTimeTS) || ($iterationCount > static::MAX_ITERATION_COUNT))
		{
			$message = Loc::getMessage('TASKS_REPEATER_PROCESS_ERROR');
			if ($message)
			{
				$this->templateHistoryService->write($message, $result);
			}
			$this->writeToLogLoopError($nextExecutionTime, $lastExecutionTime, $iterationCount);
			$result->addError(new Error(Loc::getMessage('TASKS_REPEATER_PROCESS_ERROR')));

			return $result;
		}

		$lastExecutionTime = $nextExecutionTime;
		$currentUserTimeTS = time() + $currentUserTimezoneTS;

		$iterationCount++;
	}
	while (
		($nextExecutionTimeResult->isSuccess() && $nextExecutionTime)
		&& $nextExecutionTimeTS < $currentUserTimeTS
	);

	$result->setData(['time' => $nextExecutionTimeTS - $currentUserTimezoneTS]);
	return $result;
}