• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/lib/ui/calendarfilter.php
  • Класс: BitrixCalendarUiCalendarFilter
  • Вызов: CalendarFilter::getFilterCompanyData
static function getFilterCompanyData(string $type, int $userId, int $ownerId, $fields): array
{
	$filter = [
		'CAL_TYPE' => $type,
		'ACTIVE_SECTION' => 'Y',
	];
	$entries = [];

	$query = EventTable::query()
		->setSelect(['PARENT_ID'])
		->registerRuntimeField(
			'EVENT_SECOND',
			new ReferenceField(
				'EVENT_SECOND',
				EventTable::getEntity(),
				Join::on('ref.PARENT_ID', 'this.ID'),
				['join_type' => Join::TYPE_LEFT]
			)
		)
		->where('CAL_TYPE', $type)
		->where('DELETED', 'N')
		->where('EVENT_SECOND.DELETED', 'N')
	;

	if (isset($fields['fields']['IS_MEETING']) && $fields['fields']['IS_MEETING'])
	{
		$filter['IS_MEETING'] = $fields['fields']['IS_MEETING'] === 'Y';
	}

	if (isset($fields['fields']['MEETING_STATUS']) && $fields['fields']['MEETING_STATUS'])
	{
		$query->where('EVENT_SECOND.CREATED_BY', $userId);
		if (
			$fields['fields']['MEETING_STATUS'] === 'H'
			&& !isset($fields['fields']['CREATED_BY'])
		)
		{
			unset($filter['IS_MEETING']);
			$query->where('EVENT_SECOND.MEETING_HOST', $userId);
		}
		else
		{
			$query->where('EVENT_SECOND.MEETING_STATUS', $fields['fields']['MEETING_STATUS']);
			$filter['IS_MEETING'] = true;
		}
	}

	if (isset($fields['fields']['CREATED_BY']) && is_array($fields['fields']['CREATED_BY']))
	{
		$query->whereIn('EVENT_SECOND.MEETING_HOST', $fields['fields']['CREATED_BY']);
	}

	if (isset($fields['fields']['SECTION_ID']) && is_array($fields['fields']['SECTION_ID']))
	{
		$query->whereIn('SECTION_ID',  $fields['fields']['SECTION_ID']);
	}

	if (isset($fields['fields']['ATTENDEES']) && is_array($fields['fields']['ATTENDEES']))
	{
		if (isset($fields['fields']['MEETING_STATUS']))
		{
			$query
				->registerRuntimeField(
				'EVENT_THIRD',
				new ReferenceField(
					'EVENT_THIRD',
					EventTable::getEntity(),
					Join::on('ref.PARENT_ID', 'this.ID'),
					['join_type' => Join::TYPE_LEFT]
				)
			)
				->whereIn('EVENT_THIRD.CREATED_BY', $fields['fields']['ATTENDEES'])
			;
		}
		else
		{
			$query->whereIn('EVENT_SECOND.CREATED_BY', $fields['fields']['ATTENDEES']);
		}
		$filter['IS_MEETING'] = true;
	}

	if (isset($fields['search']) && $fields['search'])
	{
		$filter[(CCalendarEvent::isFullTextIndexEnabled() ? '*' : '*%').'SEARCHABLE_CONTENT'] = CCalendarEvent::prepareToken($fields['search']);
	}

	[$filter, $parseRecursion] = self::filterByDate($fields, $filter);

	$eventsFromQuery = $query->exec();

	while ($event = $eventsFromQuery->Fetch())
	{
		$filter['ID'][] = (int)$event['PARENT_ID'];
	}

	if (isset($filter['ID']))
	{
		$filter['ID'] = array_unique($filter['ID']);

		$entries = CCalendarEvent::GetList(
			[
				'arFilter' => $filter,
				'fetchAttendees' => true,
				'parseRecursion' => $parseRecursion,
				'maxInstanceCount' => 50,
				'preciseLimits' => $parseRecursion,
				'userId' => $userId,
				'fetchMeetings' => true,
				'fetchSection' => true,
				'setDefaultLimit' => false
			]
		);
	}
	$entries = self::applyAccessRestrictions($entries);
	$entries = self::filterByShowDeclined($entries);

	return [
		'result' => true,
		'entries' => $entries,
		'counters' => false
	];
}