13 public static function ReminderAgent($eventId = 0,
$userId = 0, $viewPath =
'', $calendarType =
'', $ownerId = 0, $index = 0)
25 $events = CCalendarEvent::GetList([
29 "FROM_LIMIT" => CCalendar::Date($nowTime - 3600,
false),
30 "TO_LIMIT" => CCalendar::GetMaxDate(),
31 "ACTIVE_SECTION" =>
"Y"
34 'parseRecursion' =>
true,
35 'maxInstanceCount' => 3,
36 'preciseLimits' =>
true,
37 'fetchAttendees' =>
false,
38 'checkPermissions' =>
false,
39 'setDefaultLimit' =>
false
42 if ($events && is_array($events[0]))
49 $fromTs = CCalendar::Timestamp(
$event[
'DATE_FROM'],
false,
$event[
'DT_SKIP_TIME'] !==
'Y');
50 if (
$event[
'DT_SKIP_TIME'] !==
'Y')
52 $fromTs -=
$event[
'~USER_OFFSET_FROM'];
55 if (empty($calendarType))
57 $calendarType =
$event[
'CAL_TYPE'];
60 $viewPathUri = (new \Bitrix\Main\Web\Uri($viewPath))
61 ->deleteParams([
'EVENT_DATE'])
62 ->addParams([
'EVENT_DATE' => CCalendar::Date($fromTs,
false)])
67 'entryId' => $eventId,
68 'entryName' =>
$event[
'NAME'],
70 'calendarType' => $calendarType,
73 'dateFrom' => CCalendar::Date($fromTs,
$event[
'DT_SKIP_TIME'] !==
'Y',
true,
true),
74 'viewPath' => $viewPathUri->getUri(),
78 CIMNotify::Add($notificationFields);
83 'eventId' => $eventId,
85 'viewPath' => $viewPathUri->getUri(),
86 'calType' => $calendarType,
91 if (CCalendarEvent::CheckRecurcion(
$event))
97 'path' => $viewPathUri->getUri(),
98 'updateRecursive' =>
true
103 CCalendar::SetOffset(
false,
null);
238 $entryFields =
$params[
'arFields'];
239 $reminders =
$params[
'reminders'] ??
null;
241 $ownerId = $entryFields[
'OWNER_ID'] ?? $entryFields[
'CREATED_BY'] ??
null;
248 $path = CCalendar::GetPathForCalendarEx($ownerId);
250 $viewPath = (new \Bitrix\Main\Web\Uri(
$path))
251 ->deleteParams([
"action",
"sessid",
"bx_event_calendar_request",
"EVENT_ID",
"EVENT_DATE"])
252 ->addParams([
'EVENT_ID' => $eventId])
256 'eventId' => $eventId,
257 'userId' => $ownerId,
258 'viewPath' => $viewPath->getUri(),
259 'calendarType' => $entryFields[
"CAL_TYPE"] ??
null,
260 'ownerId' => $entryFields[
"OWNER_ID"] ?? null
267 if ($entryFields[
'CAL_TYPE'] ===
'user')
270 if (CCalendarEvent::CheckRecurcion($entryFields))
272 $entryList = CCalendarEvent::GetList(
277 "FROM_LIMIT" => CCalendar::Date(time() - 3600,
false),
278 "TO_LIMIT" => CCalendar::GetMaxDate()
280 'arSelect' => CCalendarEvent::$defaultSelectEvent,
282 'parseRecursion' =>
true,
283 'maxInstanceCount' => 4,
284 'preciseLimits' =>
true,
285 'fetchAttendees' =>
false,
286 'checkPermissions' =>
false,
287 'setDefaultLimit' =>
false
291 if (is_array($entryList))
294 foreach ($entryList as $entry)
296 $eventTimestamp = CCalendar::Timestamp($entry[
'DATE_FROM'],
false,
true);
297 $eventTimestamp = $eventTimestamp - CCalendar::GetTimezoneOffset($entry[
"TZ_FROM"], $eventTimestamp) + (int)date(
"Z", $eventTimestamp);
306 $entryFields[
'TZ_FROM'] ??
null
309 $limitTime = !empty(
$params[
'updateRecursive'])
310 ? time() + self::REMINDER_NEXT_DELAY
311 : time() - self::REMINDER_INACCURACY;
314 !is_null($reminderTimestamp)
315 && !in_array($reminderTimestamp, $addedIndex)
316 && $reminderTimestamp >= $limitTime
319 $agentParams[
'index'] = $index++;
320 if (
$reminder[
'type'] === self::TYPE_SPECIFIC_DATETIME)
322 unset($agentParams[
'index']);
324 self::AddAgent(\CCalendar::Date($reminderTimestamp), $agentParams);
325 $addedIndex[] = $reminderTimestamp;
334 $eventTimestamp = $entryFields[
'DATE_FROM_TS_UTC'] + (int)date(
"Z", $entryFields[
'DATE_FROM_TS_UTC']);
343 $entryFields[
'TZ_FROM'] ??
null
347 !is_null($reminderTimestamp)
348 && !in_array($reminderTimestamp, $addedIndex)
349 && $reminderTimestamp >= time() + self::REMINDER_INACCURACY
352 $agentParams[
'index'] = $index++;
353 self::AddAgent(\CCalendar::Date($reminderTimestamp), $agentParams);
354 $addedIndex[] = $reminderTimestamp;
387 $reminderTimestamp =
null;
393 if (in_array(
$type, self::SIMPLE_TYPE_LIST,
true))
405 $reminderTimestamp = $eventTimestamp -
$delta;
410 $hour = floor((
int)
$reminder[
'time'] / 60);
411 $min = (int)(
$reminder[
'time'] - $hour * 60);
413 $reminderTimestamp = mktime($hour, $min, 0, date(
"m", $eventTimestamp), date(
"d", $eventTimestamp) - $daysBefore, date(
"Y", $eventTimestamp));
417 $timezoneServerOffset = \CCalendar::GetTimezoneOffset($timezoneName, $eventTimestamp) - date(
"Z", $eventTimestamp);
418 $reminderTimestamp -= $timezoneServerOffset;
423 $reminderTimestamp = \CCalendar::Timestamp(
$reminder[
'value'],
false,
true);
424 $reminderTimestamp = $reminderTimestamp - \CCalendar::GetTimezoneOffset($timezoneName, $reminderTimestamp) + (int)date(
"Z", $reminderTimestamp);
428 return $reminderTimestamp;
438 if (is_array($remindValue))
440 if (isset($remindValue[
'type']) && in_array($remindValue[
'type'], self::SIMPLE_TYPE_LIST,
true))
443 'type' => $remindValue[
'type'],
444 'count' => (int)$remindValue[
'count']
447 elseif ($remindValue[
'type'] === self::TYPE_DAY_BEFORE)
450 'type' => $remindValue[
'type'],
451 'before' => (int)$remindValue[
'before'],
452 'time' => (
int)$remindValue[
'time']
455 elseif ($remindValue[
'type'] === self::TYPE_SPECIFIC_DATETIME)
458 'type' => $remindValue[
'type'],
459 'value' => \CCalendar::Date(\CCalendar::Timestamp($remindValue[
'value']))
465 $explodedValue = explode(
'|', $remindValue);
466 if (
count($explodedValue) > 1)
468 if ($explodedValue[0] === self::TYPE_DAY_BEFORE)
471 'type' => self::TYPE_DAY_BEFORE,
472 'before' => (int)$explodedValue[1],
473 'time' => (
int)$explodedValue[2]
476 elseif($explodedValue[0] === self::TYPE_SPECIFIC_DATETIME)
479 'type' => self::TYPE_SPECIFIC_DATETIME,
480 'value' => \CCalendar::Date(\CCalendar::Timestamp($explodedValue[1]))
488 'count' => (int)$remindValue
495 usort($reminderList, [
'CCalendarReminder',
'sortReminder']);
497 return $reminderList;