• Модуль: timeman
  • Путь к файлу: ~/bitrix/modules/timeman/lib/repository/worktime/worktimerepository.php
  • Класс: BitrixTimemanRepositoryWorktimeWorktimeRepository
  • Вызов: WorktimeRepository::findByIdWith
public function findByIdWith($recordId, $withEntities = [])
{
	$res = WorktimeRecordTable::query()
		->addSelect('*')
		->where('ID', $recordId);
	if (in_array('SCHEDULE', $withEntities, true))
	{
		$res->addSelect('SCHEDULE')
			->registerRuntimeField((new Reference('SCHEDULE',
				ScheduleTable::class,
				Join::on('this.SCHEDULE_ID', 'ref.ID')))->configureJoinType('LEFT')
			);
	}
	if (in_array('SHIFT', $withEntities, true))
	{
		$res->addSelect('SHIFT')
			->registerRuntimeField((new Reference('SHIFT',
				ShiftTable::class,
				Join::on('this.SHIFT_ID', 'ref.ID')))->configureJoinType('LEFT')
			);
	}
	if (in_array('SCHEDULE.SHIFTS', $withEntities, true))
	{
		$res->addSelect('SCHEDULE.SHIFTS');
	}
	if (in_array('SCHEDULE.SCHEDULE_VIOLATION_RULES', $withEntities, true))
	{
		$res->addSelect('SCHEDULE.SCHEDULE_VIOLATION_RULES');
	}
	if (in_array('USER', $withEntities, true))
	{
		$res->addSelect('USER.ID')
			->addSelect('USER.NAME')
			->addSelect('USER.LAST_NAME')
			->addSelect('USER.SECOND_NAME')
			->addSelect('USER.PERSONAL_PHOTO')
			->addSelect('USER.TIME_ZONE')
			->addSelect('USER.LOGIN')
			->addSelect('USER.WORK_POSITION')
			->addSelect('USER.EMAIL');
	}
	$record = $res->exec()->fetchObject();
	if (!$record)
	{
		return $record;
	}
	if (in_array('REPORTS', $withEntities, true))
	{
		$reports = WorktimeReportTable::query()
			->addSelect('*')
			->where('ENTRY_ID', $record->getId())
			->addOrder('ID', 'DESC')
			->exec()
			->fetchCollection();
		if ($reports->count() > 0)
		{
			$record->defineReports($reports);
		}
	}
	if (in_array('WORKTIME_EVENTS', $withEntities, true))
	{
		$subQuery = WorktimeEventTable::query()
			->addSelect('MAX_ACTUAL_TIMESTAMP')
			->registerRuntimeField(new ExpressionField('MAX_ACTUAL_TIMESTAMP', 'MAX(ACTUAL_TIMESTAMP)'))
			->registerRuntimeField(new ExpressionField('EVENT_TYPE_ALIAS', 'CASE 
				WHEN EVENT_TYPE = "START_WITH_ANOTHER_TIME" THEN "EDIT_START"
				WHEN EVENT_TYPE = "STOP_WITH_ANOTHER_TIME" THEN "EDIT_STOP"
				ELSE EVENT_TYPE END')
			)
			->where('WORKTIME_RECORD_ID', $recordId)
			->addGroup('EVENT_TYPE_ALIAS');

		$events = WorktimeEventTable::query()
			->addSelect('*')
			->where('WORKTIME_RECORD_ID', $record->getId())
			->where(Query::filter()->logic('or')
				->whereIn('ACTUAL_TIMESTAMP', $subQuery)
				->where('ACTUAL_TIMESTAMP', null)
			)
			->exec()
			->fetchCollection();
		if ($events->count() > 0)
		{
			$record->defineWorktimeEvents($events);
		}

	}
	return $record;
}