• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/lib/controller/calendarentryajax.php
  • Класс: BitrixCalendarControllerCalendarEntryAjax
  • Вызов: CalendarEntryAjax::moveEventAction
public function moveEventAction()
{
	$request = $this->getRequest();
	$userId = CCalendar::getCurUserId();
	$id = (int)$request->getPost('id');
	$sectionId = (int)$request->getPost('section');

	if ($id)
	{
		$eventModel = CCalendarEvent::getEventModelForPermissionCheck($id, [], $userId);
	}
	else
	{
		$section = CCalendarSect::GetById($sectionId);

		$eventModel =
			EventModel::createNew()
				->setOwnerId((int)($section['OWNER_ID'] ?? 0))
				->setSectionId($sectionId ?? 0)
				->setSectionType($section['TYPE'] ?? '')
		;
	}
	$accessController = new EventAccessController($userId);
	if (
		(!$id && !$accessController->check(ActionDictionary::ACTION_EVENT_ADD, $eventModel))
		|| ($id && !$accessController->check(ActionDictionary::ACTION_EVENT_EDIT, $eventModel))
	)
	{
		$this->addError(new Error(Loc::getMessage('EC_ACCESS_DENIED'), 'move_entry_access_denied'));
	}

	$sectionList = InternalsSectionTable::getList([
		   'filter' => [
			   '=ACTIVE' => 'Y',
			   '=ID' => $sectionId
		   ],
		   'select' => [
			   'ID',
			   'CAL_TYPE',
			   'OWNER_ID',
			   'NAME'
		   ]
	   ]
	);

	if (!($section = $sectionList->fetch()))
	{
		$this->addError(new Error(Loc::getMessage('EC_SECTION_NOT_FOUND'), 'edit_entry_section_not_found'));
	}

	if (
		$section['CAL_TYPE'] !== 'group'
		&& Loader::includeModule('intranet') && !IntranetUtil::isIntranetUser($userId)
	)
	{
		$this->addError(new Error(Loc::getMessage('EC_ACCESS_DENIED'), 'edit_entry_extranet_access_denied'));
	}


	if (empty($this->getErrors()))
	{
		$entry = InternalsEventTable::getList(
			[
				"filter" => [
					"=ID" => $id,
					"=DELETED" => 'N',
					"=SECTION_ID" => $sectionId
				],
				"select" => ["ID", "CAL_TYPE"]
			]
		)->fetch();

		if (Loader::includeModule('intranet'))
		{
			if ($entry['CAL_TYPE'] !== 'group' && !IntranetUtil::isIntranetUser($userId))
			{
				$this->addError(new Error(Loc::getMessage('EC_ACCESS_DENIED'), 'edit_entry_extranet_access_denied'));
			}
		}
	}

	$requestUid = (int)$request->getPost('requestUid');
	$reload = $request->getPost('recursive') === 'Y';
	$sendInvitesToDeclined = $request->getPost('sendInvitesAgain') === 'Y';
	$skipTime = $request->getPost('skip_time') === 'Y';
	$dateFrom = $request->getPost('date_from');
	$dateTo = $request->getPost('date_to');
	$timezone = $request->getPost('timezone');
	$attendees = $request->getPost('attendees');
	$location = trim((string) $request->getPost('location'));
	$isPlannerFeatureEnabled = Bitrix24Manager::isPlannerFeatureEnabled();

	$locationBusyWarning = false;
	$busyWarning = false;

	if (empty($this->getErrors()))
	{
		$arFields = [
			"ID" => $id,
			"DATE_FROM" => CCalendar::Date(CCalendar::Timestamp($dateFrom), !$skipTime),
			"SKIP_TIME" => $skipTime
		];

		if (!empty($dateTo))
		{
			$arFields["DATE_TO"] = CCalendar::Date(CCalendar::Timestamp($dateTo), !$skipTime);
		}

		if (!$skipTime && $request->getPost('set_timezone') === 'Y' && $timezone)
		{
			$arFields["TZ_FROM"] = $timezone;
			$arFields["TZ_TO"] = $timezone;
		}

		if (
			$isPlannerFeatureEnabled
			&& !empty($location)
			&& !RoomsAccessibilityManager::checkAccessibility($location, ['fields' => $arFields])
		)
		{
			$locationBusyWarning = true;
			$reload = true;
		}

		if (
			$isPlannerFeatureEnabled
			&& is_array($attendees)
			&& $request->getPost('is_meeting') === 'Y'
		)
		{
			$timezoneName = CCalendar::GetUserTimezoneName(CCalendar::GetUserId());
			$timezoneOffset = Util::getTimezoneOffsetUTC($timezoneName);
			$timestampFrom = CCalendar::TimestampUTC($arFields["DATE_FROM"]) - $timezoneOffset;
			$timestampTo = CCalendar::TimestampUTC($arFields["DATE_TO"]) - $timezoneOffset;
			if (!empty($this->getBusyUsersIds($attendees, $id, $timestampFrom, $timestampTo)))
			{
				$busyWarning = true;
				$reload = true;
			}
		}

		if (!$busyWarning && !$locationBusyWarning)
		{
			if ($request->getPost('recursive') === 'Y')
			{
				CCalendar::SaveEventEx(
					[
						'arFields' => $arFields,
						'silentErrorMode' => false,
						'recursionEditMode' => 'this',
						'currentEventDateFrom' => CCalendar::Date(
							CCalendar::Timestamp($request->getPost('current_date_from')),
							false
						),
						'sendInvitesToDeclined' => $sendInvitesToDeclined,
						'requestUid' => $requestUid
					]
				);
			}
			else
			{
				$id = CCalendar::SaveEvent(
					[
						'arFields' => $arFields,
						'silentErrorMode' => false,
						'sendInvitesToDeclined' => $sendInvitesToDeclined,
						'requestUid' => $requestUid
					]
				);
			}
		}
	}

	return [
		'id' => $id,
		'reload' => $reload,
		'busy_warning' => $busyWarning,
		'location_busy_warning' => $locationBusyWarning
	];
}