• Модуль: timeman
  • Путь к файлу: ~/bitrix/modules/timeman/lib/update/timemanversion19converter.php
  • Класс: BitrixTimemanUpdateTimemanVersion19Converter
  • Вызов: TimemanVersion19Converter::migrateRecordsOffsetData
private function migrateRecordsOffsetData()
{
	$this->logMessage('migrate Records Offset Data started', __LINE__);

	$recordsOffset = (int)Option::get(self::$moduleId, $this->userIdsOffsetOptionName, 0);
	$userLimit = 350;
	while (!$this->isMaxExecutionSecondsExceeded())
	{
		$userIds = array_column(
			WorktimeRecordTable::query()
				->addSelect('USER_ID_D')
				->registerRuntimeField(new ExpressionField('USER_ID_D', 'DISTINCT(%s)', 'USER_ID'))
				->addOrder('USER_ID_D')
				->setLimit($userLimit)
				->setOffset($recordsOffset)
				->exec()
				->fetchAll(),
			'USER_ID_D');

		$offsets = [];
		$timeHelper = TimeHelper::getInstance();
		$dateTimeServer = new DateTime('now', new DateTimeZone(date_default_timezone_get()));
		foreach ($userIds as $userId)
		{
			$userOffset = $dateTimeServer->getOffset() + $timeHelper->getUserToServerOffset($userId);
			if ($userOffset !== 0)
			{
				$offsets[$userOffset][] = (int)$userId;
			}
		}
		foreach ($offsets as $offset => $offsetUserIds)
		{
			Application::getConnection()->query("
				UPDATE 
				b_timeman_entries 
				SET
				TIMESTAMP_X = TIMESTAMP_X,
				START_OFFSET = IF(START_OFFSET != 0, START_OFFSET, " . (int)$offset . "),
				STOP_OFFSET = IF(STOP_OFFSET != 0, STOP_OFFSET, IF(CURRENT_STATUS = "CLOSED", " . (int)$offset . ", 0))
				WHERE
				USER_ID IN (" . implode(', ', $offsetUserIds) . ")"
			);
		}

		if (count($userIds) < $userLimit)
		{
			Option::set(self::$moduleId, $this->isEntriesOffsetMigrationDoneName, 1);
			break;
		}
		else
		{
			$recordsOffset = $recordsOffset + $userLimit;
			Option::set(self::$moduleId, $this->userIdsOffsetOptionName, $recordsOffset);
			$this->logMessage('migrate Records Offset Data offset changed to ' . $recordsOffset, __LINE__);
		}
	}

}