104 $monthFrom = (int)
$request->getPost(
'month_from');
105 $yearFrom = (int)
$request->getPost(
'year_from');
106 $monthTo = (int)
$request->getPost(
'month_to');
107 $yearTo = (int)
$request->getPost(
'year_to');
108 $ownerId = (int)
$request->getPost(
'ownerId');
109 $calendarType =
$request->getPost(
'type');
112 if (!in_array(
$direction, [self::DIRECTION_PREVIOUS, self::DIRECTION_NEXT, self::DIRECTION_BOTH],
true))
117 $activeSectionIds = is_array(
$request->getPost(
'active_sect'))
120 $additionalSectionIds = is_array(
$request->getPost(
'sup_sect'))
125 $limits = \CCalendarEvent::getLimitDates($yearFrom, $monthFrom, $yearTo, $monthTo);
127 $connections =
false;
131 foreach(array_unique(array_merge($activeSectionIds, $additionalSectionIds)) as $sectId)
133 if ($sectId ===
'tasks')
139 $sectionIdList[] = (int)$sectId;
143 $userId = \CCalendar::GetUserId();
145 $isExtranetUser = Loader::includeModule(
'intranet') && !Intranet\Util::isIntranetUser(
$userId);
147 if (!empty($sectionIdList))
149 $sect = \CCalendarSect::GetList([
151 'ID' => $sectionIdList,
154 'checkPermissions' =>
true,
156 foreach($sect as $section)
158 if ($isExtranetUser && $section[
'CAL_TYPE'] === Dictionary::CALENDAR_TYPE[
'location'])
162 $sections[] = (int)$section[
'ID'];
166 $isBoundaryOfPastReached =
false;
167 $isBoundaryOfFutureReached =
false;
169 if (!empty($sections))
171 $entries = $this->
getEntries($sections, $limits);
178 $isBoundaryOfPastReached =
true;
179 $isBoundaryOfFutureReached =
true;
185 $entries = $this->
getEntries($sections, $limits);
187 if (!empty($entries))
190 $timestamp = strtotime($earliestEvent[
'DATE_FROM']);
191 if($timestamp < strtotime(
"01.$monthFrom.$yearFrom"))
193 $yearFrom = (int)date(
'Y', $timestamp);
194 $monthFrom = (int)date(
'm', $timestamp);
198 $timestamp = strtotime($latestEvent[
'DATE_FROM']);
199 if($timestamp > strtotime(
"01.$monthTo.$yearTo"))
201 $yearTo = (int)date(
'Y', $timestamp);
202 $monthTo = (int)date(
'm', $timestamp);
215 $entries = $this->
getEntries($sections, \CCalendarEvent::getLimitDates($yearFrom, $monthFrom, $yearTo, $monthTo));
221 $limits = \CCalendarEvent::getLimitDates($yearFrom, $monthFrom, $yearTo, $monthTo);
222 $entries = $this->
getEntries($sections, $limits);
226 $isBoundaryOfPastReached =
true;
228 $limits[
'from'] =
false;
229 $entries = $this->
getEntries($sections, $limits);
231 if (!empty($entries))
234 $timestamp = strtotime($earliestEvent[
'DATE_FROM']);
235 $yearFrom = (int)date(
'Y', $timestamp);
236 $monthFrom = (int)date(
'm', $timestamp);
249 $entries = $this->
getEntries($sections, \CCalendarEvent::getLimitDates($yearFrom, $monthFrom, $yearTo, $monthTo));
255 $limits = \CCalendarEvent::getLimitDates($yearFrom, $monthFrom, $yearTo, $monthTo);
256 $entries = $this->
getEntries($sections, $limits);
260 $isBoundaryOfFutureReached =
true;
262 $limits[
'to'] =
false;
263 $entries = $this->
getEntries($sections, $limits);
265 if (!empty($entries))
268 $timestamp = strtotime($latestEvent[
'DATE_FROM']);
269 $yearTo = (int)date(
'Y', $timestamp);
270 $monthTo = (int)date(
'm', $timestamp);
279 foreach ($entries as
$key => $entry)
281 $eventModel = EventModel::createFromArray($entry);
282 $canEditEventInParentSection =
$accessController->check(ActionDictionary::ACTION_EVENT_EDIT, $eventModel);
283 $canEditEventInCurrentSection =
$accessController->check(ActionDictionary::ACTION_EVENT_EDIT, $eventModel, [
284 'checkCurrentEvent' =>
'Y',
286 $entries[
$key][
'permissions'] = [
287 'edit' => $canEditEventInParentSection && $canEditEventInCurrentSection,
288 'edit_attendees' =>
$accessController->check(ActionDictionary::ACTION_EVENT_EDIT_ATTENDEES, $eventModel),
289 'edit_location' =>
$accessController->check(ActionDictionary::ACTION_EVENT_EDIT_LOCATION, $eventModel),
296 $tasksEntries = \CCalendar::getTaskList(
298 ->setType($calendarType)
299 ->setOwnerId($ownerId)
302 if (!empty($tasksEntries))
304 $entries = array_merge($entries, $tasksEntries);
309 'entries' => $entries,
310 'userIndex' => \CCalendarEvent::getUserIndex(),
311 'isBoundaryOfPastReached' => $isBoundaryOfPastReached,
312 'isBoundaryOfFutureReached' => $isBoundaryOfFutureReached,
314 if (is_array($connections))
320 (
int)
$request->getPost(
'month_from') !== $monthFrom
321 || (
int)
$request->getPost(
'year_from') !== $yearFrom
329 (
int)
$request->getPost(
'month_to') !== $monthTo
330 || (
int)
$request->getPost(
'year_to') !== $yearTo
441 $userId = \CCalendar::getCurUserId();
443 $sectionId = (int)
$request->getPost(
'section');
447 $eventModel = \CCalendarEvent::getEventModelForPermissionCheck(
454 $section = \CCalendarSect::GetById($sectionId);
457 EventModel::createNew()
458 ->setOwnerId((
int)($section[
'OWNER_ID'] ?? 0))
459 ->setSectionId($sectionId ?? 0)
460 ->setSectionType($section[
'TYPE'] ??
'')
465 (!$id && !
$accessController->check(ActionDictionary::ACTION_EVENT_ADD, $eventModel))
466 || ($id && !
$accessController->check(ActionDictionary::ACTION_EVENT_EDIT, $eventModel))
469 $this->
addError(
new Error(Loc::getMessage(
'EC_ACCESS_DENIED'),
'move_entry_access_denied'));
472 $sectionList = Internals\SectionTable::getList([
486 if (!($section = $sectionList->fetch()))
488 $this->
addError(
new Error(Loc::getMessage(
'EC_SECTION_NOT_FOUND'),
'edit_entry_section_not_found'));
492 $section[
'CAL_TYPE'] !==
'group'
493 && Loader::includeModule(
'intranet') && !Intranet\Util::isIntranetUser(
$userId)
496 $this->
addError(
new Error(Loc::getMessage(
'EC_ACCESS_DENIED'),
'edit_entry_extranet_access_denied'));
502 $entry = Internals\EventTable::getList(
507 "=SECTION_ID" => $sectionId,
509 "select" => [
"ID",
"CAL_TYPE"],
513 if (Loader::includeModule(
'intranet'))
515 if ($entry[
'CAL_TYPE'] !==
'group' && !Intranet\Util::isIntranetUser(
$userId))
517 $this->
addError(
new Error(Loc::getMessage(
'EC_ACCESS_DENIED'),
'edit_entry_extranet_access_denied'));
522 $requestUid = (int)
$request->getPost(
'requestUid');
523 $reload =
$request->getPost(
'recursive') ===
'Y';
524 $sendInvitesToDeclined =
$request->getPost(
'sendInvitesAgain') ===
'Y';
525 $skipTime =
$request->getPost(
'skip_time') ===
'Y';
526 $dateFrom =
$request->getPost(
'date_from');
527 $dateTo =
$request->getPost(
'date_to');
528 $timezone =
$request->getPost(
'timezone');
529 $attendees =
$request->getPost(
'attendees');
531 $isPlannerFeatureEnabled = Bitrix24Manager::isPlannerFeatureEnabled();
533 $locationBusyWarning =
false;
534 $busyWarning =
false;
540 "DATE_FROM" => \CCalendar::Date(\CCalendar::Timestamp($dateFrom), !$skipTime),
541 "SKIP_TIME" => $skipTime,
546 $arFields[
"DATE_TO"] = \CCalendar::Date(\CCalendar::Timestamp($dateTo), !$skipTime);
549 if (!$skipTime &&
$request->getPost(
'set_timezone') ===
'Y' && $timezone)
556 $isPlannerFeatureEnabled
561 $locationBusyWarning =
true;
566 $isPlannerFeatureEnabled
567 && is_array($attendees)
568 &&
$request->getPost(
'is_meeting') ===
'Y'
571 $timezoneName = \CCalendar::GetUserTimezoneName(\CCalendar::GetUserId());
573 $timestampFrom = \CCalendar::TimestampUTC(
$arFields[
"DATE_FROM"]) - $timezoneOffset;
574 $timestampTo = \CCalendar::TimestampUTC(
$arFields[
"DATE_TO"]) - $timezoneOffset;
575 if (!empty($this->getBusyUsersIds($attendees, $id, $timestampFrom, $timestampTo)))
582 if (!$busyWarning && !$locationBusyWarning)
584 if (
$request->getPost(
'recursive') ===
'Y')
586 \CCalendar::SaveEventEx(
589 'silentErrorMode' =>
false,
590 'recursionEditMode' =>
'this',
591 'currentEventDateFrom' => \CCalendar::Date(
592 \CCalendar::Timestamp(
$request->getPost(
'current_date_from')),
595 'sendInvitesToDeclined' => $sendInvitesToDeclined,
596 'requestUid' => $requestUid,
602 $id = \CCalendar::SaveEvent(
605 'silentErrorMode' =>
false,
606 'sendInvitesToDeclined' => $sendInvitesToDeclined,
607 'requestUid' => $requestUid,
617 'busy_warning' => $busyWarning,
618 'location_busy_warning' => $locationBusyWarning,
626 $id = (int)(
$request[
'id'] ??
null);
627 $userId = \CCalendar::getCurUserId();
636 $command = $this->getUpdateCommand(
$request);
641 $command = $this->getCreateCommand(
$request);
649 $this->
addError(
new Error(Loc::getMessage(
'EC_ACCESS_DENIED'),
'edit_entry_access_denied'));
653 $this->
addError(
new Error(Loc::getMessage(
'EC_SECTION_NOT_FOUND'),
'edit_entry_section_not_found'));
657 $this->
addError(
new Error(Loc::getMessage(
'EC_ACCESS_DENIED'),
'edit_entry_extranet_access_denied'));
661 $this->
addError(
new Error(Loc::getMessage(
'EC_JS_EV_FROM_ERR')));
665 $this->
addError(
new Error(Loc::getMessage(
'EC_LOCATION_BUSY'),
'edit_entry_location_busy'));
670 new Error(Loc::getMessage(
'EC_USER_BUSY', [
'#USER#' => $e->getAttendeeName()]),
'edit_entry_user_busy')
672 $response[
'busyUsersList'] = $e->getBusyUsersList();
676 $this->
addError(
new Error(Loc::getMessage(
'EC_JS_EV_SAVE_ERR'),
'edit_entry_save'));
680 $this->
addError(
new Error(
'Event not found',
'edit_entry_event_not_found'));
684 $this->
addError(
new Error(Loc::getMessage(
'EC_LOCATION_BUSY_RECURRENCE'),
'edit_entry_location_busy_recurrence'));
685 $this->
addError(
new Error($e->getMessage(),
'edit_entry_location_repeat_busy'));
689 $this->
addError(
new Error(
'MAX ATTENDEES_REACHED',
'edit_entry_max_attendees_reached'));
699 $eventIdList = [$newId];
707 'FROM_LIMIT' => \CCalendar::Date(
708 \CCalendar::Timestamp($dates[
'date_from']) -
709 \CCalendar::DAY_LENGTH * 10,
false
711 'TO_LIMIT' => \CCalendar::Date(
712 \CCalendar::Timestamp($dates[
'date_to']) +
713 \CCalendar::DAY_LENGTH * 90,
false
717 $eventList = \CCalendarEvent::GetList(
720 'parseRecursion' =>
true,
721 'fetchAttendees' =>
true,
722 'userId' => \CCalendar::GetUserId(),
726 if (isset(
$_REQUEST[
'rec_edit_mode']) && in_array(
$_REQUEST[
'rec_edit_mode'], [
'this',
'next']))
729 $filter[
'RECURRENCE_ID'] = ($eventList && $eventList[0] && $eventList[0][
'RECURRENCE_ID']) ? $eventList[0][
'RECURRENCE_ID'] : $newId;
731 $resRelatedEvents = \CCalendarEvent::GetList(
734 'parseRecursion' =>
true,
735 'fetchAttendees' =>
true,
736 'userId' => \CCalendar::GetUserId(),
740 foreach($resRelatedEvents as $ev)
742 $eventIdList[] = $ev[
'ID'];
744 $eventList = array_merge($eventList, $resRelatedEvents);
746 else if ($id && $eventList && $eventList[0] && \CCalendarEvent::CheckRecurcion($eventList[0]))
748 $recId = $eventList[0][
'RECURRENCE_ID'] ?? $eventList[0][
'ID'];
750 if ($eventList[0][
'RECURRENCE_ID'] && $eventList[0][
'RECURRENCE_ID'] !== $eventList[0][
'ID'])
752 unset(
$filter[
'RECURRENCE_ID']);
753 $filter[
'ID'] = $eventList[0][
'RECURRENCE_ID'];
754 $resRelatedEvents = \CCalendarEvent::GetList(
757 'parseRecursion' =>
true,
758 'fetchAttendees' =>
true,
759 'userId' => \CCalendar::GetUserId(),
762 $eventIdList[] = $eventList[0][
'RECURRENCE_ID'];
763 $eventList = array_merge($eventList, $resRelatedEvents);
769 $filter[
'RECURRENCE_ID'] = $recId;
770 $resRelatedEvents = \CCalendarEvent::GetList(
773 'parseRecursion' =>
true,
774 'fetchAttendees' =>
true,
775 'userId' => \CCalendar::GetUserId(),
779 foreach($resRelatedEvents as $ev)
781 $eventIdList[] = $ev[
'ID'];
783 $eventList = array_merge($eventList, $resRelatedEvents);
788 $pathToCalendar = \CCalendar::GetPathForCalendarEx(
$userId);
789 foreach($eventList as $ind =>
$event)
798 $userSettings[
'defaultReminders'][$dates[
'skip_time'] ?
'fullDay' :
'withTime'] = $reminderList;