9use Bitrix\Main\Entity\ReferenceField;
17 private const PRESET_HOST =
'filter_calendar_host';
18 private const PRESET_ATTENDEE =
'filter_calendar_attendee';
19 private const PRESET_DECLINED =
'filter_calendar_declined';
55 static::$filterId =
'calendar-filter';
58 static::$filterId =
'calendar-filter-personal';
61 $type ===
'company_calendar'
62 ||
$type ===
'calendar_company'
63 ||
$type ===
'company'
66 static::$filterId =
'calendar-filter-company';
68 else if (
$type ===
'group')
70 static::$filterId =
'calendar-filter-group';
73 return static::$filterId;
92 if (
$type === Dictionary::CALENDAR_TYPE[
'user'] ||
$type === Dictionary::CALENDAR_TYPE[
'group'])
94 $presets[self::PRESET_INVITED] = [
95 'id' => self::PRESET_INVITED,
96 'name' => Loc::getMessage(
'CALENDAR_PRESET_MEETING_STATUS_Q'),
100 'MEETING_STATUS' =>
'Q',
105 $presets[self::PRESET_HOST] = [
106 'id' => self::PRESET_HOST,
107 'name' => Loc::getMessage(
'CALENDAR_PRESET_I_AM_HOST'),
110 'MEETING_STATUS' =>
'H',
114 $presets[self::PRESET_ATTENDEE] = [
115 'id' => self::PRESET_ATTENDEE,
116 'name' => Loc::getMessage(
'CALENDAR_PRESET_I_AM_ATTENDEE'),
120 'MEETING_STATUS' =>
'Y',
124 $presets[self::PRESET_DECLINED] = [
125 'id' => self::PRESET_DECLINED,
126 'name' => Loc::getMessage(
'CALENDAR_PRESET_I_DECLINED'),
130 'MEETING_STATUS' =>
'N',
147 $preset =
$fields[
'PRESET_ID'] ??
null;
148 $meetingStatus =
$fields[
'MEETING_STATUS'] ??
null;
149 if ($meetingStatus ===
'Q')
151 $preset = self::PRESET_INVITED;
153 if ($meetingStatus ===
'Y')
155 $preset = self::PRESET_ATTENDEE;
157 if ($meetingStatus ===
'N')
159 $preset = self::PRESET_DECLINED;
164 'presetId' => $preset,
173 if (
$key ===
'DATE_from')
175 $result[
'fields'][
'DATE_FROM'] = $value;
177 else if (
$key ===
'DATE_to')
179 $result[
'fields'][
'DATE_TO'] = $value;
181 else if (
$key ===
'ATTENDEES' ||
$key ===
'CREATED_BY' ||
$key ===
'SECTION_ID')
184 foreach ($value as
$code)
186 $valueList[] = (int)
$code;
190 else if (
$key ===
'MEETING_STATUS')
192 $result[
'fields'][
'MEETING_STATUS'] = $sqlHelper->forSql($value);
194 else if (in_array(
$key, $fieldNames,
true))
208 if (empty(static::$filters))
210 static::$filters[
'CREATED_BY'] = [
211 'id' =>
'CREATED_BY',
212 'name' => Loc::getMessage(
'CALENDAR_FILTER_CREATED_BY'),
213 'type' =>
'entity_selector',
219 'context' =>
'filter',
224 'inviteEmployeeLink' =>
false
232 static::$filters[
'ATTENDEES'] = [
234 'name' => Loc::getMessage(
'CALENDAR_FILTER_ATTENDEES'),
235 'type' =>
'entity_selector',
241 'context' =>
'filter',
246 'inviteEmployeeLink' =>
false
254 static::$filters[
'MEETING_STATUS'] = [
255 'id' =>
'MEETING_STATUS',
256 'name' => Loc::getMessage(
'CALENDAR_FILTER_MEETING_STATUS_ME'),
262 'H' => Loc::getMessage(
'CALENDAR_FILTER_MEETING_STATUS_H'),
263 'Q' => Loc::getMessage(
'CALENDAR_FILTER_MEETING_STATUS_Q'),
264 'Y' => Loc::getMessage(
'CALENDAR_FILTER_MEETING_STATUS_Y'),
265 'N' => Loc::getMessage(
'CALENDAR_FILTER_MEETING_STATUS_N'),
269 static::$filters[
'DATE'] = [
271 'name' => Loc::getMessage(
'CALENDAR_FILTER_DATE'),
277 return static::$filters;
284 if (
$type ===
'group' && $preset === self::PRESET_INVITED)
286 $sectionList = \CCalendar::getSectionList([
287 'CAL_TYPE' => Dictionary::CALENDAR_TYPE[
'user'],
288 'OWNER_ID' => array_unique([(
int)
$userId, 0]),
289 'checkPermissions' =>
true,
290 'getPermissions' =>
true,
295 $sectionList = \CCalendar::getSectionList([
296 'CAL_TYPE' =>
$type ===
'user' ? [
'user',
'open_event'] :
$type,
297 'OWNER_ID' => array_unique([(
int)$ownerId, 0]),
298 'checkPermissions' =>
true,
299 'getPermissions' =>
true,
303 $isPersonalCalendarContext = (
$type ===
'user' &&
$userId === $ownerId);
305 $hiddenSections = [];
306 if ($preset !== self::PRESET_INVITED)
312 'ownerId' => $ownerId,
313 'isPersonalCalendarContext' => $isPersonalCalendarContext,
316 $hiddenSections = array_map(
static function($sectionId) {
317 return (
int)$sectionId;
321 foreach ($sectionList as $section)
323 if (in_array((
int)$section[
'ID'], $hiddenSections,
true))
328 $result[] = (int)$section[
'ID'];
347 $ownerId = (int)
$params[
'ownerId'];
361 $type ===
'company_calendar'
362 ||
$type ===
'calendar_company'
363 ||
$type ===
'company'
389 'OWNER_ID' => $ownerId,
390 'CAL_TYPE' =>
$type ===
'user' ? [
'user',
'open_event'] :
$type,
391 'ACTIVE_SECTION' =>
'Y',
394 if (isset(
$fields[
'fields'][
'IS_MEETING']))
399 if (isset(
$fields[
'fields'][
'MEETING_STATUS']))
402 if (
$filter[
'MEETING_STATUS'] ===
'H')
404 unset(
$filter[
'MEETING_STATUS']);
412 if (
$fields[
'presetId'] === self::PRESET_INVITED)
414 $filter[
'FROM_LIMIT'] = \CCalendar::Date(time(),
false);
415 $filter[
'TO_LIMIT'] = \CCalendar::Date(time() + \CCalendar::DAY_LENGTH * 90,
false);
417 \CCalendar::UpdateCounter(
419 groupIds:
$type === Dictionary::CALENDAR_TYPE[
'group'] ? [$ownerId] : [],
426 if (isset(
$fields[
'fields'][
'CREATED_BY']))
434 if (!empty(
$fields[
'fields'][
'SECTION_ID']))
442 'entries' => $entries,
447 if (isset(
$fields[
'fields'][
'ATTENDEES']))
449 $query = EventTable::query()
451 ->registerRuntimeField(
455 EventTable::getEntity(),
456 Join::on(
'ref.PARENT_ID',
'this.PARENT_ID'),
457 [
'join_type' => Join::TYPE_LEFT]
460 ->where(
'DELETED',
'N')
461 ->where(
'EVENT_SECOND.DELETED',
'N')
462 ->where(
'CAL_TYPE',
$type)
464 ->whereIn(
'EVENT_SECOND.OWNER_ID',
$fields[
'fields'][
'ATTENDEES'])
485 if (
$type === Dictionary::CALENDAR_TYPE[
'group'] &&
$fields[
'presetId'] === self::PRESET_INVITED)
488 $filter[
'CAL_TYPE'] = [
'user',
'open_event'];
490 $query = EventTable::query()
492 ->registerRuntimeField(
496 EventTable::getEntity(),
497 Join::on(
'ref.ID',
'this.PARENT_ID'),
498 [
'join_type' => Join::TYPE_LEFT]
501 ->where(
'DELETED',
'N')
502 ->where(
'EVENT_SECOND.DELETED',
'N')
503 ->where(
'CAL_TYPE', Dictionary::CALENDAR_TYPE[
'user'])
504 ->where(
'EVENT_SECOND.CAL_TYPE',
$type)
506 ->where(
'EVENT_SECOND.OWNER_ID', $ownerId)
507 ->where(
'MEETING_STATUS', Dictionary::MEETING_STATUS[
'Question'])
530 $filter[(\CCalendarEvent::isFullTextIndexEnabled() ?
'*' :
'*%').
'SEARCHABLE_CONTENT'] = \CCalendarEvent::prepareToken(Emoji::encode(
$fields[
'search']));
533 $entries = \CCalendarEvent::GetList(
536 'fetchAttendees' =>
true,
537 'parseRecursion' => $parseRecursion,
538 'maxInstanceCount' => 50,
539 'preciseLimits' => $parseRecursion,
541 'fetchMeetings' =>
true,
542 'fetchSection' =>
true,
543 'setDefaultLimit' =>
false
546 if (
$fields[
'presetId'] !== self::PRESET_DECLINED)
553 'entries' => $entries,
573 if (
$type === Dictionary::CALENDAR_TYPE[
'group'] &&
$fields[
'presetId'] === self::PRESET_INVITED)
580 'ACTIVE_SECTION' =>
'Y',
583 $query = EventTable::query()
584 ->setSelect([
'PARENT_ID'])
585 ->registerRuntimeField(
589 EventTable::getEntity(),
590 Join::on(
'ref.PARENT_ID',
'this.ID'),
591 [
'join_type' => Join::TYPE_LEFT]
594 ->where(
'CAL_TYPE',
$type)
595 ->where(
'DELETED',
'N')
596 ->where(
'EVENT_SECOND.DELETED',
'N')
599 if (isset(
$fields[
'fields'][
'IS_MEETING']) &&
$fields[
'fields'][
'IS_MEETING'])
604 if (isset(
$fields[
'fields'][
'MEETING_STATUS']) &&
$fields[
'fields'][
'MEETING_STATUS'])
608 $fields[
'fields'][
'MEETING_STATUS'] ===
'H'
609 && !isset(
$fields[
'fields'][
'CREATED_BY'])
617 $query->where(
'EVENT_SECOND.MEETING_STATUS',
$fields[
'fields'][
'MEETING_STATUS']);
622 if (isset(
$fields[
'fields'][
'CREATED_BY']) && is_array(
$fields[
'fields'][
'CREATED_BY']))
624 $query->whereIn(
'EVENT_SECOND.MEETING_HOST',
$fields[
'fields'][
'CREATED_BY']);
627 if (isset(
$fields[
'fields'][
'SECTION_ID']) && is_array(
$fields[
'fields'][
'SECTION_ID']))
629 $query->whereIn(
'SECTION_ID',
$fields[
'fields'][
'SECTION_ID']);
632 if (isset(
$fields[
'fields'][
'ATTENDEES']) && is_array(
$fields[
'fields'][
'ATTENDEES']))
634 if (isset(
$fields[
'fields'][
'MEETING_STATUS']))
637 ->registerRuntimeField(
641 EventTable::getEntity(),
642 Join::on(
'ref.PARENT_ID',
'this.ID'),
643 [
'join_type' => Join::TYPE_LEFT]
646 ->whereIn(
'EVENT_THIRD.OWNER_ID',
$fields[
'fields'][
'ATTENDEES'])
651 $query->whereIn(
'EVENT_SECOND.OWNER_ID',
$fields[
'fields'][
'ATTENDEES']);
658 $filter[(\CCalendarEvent::isFullTextIndexEnabled() ?
'*' :
'*%').
'SEARCHABLE_CONTENT'] = \CCalendarEvent::prepareToken(
$fields[
'search']);
663 $eventsFromQuery =
$query->exec();
665 while (
$event = $eventsFromQuery->Fetch())
674 $entries = \CCalendarEvent::GetList(
677 'fetchAttendees' =>
true,
678 'parseRecursion' => $parseRecursion,
679 'maxInstanceCount' => 50,
680 'preciseLimits' => $parseRecursion,
682 'fetchMeetings' =>
true,
683 'fetchSection' =>
true,
684 'setDefaultLimit' =>
false
688 $entries = self::applyAccessRestrictions($entries);
693 'entries' => $entries,
705 $parseRecursion =
false;
708 if (isset(
$fields[
'fields'][
'DATE_FROM']))
710 $fromTs = \CCalendar::Timestamp(
$fields[
'fields'][
'DATE_FROM'],
true,
false);
711 $filter[
'FROM_LIMIT'] = \CCalendar::Date($fromTs,
false);
713 else if (!(
$filter[
'FROM_LIMIT'] ??
null))
715 $filter[
'FROM_LIMIT'] = \CCalendar::Date(time() - 31 * 12 * 24 * 3600,
false);
718 if (isset(
$fields[
'fields'][
'DATE_TO']))
720 $toTs = \CCalendar::Timestamp(
$fields[
'fields'][
'DATE_TO'],
true,
false);
721 $filter[
'TO_LIMIT'] = \CCalendar::Date($toTs,
false);
722 if ($fromTs && $toTs < $fromTs)
728 if ($fromTs && $toTs && $fromTs <= $toTs)
730 $parseRecursion =
true;
743 private static function applyAccessRestrictions(
array $events):
array
748 isset(
$event[
'IS_ACCESSIBLE_TO_USER'])
749 &&
$event[
'IS_ACCESSIBLE_TO_USER'] ===
false
756 return array_values($events);
762 $optionShowDeclined =
$settings[
'showDeclined'];
764 return array_values(array_filter($entries,
static function($entry) use ($optionShowDeclined) {
765 $hideDeclinedEntry = (!$optionShowDeclined || (int)$entry[
'OWNER_ID'] !== \CCalendar::GetUserId());
766 return !($hideDeclinedEntry && $entry[
'MEETING_STATUS'] ===
'N');
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static getFilterCompanyData(string $type, int $userId, int $ownerId, $fields)
static getFilterData(array $params)
static getSectionsForFilter(string $type, ?string $preset, ?int $ownerId, ?int $userId)
static getAvailableFields()
static getFilterId($type, $ownerId, $userId)
static getFilterUserData(string $type, int $userId, int $ownerId, $fields)
static filterByShowDeclined(array $entries)
static resolveFilterFields(string $filterId)
static setFilterId($filterId)
static getValues(int $userId, array $groupIds=[])
static getHiddenSections($userId=false, $options=[])
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
if(empty($signedUserToken)) $key
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']