- Модуль: 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__);
}
}
}