33 $this->userId =
$userId ?? (int)CurrentUser::get()->getId();
41 $query = EventTable::query()
43 Query::expr(
'MIN_TS')->min(
'DATE_FROM_TS_UTC'),
44 Query::expr(
'MAX_TS')->max(
'DATE_TO_TS_UTC'),
55 'from' => gmmktime(0, 0, 0, 1, 1, 2038),
68 $query = EventTable::query();
73 $eventCollection =
$query->fetchCollection();
75 return $this->prepareResult($eventCollection,
$filter);
100 $query->where(
'CAL_TYPE', Dictionary::CALENDAR_TYPE[
'open_event']);
102 if (!empty(
$filter->categoriesIds))
104 $query->registerRuntimeField(
107 OpenEventOptionTable::getEntity(),
108 Join::on(
'this.ID',
'ref.EVENT_ID')
109 ->whereIn(
'ref.CATEGORY_ID',
$filter->categoriesIds),
111 ->configureJoinType(Join::TYPE_INNER),
116 $query->registerRuntimeField(
119 OpenEventOptionTable::getEntity(),
120 Join::on(
'this.ID',
'ref.EVENT_ID'),
125 $query->registerRuntimeField(
128 OpenEventCategoryAttendeeTable::getEntity(),
129 Join::on(
'this.EVENT_OPTIONS.CATEGORY_ID',
'ref.CATEGORY_ID')
130 ->whereIn(
'ref.USER_ID', [Common::SYSTEM_USER_ID, $this->userId])
132 ->configureJoinType(Join::TYPE_INNER)
140 (
int)\CCalendar::Timestamp(
$filter->fromDate,
false) - $this->getUserOffset()
149 (
int)\CCalendar::Timestamp(
$filter->toDate,
false) - $this->getUserOffset()
153 if (!empty(
$filter->creatorId))
158 if (
$filter->iAmAttendee ===
true)
160 $query->registerRuntimeField(
163 EventAttendeeTable::getEntity(),
164 Join::on(
'this.ID',
'ref.EVENT_ID')
165 ->where(
'ref.OWNER_ID', $this->userId)
166 ->where(
'ref.MEETING_STATUS',
'Y')
169 ->configureJoinType(Join::TYPE_INNER)
174 if (
$filter->iAmAttendee ===
false)
176 $query->registerRuntimeField(
179 EventAttendeeTable::getEntity(),
180 Join::on(
'this.ID',
'ref.EVENT_ID')
181 ->where(
'ref.OWNER_ID', $this->userId)
182 ->where(
'ref.MEETING_STATUS',
'Y')
186 $query->whereNull(
'ATTENDEE.EVENT_ID');
191 $value = \CCalendarEvent::prepareToken(Emoji::encode(
$filter->query));
193 if (\CCalendarEvent::isFullTextIndexEnabled())
196 $query->whereMatch(
'SEARCHABLE_CONTENT', $searchText);
200 $query->whereLike(
'SEARCHABLE_CONTENT',
'%' . $value .
'%');
214 if ($eventCollection->isEmpty())
219 $eventIds = $eventCollection->getIdList();
220 $sectionIds = array_unique($eventCollection->getSectionIdList());
221 $categoryIds = array_unique(
222 array_map(fn (
$event) =>
$event->get(
'EVENT_OPTIONS')?->getCategoryId(), $eventCollection->getAll()),
224 $threadIds = array_unique(
225 array_map(fn (
$event) =>
$event->get(
'EVENT_OPTIONS')?->getThreadId(), $eventCollection->getAll()),
232 $categories = (
new CategoryProvider())->getCategoryCollection($categoryIds);
233 $categoriesChannelIds = array_combine($categories->getIdList(), $categories->getChannelIdList());
234 $categoriesNames = array_combine($categories->getIdList(), $categories->getNameList());
236 $commentsCounts = Im\Comments::getCounts($threadIds);
241 foreach ($eventCollection as
$event)
243 $eventId =
$event->getId();
248 $eventOptions =
$event->get(
'EVENT_OPTIONS');
254 $eventCommentsCount = isset($commentsCounts[$eventOptions->getThreadId()])
255 ? (int)$commentsCounts[$eventOptions->getThreadId()] - 1
259 $dateFrom =
$event->getDateFrom()->format(
'd.m.Y');
260 $dateTo =
$event->getDateTo()->format(
'd.m.Y');
261 $dateFromTs = (
new DateTime($dateFrom,
'd.m.Y',
new \DateTimeZone(
'UTC')))->getTimestamp();
262 $dateToTs = (
new DateTime($dateTo,
'd.m.Y',
new \DateTimeZone(
'UTC')))->getTimestamp();
263 if (!
$event->getDtSkipTime())
269 $events[] =
new OpenEvent(
272 dateFromTs: $dateFromTs,
274 isFullDay:
$event->getDtSkipTime(),
275 isAttendee: in_array($eventId, $attendedEventIds,
true),
276 attendeesCount: $eventOptions->getAttendeesCount(),
277 creatorId:
$event->getCreatedBy(),
278 eventOptions: EventOptionsDto::fromArray(json_decode($eventOptions->getOptions(),
true)),
279 categoryId: $eventOptions->getCategoryId(),
280 categoryName: $categoriesNames[$eventOptions->getCategoryId()],
281 categoryChannelId: $categoriesChannelIds[$eventOptions->getCategoryId()],
283 commentsCount: $eventCommentsCount,
284 threadId: $eventOptions->getThreadId(),
286 rrule:
$event->getRrule(),
287 rruleDescription: \CCalendarEvent::GetRRULEDescription([
288 'RRULE' =>
$event->getRrule(),
289 'DATE_FROM' =>
$event->getDateFrom()->toString(),
290 'DT_SKIP_TIME' =>
$event->getDtSkipTime() ?
'Y' :
'N',
292 exdate:
$event->getExdate(),
301 if (
$filter->iAmAttendee ===
true)
306 if (
$filter->iAmAttendee ===
false)
311 $attendees = EventAttendeeTable::query()
312 ->setSelect([
'OWNER_ID',
'EVENT_ID'])
313 ->where(
'OWNER_ID', $this->userId)
314 ->whereIn(
'EVENT_ID', $eventIds)
315 ->where(
'MEETING_STATUS',
'Y')
319 return $attendees->getEventIdList();
324 $sectionsQuery = SectionTable::query()
325 ->setSelect([
'ID',
'COLOR'])
326 ->whereIn(
'ID', $sectionIds)
329 $sections = $sectionsQuery->fetchCollection();
331 return array_combine($sections->getIdList(), $sections->getColorList());
static matchAgainstWildcard($phrase, $wildcard=' *', $minTokenSize=null)