• Модуль: timeman
  • Путь к файлу: ~/bitrix/modules/timeman/lib/absence.php
  • Класс: BitrixTimemanAbsence
  • Вызов: Absence::setStatusOnline
static function setStatusOnline($users, $ip = null)
{
	if (!self::isActive() || !self::isRegisterOffline())
		return false;

	$dateStart = (new BitrixMainTypeDateTime())->format('Y-m-d').' 00:00:00';

	$orm = BitrixTimemanModelEntriesTable::getList(Array(
		'select' => Array(
			'USER_ID',
			'ABSENCE_ID' => 'ABSENCE.ID',
			'ABSENCE_DATE_START' => 'ABSENCE.DATE_START',
			'ABSENCE_TIME_START' => 'ABSENCE.TIME_START',
			'ABSENCE_TYPE' => 'ABSENCE.TYPE',
		),
		'filter' => Array(
			'=USER_ID' => $users,
			'>=DATE_START' => new BitrixMainDBSqlExpression('?', $dateStart),
			'=DATE_FINISH' => null,
			'>=ABSENCE.DATE_START' => new BitrixMainDBSqlExpression('?', $dateStart),
		),
		'runtime' => Array(
			new BitrixMainEntityReferenceField(
				'ABSENCE',
				'BitrixTimemanModelAbsenceTable',
				array(
					"=ref.USER_ID" => "this.USER_ID",
					"=ref.ACTIVE" => new BitrixMainDBSqlExpression('?', 'Y'),
					"=ref.TYPE" => new BitrixMainDBSqlExpression('?', self::TYPE_OFFLINE),
				),
				array("join_type"=>"inner")
			)
		)
	));

	$todayStart = new BitrixMainTypeDateTime((new BitrixMainTypeDateTime())->format('Y-m-d').' 00:00:00', 'Y-m-d H:i:s');

	while ($entry = $orm->fetch())
	{
		$dateFinish = new BitrixMainTypeDateTime();
		$timeFinish = $dateFinish->getTimestamp() - $todayStart->getTimestamp();
		$duration = $timeFinish - $entry['ABSENCE_TIME_START'];

		$fields = Array(
			'ACTIVE' => 'N',
			'DATE_FINISH' => $dateFinish,
			'TIME_FINISH' => $timeFinish,
			'DURATION' => $timeFinish - $entry['ABSENCE_TIME_START'],
			'SOURCE_FINISH' => self::SOURCE_ONLINE_EVENT,
		);
		if ($ip)
		{
			$fields['IP_FINISH'] = $ip;
		}
		BitrixTimemanModelAbsenceTable::update($entry['ABSENCE_ID'], $fields);

		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
				)
			));
		}
	}

	return true;
}