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