static function searchOfflineUsersWithActiveDayAgent()
{
if (!self::isActive() || !self::isRegisterOffline())
{
return "BitrixTimemanAbsence::searchOfflineUsersWithActiveDayAgent();";
}
$dateStart = (new BitrixMainTypeDateTime())->format('Y-m-d').' 00:00:00';
$orm = BitrixTimemanModelEntriesTable::getList(Array(
'select' => Array(
'ID',
'USER_ID',
'DATE_START',
'USER_LAST_ACTIVITY_DATE' => 'USER.LAST_ACTIVITY_DATE',
'ABSENCE_ID' => 'ABSENCE.ID',
'ABSENCE_TIME_START' => 'ABSENCE.TIME_START',
'ABSENCE_DATE_START' => 'ABSENCE.DATE_START',
),
'filter' => Array(
'>=DATE_START' => new BitrixMainDBSqlExpression('?', $dateStart),
'=DATE_FINISH' => null,
'=USER.IS_ONLINE' => 'N',
'!=ABSENCE.TYPE' => self::TYPE_OFFLINE
),
'runtime' => Array(
new BitrixMainEntityReferenceField(
'ABSENCE',
'BitrixTimemanModelAbsenceTable',
array(
"=ref.USER_ID" => "this.USER_ID",
"=ref.ACTIVE" => new BitrixMainDBSqlExpression('?', 'Y'),
">=ref.DATE_START" => new BitrixMainDBSqlExpression('?', $dateStart),
),
array("join_type"=>"left")
)
)
));
$todayStart = new BitrixMainTypeDateTime((new BitrixMainTypeDateTime())->format('Y-m-d').' 00:00:00', 'Y-m-d H:i:s');
$offlineRecordAdded = false;
while ($entry = $orm->fetch())
{
if ($entry['USER_LAST_ACTIVITY_DATE'] instanceof BitrixMainTypeDateTime)
{
$dateStart = $entry['USER_LAST_ACTIVITY_DATE'];
}
else
{
$dateStart = new BitrixMainTypeDateTime();
$dateStart->add('-'.BitrixMainUserTable::getSecondsForLimitOnline().' SECONDS');
}
if ($dateStart->getTimestamp() < $entry['DATE_START']->getTimestamp())
{
$dateStart = $entry['DATE_START'];
}
if ($entry['ABSENCE_ID'])
{
$dateFinish = $dateStart;
$timeFinish = $dateFinish->getTimestamp() - $todayStart->getTimestamp();
$duration = $timeFinish - $entry['ABSENCE_TIME_START'];
BitrixTimemanModelAbsenceTable::update($entry['ABSENCE_ID'], Array(
'ACTIVE' => 'N',
'DATE_FINISH' => $dateFinish,
'TIME_FINISH' => $timeFinish,
'DURATION' => $duration,
'SOURCE_FINISH' => self::SOURCE_OFFLINE_AGENT,
));
if (self::isReportEnableForUser($entry['USER_ID'], self::convertSecondsToMinutes($duration)))
{
BitrixPullEvent::add($entry['USER_ID'], Array(
'module_id' => 'timeman',
'command' => 'timeControlCommitAbsence',
'params' => Array(
'absenceId' => $entry['ABSENCE_ID'],
'dateStart' => date('c', $entry['ABSENCE_DATE_START']->getTimestamp()),
'dateFinish' => date('c', $dateFinish->getTimestamp()),
'duration' => $duration
)
));
if (false) // TODO remove debug case
{
BitrixMainIOFile::putFileContents(
$_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/timecontrol-debug.log",
print_r([
'ACTION' => 'OFFLINE',
'USER_ID' => $entry['USER_ID'],
Array(
'absenceId' => $entry['ABSENCE_ID'],
'dateStart' => date('c', $entry['ABSENCE_DATE_START']->getTimestamp()),
'dateFinish' => date('c', $dateFinish->getTimestamp()),
'duration' => $duration
)
], 1),
BitrixMainIOFile::APPEND
);
}
}
}
if (!$offlineRecordAdded)
{
$timeStart = $dateStart->getTimestamp() - $todayStart->getTimestamp();
BitrixTimemanModelAbsenceTable::add(Array(
'ENTRY_ID' => $entry['ID'],
'USER_ID' => $entry['USER_ID'],
'DATE_START' => $dateStart,
'TIME_START' => $timeStart,
'TYPE' => self::TYPE_OFFLINE,
'SOURCE_START' => self::SOURCE_OFFLINE_AGENT,
));
$offlineRecordAdded = true;
}
}
return "BitrixTimemanAbsence::searchOfflineUsersWithActiveDayAgent();";
}