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

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

	if (isset($fields['fields']['MEETING_STATUS']))
	{
		$filter['MEETING_STATUS'] = $fields['fields']['MEETING_STATUS'];
		if ($filter['MEETING_STATUS'] === 'H')
		{
			unset($filter['MEETING_STATUS']);
			$filter['MEETING_HOST'] = $userId;
		}
		else
		{
			$filter['IS_MEETING'] = true;
		}

		if ($fields['presetId'] === self::PRESET_INVITED)
		{
			$filter['FROM_LIMIT'] = CCalendar::Date(time(), false);
			$filter['TO_LIMIT'] = CCalendar::Date(time() + CCalendar::DAY_LENGTH * 90, false);
			CCalendar::UpdateCounter([$ownerId]);
			$counters = CountersManager::getValues((int)$filter['OWNER_ID']);
		}
	}

	if (isset($fields['fields']['CREATED_BY']))
	{
		unset($filter['OWNER_ID'], $filter['CAL_TYPE']);
		$filter['MEETING_HOST'] = $fields['fields']['CREATED_BY'];
		// mantis: 93743
		$filter['CREATED_BY'] = $userId;
	}

	if (!empty($fields['fields']['SECTION_ID']))
	{
		$filter['SECTION'] = $fields['fields']['SECTION_ID'];
	}
	else
	{
		return [
			'result' => true,
			'entries' => $entries,
			'counters' => $counters
		];
	}

	if (isset($fields['fields']['ATTENDEES']))
	{
		$query = EventTable::query()
			->setSelect(['ID'])
			->registerRuntimeField(
				'EVENT_SECOND',
				new ReferenceField(
					'EVENT_SECOND',
					EventTable::getEntity(),
					Join::on('ref.PARENT_ID', 'this.PARENT_ID'),
					['join_type' => Join::TYPE_LEFT]
				)
			)
			->where('DELETED', 'N')
			->where('EVENT_SECOND.DELETED', 'N')
			->where('CAL_TYPE', $type)
			->where('CREATED_BY', $userId)
			->whereIn('EVENT_SECOND.CREATED_BY', $fields['fields']['ATTENDEES'])
			->exec()
		;

		while ($event = $query->fetch())
		{
			$filter['ID'][] = (int)$event['ID'];
		}

		if ($filter['ID'] ?? false)
		{
			$filter['ID'] = array_unique($filter['ID']);
		}
		else
		{
			$filter['ID'] = [0];
		}

		$filter['IS_MEETING'] = true;
	}

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

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

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

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