• Модуль: timeman
  • Путь к файлу: ~/bitrix/modules/timeman/lib/absence.php
  • Класс: BitrixTimemanAbsence
  • Вызов: Absence::searchOfflineUsersWithActiveDayAgent
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();";
}