• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/classes/general/calendar_reminder.php
  • Класс: CCalendarReminder
  • Вызов: CCalendarReminder::updateReminders
static function updateReminders($params = [])
{
	$eventId = (int)$params['id'];
	$entryFields = $params['arFields'];
	$reminders = $params['reminders'] ?? null;
	$userId = (int)$params['userId'];

	if (!$reminders)
	{
		$reminders = self::prepareReminder($entryFields['REMIND']);
	}

	$path = $params['path'];
	if (empty($path))
	{
		$path = CCalendar::GetPath($entryFields['CAL_TYPE'], $entryFields['OWNER_ID'], true);
	}
	$path = CHTTP::urlDeleteParams($path, ["action", "sessid", "bx_event_calendar_request", "EVENT_ID", "EVENT_DATE"]);
	$viewPath = CHTTP::urlAddParams($path, ['EVENT_ID' => $eventId]);

	$agentParams = [
		'eventId' => $eventId,
		'userId' => $entryFields["CREATED_BY"] ?? null,
		'viewPath' => $viewPath,
		'calendarType' => $entryFields["CAL_TYPE"] ?? null,
		'ownerId' => $entryFields["OWNER_ID"] ?? null
	];

	// 1. clean reminders
	self::RemoveAgent($agentParams);

	// Prevent dublication of reminders for non-user's calendar context (mantis:0128287)
	if (empty($entryFields['IS_MEETING']) || $entryFields['CAL_TYPE'] === 'user')
	{
		// 2. Set new reminders
		if (CCalendarEvent::CheckRecurcion($entryFields))
		{
			$entryList = CCalendarEvent::GetList(
				[
					'arFilter' => [
						"ID" => $eventId,
						"DELETED" => "N",
						"FROM_LIMIT" => CCalendar::Date(time() - 3600, false),
						"TO_LIMIT" => CCalendar::GetMaxDate()
					],
					'userId' => $userId,
					'parseRecursion' => true,
					'maxInstanceCount' => 4,
					'preciseLimits' => true,
					'fetchAttendees' => true,
					'checkPermissions' => false,
					'setDefaultLimit' => false
				]
			);

			if (is_array($entryList))
			{
				$index = 0;
				foreach ($entryList as $entry)
				{
					$eventTimestamp = CCalendar::Timestamp($entry['DATE_FROM'], false, true);
					$eventTimestamp = $eventTimestamp - CCalendar::GetTimezoneOffset(
							$entry["TZ_FROM"],
							$eventTimestamp
						) + date("Z", $eventTimestamp);

					// List of added timestamps of reminders to avoid duplication
					$addedIndex = [];
					foreach ($reminders as $reminder)
					{
						$reminderTimestamp = self::getReminderTimestamp(
							$eventTimestamp,
							$reminder,
							$entryFields['TZ_FROM'] ?? null
						);

						$limitTime = !empty($params['updateRecursive'])
							? time() + self::REMINDER_NEXT_DELAY
							: time() - self::REMINDER_INACCURACY;

						if (
							!is_null($reminderTimestamp)
							&& !in_array($reminderTimestamp, $addedIndex)
							&& $reminderTimestamp >= $limitTime
						)
						{
							$agentParams['index'] = $index++;
							if ($reminder['type'] === self::TYPE_SPECIFIC_DATETIME)
							{
								unset($agentParams['index']);
							}
							self::AddAgent(CCalendar::Date($reminderTimestamp), $agentParams);
							$addedIndex[] = $reminderTimestamp;
						}
					}
				}
			}
		}
		else
		{
			// Start of the event in server timezone
			$eventTimestamp = $entryFields['DATE_FROM_TS_UTC'] + date("Z", $entryFields['DATE_FROM_TS_UTC']);
			$index = 0;
			// List of added timestamps of reminders to avoid duplication
			$addedIndex = [];
			foreach ($reminders as $reminder)
			{
				$reminderTimestamp = self::getReminderTimestamp(
					$eventTimestamp,
					$reminder,
					$entryFields['TZ_FROM'] ?? null
				);

				if (
					!is_null($reminderTimestamp)
					&& !in_array($reminderTimestamp, $addedIndex)
					&& $reminderTimestamp >= time() + self::REMINDER_INACCURACY
				)
				{
					$agentParams['index'] = $index++;
					self::AddAgent(CCalendar::Date($reminderTimestamp), $agentParams);
					$addedIndex[] = $reminderTimestamp;
				}
			}
		}
	}
}