3namespace Bitrix\Calendar\OpenEvents\Service;
5use Bitrix\Calendar\Core\EventCategory\EventCategory;
6use Bitrix\Calendar\Core\Mappers\EventCategory as EventCategoryMapper;
7use Bitrix\Calendar\Core\Mappers\Factory;
8use Bitrix\Calendar\EventCategory\Event\AfterEventCategoryUpdate;
9use Bitrix\Calendar\EventOption\Helper\EventOptionHelper;
10use Bitrix\Calendar\Internals\EventTable;
11use Bitrix\Calendar\Internals\Exception\PermissionDenied;
12use Bitrix\Calendar\OpenEvents\Internals\OpenEventCategoryTable;
13use Bitrix\Calendar\OpenEvents\Internals\OpenEventOptionTable;
14use Bitrix\Main\Application;
15use Bitrix\Main\DB\Connection;
16use Bitrix\Main\DB\SqlExpression;
17use Bitrix\Main\DI\ServiceLocator;
18use Bitrix\Main\Entity\ReferenceField;
19use Bitrix\Main\ORM\Query\Join;
20use Bitrix\Main\Text\Emoji;
21use Bitrix\Calendar\OpenEvents\Controller\Request\EventCategory as RequestDto;
22use Bitrix\Calendar\Integration;
26 private static ?
self $instance;
30 self::$instance ??=
new self();
32 return self::$instance;
41 $eventCategory->setName(Emoji::encode($createEventCategoryDto->name));
42 $eventCategory->setDescription(Emoji::encode($createEventCategoryDto->description));
43 $eventCategory->setCreatorId(
$userId);
46 if ($createEventCategoryDto->channelId)
48 $attendeeUserIds = $this->processCategoryCreationByChannel(
51 $createEventCategoryDto->channelId
56 $attendeeUserIds = $this->processCategoryCreationByRequest(
59 $createEventCategoryDto
63 $this->getEventCategoryMapper()->create($eventCategory);
65 if (!empty($attendeeUserIds))
68 $eventCategory->getId(),
73 if(!$eventCategory->getClosed())
78 return $eventCategory;
84 RequestDto\UpdateEventCategoryDto $updateEventCategoryDto
87 $name = $updateEventCategoryDto->name;
99 $closed = $updateEventCategoryDto->closed;
100 if ($closed !==
null && $eventCategory->
getClosed() !== $closed)
105 $attendeeEntities = $updateEventCategoryDto->attendees;
106 if ($attendeeEntities)
115 $this->getEventCategoryMapper()->update($eventCategory);
118 public function deleteEventCategory(
EventCategory $eventCategory): void
122 $connection = Application::getInstance()->getConnection();
124 $this->getEventCategoryMapper()->delete($eventCategory);
129 throw new \RuntimeException();
137 $incdecParts[] = $increment ?
'+' :
'-';
138 $incdecParts[] = $value;
139 OpenEventCategoryTable::update($eventCategoryId, [
140 'EVENTS_COUNT' =>
new SqlExpression(
'?# ' . implode(
'', $incdecParts),
'EVENTS_COUNT'),
143 $this->getEventCategoryMapper()->resetCacheById($eventCategoryId);
150 $lastEventQuery = OpenEventOptionTable::query()
154 ->registerRuntimeField(
157 EventTable::getEntity(),
158 Join::on(
'this.EVENT_ID',
'ref.ID'),
161 ->where(
'CATEGORY_ID', $eventCategoryId)
162 ->where(
'EVENT.DELETED',
'N')
163 ->setOrder([
'EVENT_ID' =>
'DESC'])
167 $lastEventId = (int)($lastEventQuery->fetch()[
'EVENT_ID'] ?? 0);
169 if ($lastEventId > 0)
171 $dateCreateQuery = EventTable::query()
172 ->setSelect([
'DATE_CREATE'])
173 ->where(
'ID', $lastEventId)
178 $dateCreateQuery = OpenEventCategoryTable::query()
179 ->setSelect([
'DATE_CREATE'])
180 ->where(
'ID', $eventCategoryId)
184 $dateCreate = $dateCreateQuery->fetch()[
'DATE_CREATE'] ??
null;
186 if ($dateCreate ===
null)
191 OpenEventCategoryTable::update($eventCategoryId, [
192 'LAST_ACTIVITY' => $dateCreate,
195 $this->getEventCategoryMapper()->resetCacheById($eventCategoryId);
203 $imIntegrationService = ServiceLocator::getInstance()->get(
Integration\
Im\EventCategoryServiceInterface::class);
211 $imIntegrationService->connectChannelToCategory(
$channelId);
215 $imIntegrationService->updateChannel($eventCategory);
217 return $eventCategory->
getClosed() ? $imIntegrationService->getChannelUsers(
$channelId) : [];
220 private function processCategoryCreationByRequest(
223 RequestDto\CreateEventCategoryDto $createEventCategoryDto
226 $eventCategory->setClosed($createEventCategoryDto->closed);
227 $attendeesEntities = $createEventCategoryDto->attendees;
228 $attendeeUserIds = [];
229 if ($attendeesEntities && $createEventCategoryDto->closed)
239 if ($createEventCategoryDto->closed || $createEventCategoryDto->isPrimary)
241 $departmentIds = $createEventCategoryDto->departmentIds;
245 $imIntegrationService = ServiceLocator::getInstance()->get(Integration\Im\EventCategoryServiceInterface::class);
246 $channelId = $imIntegrationService->createChannel($eventCategory, $attendeeUserIds, $departmentIds);
249 return $attendeeUserIds;
252 private function getEventCategoryMapper(): EventCategoryMapper
255 $mapperFactory = ServiceLocator::getInstance()->get(
'calendar.service.mappers.factory');
257 return $mapperFactory->getEventCategory();
260 private function __construct()
if(empty( $fields)) foreach($fields as $field) $channelId
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
setChannelId(?int $channelId)
setDescription(?string $description)
static changeCategoryForEvents(int $prevCategory, int $newCategoryId=self::SYSTEM_CATEGORY_ID)
updateEventCategory(int $userId, EventCategory $eventCategory, RequestDto\UpdateEventCategoryDto $updateEventCategoryDto)
updateLastActivity(int $eventCategoryId)
updateEventsCounter(int $eventCategoryId, bool $increment=true, int $value=1)
createEventCategory(int $userId, RequestDto\CreateEventCategoryDto $createEventCategoryDto)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if(Loader::includeModule( 'bitrix24')) elseif(Loader::includeModule('intranet') &&CIntranetUtils::getPortalZone() !=='ru') $description