• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/lib/controller/calendarajax.php
  • Класс: BitrixCalendarControllerCalendarAjax
  • Вызов: CalendarAjax::changeRecurciveEntryUntilAction
public function changeRecurciveEntryUntilAction($entryId, $untilDate)
{
	$response = ['result' => false];

	$event = CCalendarEvent::GetById((int)$entryId);
	$untilTimestamp = CCalendar::Timestamp($untilDate);
	$recId = false;

	if ($event)
	{
		if (CCalendarEvent::CheckRecurcion($event))
		{
			$event['RRULE'] = CCalendarEvent::ParseRRULE($event['RRULE']);
			$event['RRULE']['UNTIL'] = CCalendar::Date($untilTimestamp, false);
			if (isset($event['RRULE']['COUNT']))
			{
				unset($event['RRULE']['COUNT']);
			}

			$id = CCalendar::SaveEvent([
				'arFields' => [
					"ID" => $event["ID"],
					"RRULE" => $event['RRULE']
				],
				'silentErrorMode' => false,
				'recursionEditMode' => 'skip',
				'editParentEvents' => true,
				'editEntryUntil' => true,
			]);
			$recId = $event["ID"];
			$response['id'] = $id;
		}

		if ($event["RECURRENCE_ID"] > 0)
		{
			$recParentEvent = CCalendarEvent::GetById($event["RECURRENCE_ID"]);
			if ($recParentEvent && CCalendarEvent::CheckRecurcion($recParentEvent))
			{
				$recParentEvent['RRULE'] = CCalendarEvent::ParseRRULE($recParentEvent['RRULE']);

				if (
					$recParentEvent['RRULE']['UNTIL']
					&& CCalendar::Timestamp($recParentEvent['RRULE']['UNTIL']) > $untilTimestamp
				)
				{
					$recParentEvent['RRULE']['UNTIL'] = CCalendar::Date($untilTimestamp, false);

					if (isset($recParentEvent['RRULE']['COUNT']))
					{
						unset($recParentEvent['RRULE']['COUNT']);
					}

					$id = CCalendar::SaveEvent([
						'arFields' => [
							"ID" => $recParentEvent["ID"],
							"RRULE" => $recParentEvent['RRULE']
						],
						'silentErrorMode' => false,
						'recursionEditMode' => 'skip',
						'editParentEvents' => true,
						'editEntryUntil' => true,
					]);
					$response['id'] = $id;
				}
			}

			$recId = $event["RECURRENCE_ID"];
		}

		if ($recId)
		{
			$recRelatedEvents = CCalendarEvent::GetEventsByRecId($recId, false);
			foreach ($recRelatedEvents as $ev)
			{
				if (CCalendar::Timestamp($ev['DATE_FROM']) > $untilTimestamp)
				{
					CCalendar::DeleteEvent((int)$ev['ID'], true, ['recursionMode' => 'this']);
				}
			}
		}

		$response['result'] = true;
	}

	if ($response['result'] !== true)
	{
		$this->addError(new Error('[ed01]' . Loc::getMessage('EC_EVENT_DEL_ERROR'),
			'change_recurcive_entry_until'));
	}

	return $response;
}