1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
factory.php
См. документацию.
1<?php
2namespace Bitrix\Calendar\Sharing\Link;
3
4use Bitrix\Calendar\Internals\SharingLinkTable;
5use Bitrix\Main\ArgumentException;
6use Bitrix\Main\Type\DateTime;
7use Bitrix\Calendar\Sharing;
8use Bitrix\Calendar\Sharing\Link\Member\Member;
9use Bitrix\Main\UserTable;
10
12{
13 protected static ?Factory $instance = null;
14 protected static ?UserLinkMapper $userLinkMapper = null;
15 protected static ?EventLinkMapper $eventLinkMapper = null;
16 protected static ?CrmDealLinkMapper $crmDealLinkMapper = null;
17 protected static ?GroupLinkMapper $groupLinkMapper = null;
18
19 protected const SELECT = ['*', 'MEMBERS', 'MEMBERS.USER', 'MEMBERS.IMAGE'];
20
24 public static function getInstance(): Factory
25 {
26 if (self::$instance === null)
27 {
28 self::$instance = new self();
29 }
30
31 return self::$instance;
32 }
33
34
44 public function getLinkArrayByHash(string $hash): ?array
45 {
46 $sharingLink = $this->getLinkByHash($hash);
47
48 if ($sharingLink instanceof CrmDealLink)
49 {
50 return $this->getCrmDealLinkMapper()->convertToArray($sharingLink);
51 }
52
53 if ($sharingLink instanceof UserLink)
54 {
55 return $this->getUserLinkMapper()->convertToArray($sharingLink);
56 }
57
58 if ($sharingLink instanceof EventLink)
59 {
60 return $this->getEventLinkMapper()->convertToArray($sharingLink);
61 }
62
63 if ($sharingLink instanceof GroupLink)
64 {
65 return $this->getGroupLinkMapper()->convertToArray($sharingLink);
66 }
67
68 return null;
69 }
70
81 {
82 $sharingLinkEO = SharingLinkTable::query()
83 ->setSelect(self::SELECT)
84 ->where('HASH', $hash)
85 ->exec()->fetchObject()
86 ;
87
88 if ($sharingLinkEO === null)
89 {
90 return null;
91 }
92
93 $mapper = match ($sharingLinkEO->getObjectType())
94 {
95 Helper::USER_SHARING_TYPE => $this->getUserLinkMapper(),
96 Helper::EVENT_SHARING_TYPE => $this->getEventLinkMapper(),
97 Helper::CRM_DEAL_SHARING_TYPE => $this->getCrmDealLinkMapper(),
98 Helper::GROUP_SHARING_TYPE => $this->getGroupLinkMapper(),
99 default => null,
100 };
101
102 return $mapper?->getByEntityObject($sharingLinkEO);
103 }
104
111 public function getAllUserLinks(int $userId): array
112 {
113 return $this->getUserLinkMapper()->getMap([
114 '=OBJECT_ID' => $userId,
115 '=OBJECT_TYPE' => Helper::USER_SHARING_TYPE,
116 '=ACTIVE' => 'Y',
117 ])->getCollection();
118 }
119
128 public function getUserLinks($userId): array
129 {
130 return $this->getUserLinkMapper()->getMap([
131 '=OBJECT_ID' => $userId,
132 '=OBJECT_TYPE' => Helper::USER_SHARING_TYPE,
133 '=ACTIVE' => 'Y',
134 '=MEMBERS_HASH' => null,
135 ])->getCollection();
136 }
137
147 {
148 return $this->getUserLinkMapper()->getMap([
149 '=OBJECT_ID' => $userId,
150 '=OBJECT_TYPE' => Helper::USER_SHARING_TYPE,
151 '=ACTIVE' => 'Y',
152 '!=MEMBERS_HASH' => null,
153 ])->getCollection();
154 }
155
156 public function getGroupLinks(int $groupId, int $userId): array
157 {
158 return $this->getGroupLinkMapper()->getMap([
159 '=OBJECT_ID' => $groupId,
160 '=HOST_ID' => $userId,
161 '=OBJECT_TYPE' => Helper::GROUP_SHARING_TYPE,
162 '=ACTIVE' => 'Y',
163 '=MEMBERS_HASH' => null,
164 ])->getCollection();
165 }
166
174 public function createUserLink(int $userId): self
175 {
176 $userLink = (new UserLink())
177 ->setUserId($userId)
178 ->setActive(true)
179 ->setFrequentUse(1)
180 ;
181
182 $rule = (new Rule\Factory())->getRuleBySharingLink($userLink);
183 $userLink->setSharingRule($rule);
184
185 $this->getUserLinkMapper()->create($userLink);
186
187 return $this;
188 }
189
202 {
203 $eventLink = (new EventLink())
204 ->setEventId($params['eventId'])
205 ->setOwnerId($params['ownerId'])
206 ->setHostId($params['hostId'])
207 ->setParentLinkHash($params['parentLinkHash'])
208 ->setActive(true)
209 ->setDateExpire($params['expiryDate'] ?? null)
210 ->setExternalUserName($params['externalUserName'] ?? null)
211 ;
212
213 $this->getEventLinkMapper()->create($eventLink);
214
215 return $eventLink;
216 }
217
230 public function createCrmDealLink(
231 int $ownerId,
232 int $entityId,
233 ?array $memberIds = [],
234 ?int $contactId = null,
235 ?int $contactType = null,
236 ?string $channelId = null,
237 ?string $senderId = null,
238 ): CrmDealLink
239 {
240 $memberHash = $this->generateMembersHash($ownerId, $memberIds);
241
242 $crmDealLink = (new CrmDealLink())
243 ->setOwnerId($ownerId)
244 ->setEntityId($entityId)
245 ->setContactType($contactType)
246 ->setContactId($contactId)
247 ->setChannelId($channelId)
248 ->setSenderId($senderId)
249 ->setActive(true)
250 ->setDateExpire(
251 Sharing\Helper::createSharingLinkExpireDate(
252 new DateTime(),
253 Sharing\Link\Helper::CRM_DEAL_SHARING_TYPE
254 )
255 )
256 ->setFrequentUse(1)
257 ;
258
259 if ($memberHash !== null)
260 {
261 $crmDealLink
262 ->setMembers($this->getMembersFromIds($memberIds))
263 ->setMembersHash($memberHash)
264 ;
265 }
266
267 $rule = (new Rule\Factory())->getRuleBySharingLink($crmDealLink);
268 $crmDealLink->setSharingRule($rule);
269
270 $this->getCrmDealLinkMapper()->create($crmDealLink);
271
272 return $crmDealLink;
273 }
274
276 {
277 $memberHash = $this->generateMembersHash($userId, $memberIds);
278
279 if ($existJointLink = $this->getJointLinkByMembersHash($memberHash))
280 {
281 SharingLinkTable::update($existJointLink->getId(), [
282 'FREQUENT_USE' => $existJointLink->getFrequentUse() + 1,
283 ]);
284
285 return $existJointLink;
286 }
287
288 $userJointLink = (new UserLink())
289 ->setUserId($userId)
290 ->setActive(true)
291 ->setFrequentUse(1)
292 ;
293
294 if ($memberHash !== null)
295 {
296 $userJointLink
297 ->setMembers($this->getMembersFromIds($memberIds))
298 ->setMembersHash($memberHash)
299 ;
300 }
301
302 $this->getUserLinkMapper()->create($userJointLink);
303
304 return $userJointLink;
305 }
306
307 public function createCrmDealJointLink(CrmDealLink $crmDealLink, array $memberIds): CrmDealLink
308 {
309 $crmDealLink
310 ->setActive(true)
311 ->setMembers($this->getMembersFromIds($memberIds))
312 ->setFrequentUse(1)
313 ;
314
315 $this->getCrmDealLinkMapper()->create($crmDealLink);
316
317 return $crmDealLink;
318 }
319
320 public function createGroupLink(int $groupId, int $userId): self
321 {
322 $groupLink = (new GroupLink())
323 ->setObjectId($groupId)
324 ->setHostId($userId)
325 ->setActive(true)
326 ->setFrequentUse(1)
327 ;
328
329 $rule = (new Rule\Factory())->getRuleBySharingLink($groupLink);
330 $groupLink->setSharingRule($rule);
331
332 $this->getGroupLinkMapper()->create($groupLink);
333
334 return $this;
335 }
336
337 public function createGroupJointLink(int $groupId, array $memberIds): \Bitrix\Calendar\Core\Base\EntityInterface
338 {
339 $memberHash = $this->generateMembersHash($groupId, $memberIds, 'group');
340
341 if ($existJointLink = $this->getGroupJointLinkByMembersHash($groupId, $memberHash))
342 {
343 SharingLinkTable::update($existJointLink->getId(), [
344 'DATE_EXPIRE' => Sharing\Helper::createSharingLinkExpireDate(
345 new DateTime(),
346 Sharing\Link\Helper::GROUP_SHARING_TYPE
347 ),
348 ]);
349
350 return $existJointLink;
351 }
352
353 $groupJointLink = (new GroupLink())
354 ->setObjectId($groupId)
355 ->setActive(true)
356 ->setFrequentUse(1)
357 ->setDateExpire(
358 Sharing\Helper::createSharingLinkExpireDate(
359 new DateTime(),
360 Sharing\Link\Helper::GROUP_SHARING_TYPE
361 )
362 )
363 ;
364
365 if ($memberHash !== null)
366 {
367 $groupJointLink
368 ->setMembers($this->getMembersFromIds($memberIds))
369 ->setMembersHash($memberHash)
370 ;
371 }
372
373 $this->getGroupLinkMapper()->create($groupJointLink);
374
375 return $groupJointLink;
376 }
377
378 private function getMembersFromIds(array $memberIds): array
379 {
380 $memberIds = array_map(static function ($memberId) {
381 return (int)$memberId;
382 }, $memberIds);
383
384 $result = [];
385 $users = UserTable::query()
386 ->whereIn('ID', $memberIds)
387 ->where('IS_REAL_USER', 'Y')
388 ->setSelect(['NAME', 'LAST_NAME', 'ID', 'PERSONAL_PHOTO'])
389 ->exec()
390 ->fetchCollection()
391 ;
392
393 foreach ($users as $user)
394 {
395 $avatar = '';
396 if (!empty($user->getPersonalPhoto()))
397 {
398 $file = \CFile::ResizeImageGet(
399 $user->getPersonalPhoto(),
400 ['width' => 100, 'height' => 100],
402 );
403 $avatar = !empty($file['src']) ? $file['src'] : '';
404 }
405
406 $member = new Member();
407 $member
408 ->setId($user->getId())
409 ->setName($user->getName())
410 ->setLastName($user->getLastName())
411 ->setAvatar($avatar)
412 ;
413 $result[] = $member;
414 }
415
416 return $result;
417 }
418
419 public function generateMembersHash(int $userId, array $memberIds, string $prefix = ''): ?string
420 {
421 if (empty($memberIds))
422 {
423 return null;
424 }
425
426 $memberIds = array_map(static function ($memberId) {
427 return (int)$memberId;
428 }, $memberIds);
429
430 sort($memberIds);
431 $implodedUsers = $prefix . implode('|', $memberIds) . '|' . $userId;
432
433 return md5($implodedUsers);
434 }
435
445 public function getEventLinkByEventId(int $eventId, bool $searchActiveOnly = true): ?\Bitrix\Calendar\Core\Base\EntityInterface
446 {
447 $query = SharingLinkTable::query()
448 ->setSelect(['*'])
449 ->where('OBJECT_ID', $eventId)
450 ->where('OBJECT_TYPE', Helper::EVENT_SHARING_TYPE)
451 ;
452
453 if ($searchActiveOnly)
454 {
455 $query->where('ACTIVE', 'Y');
456 }
457
458 $sharingLinkEO = $query->exec()->fetchObject();
459
460 if ($sharingLinkEO === null)
461 {
462 return null;
463 }
464
465 return $this->getEventLinkMapper()->getByEntityObject($sharingLinkEO);
466 }
467
478 {
479 $sharingLinkEO = SharingLinkTable::query()
480 ->setSelect(self::SELECT)
481 ->where('OBJECT_ID', $eventId)
482 ->where('OBJECT_TYPE', Helper::EVENT_SHARING_TYPE)
483 ->exec()->fetchObject();
484
485 if ($sharingLinkEO === null)
486 {
487 return null;
488 }
489
490 return $this->getEventLinkMapper()->getByEntityObject($sharingLinkEO);
491 }
492
505 public function getCrmDealLink(
506 int $entityId,
507 int $ownerId,
508 ?array $memberIds = [],
509 ?int $contactId = null,
510 ?int $contactType = null,
512 {
513 $memberHash = $this->generateMembersHash($ownerId, $memberIds);
514
515 $sharingLinkEO = SharingLinkTable::query()
516 ->setSelect(self::SELECT)
517 ->where('OBJECT_ID', $entityId)
518 ->where('OBJECT_TYPE', Helper::CRM_DEAL_SHARING_TYPE)
519 ->where('ACTIVE', 'Y')
520 ->where('OWNER_ID', $ownerId)
521 ->where('CONTACT_ID', $contactId)
522 ->where('CONTACT_TYPE', $contactType)
523 ->where('DATE_CREATE', '>=', (new DateTime())->setTime(0, 0))
524 ->where('MEMBERS_HASH', $memberHash)
525 ->exec()->fetchObject();
526
527 if ($sharingLinkEO === null)
528 {
529 return null;
530 }
531
532 return $this->getCrmDealLinkMapper()->getByEntityObject($sharingLinkEO);
533 }
534
536 {
537 $sharingLinkEO = SharingLinkTable::query()
538 ->setSelect(['*'])
539 ->where('OBJECT_TYPE', Helper::CRM_DEAL_SHARING_TYPE)
540 ->where('OWNER_ID', $ownerId)
541 ->whereNotNull('CONTACT_ID')
542 ->whereNotNull('CONTACT_TYPE')
543 ->setOrder(['ID' => 'desc'])
544 ->setLimit(1)
545 ->exec()->fetchObject();
546
547 if ($sharingLinkEO === null)
548 {
549 return null;
550 }
551
552 return $this->getCrmDealLinkMapper()->getByEntityObject($sharingLinkEO);
553 }
554
555 public function getJointLinkByMembersHash(string $membersHash): ?\Bitrix\Calendar\Core\Base\EntityInterface
556 {
557 $sharingLinkEO = SharingLinkTable::query()
558 ->setSelect(self::SELECT)
559 ->where('MEMBERS_HASH', $membersHash)
560 ->where('ACTIVE', 'Y')
561 ->where('OBJECT_TYPE', Helper::USER_SHARING_TYPE)
562 ->exec()->fetchObject()
563 ;
564
565 if ($sharingLinkEO === null)
566 {
567 return null;
568 }
569
570 return $this->getUserLinkMapper()->getByEntityObject($sharingLinkEO);
571 }
572
573 public function getGroupJointLinkByMembersHash(int $groupId, string $membersHash): ?\Bitrix\Calendar\Core\Base\EntityInterface
574 {
575 $sharingLinkEO = SharingLinkTable::query()
576 ->setSelect(self::SELECT)
577 ->where('OBJECT_ID', $groupId)
578 ->where('MEMBERS_HASH', $membersHash)
579 ->where('ACTIVE', 'Y')
580 ->where('OBJECT_TYPE', Helper::GROUP_SHARING_TYPE)
581 ->exec()->fetchObject()
582 ;
583
584 if ($sharingLinkEO === null)
585 {
586 return null;
587 }
588
589 return $this->getGroupLinkMapper()->getByEntityObject($sharingLinkEO);
590 }
591
592 public function getParentLinkByConferenceId(string $conferenceId): ?Joint\JointLink
593 {
594 $entityObject = SharingLinkTable::query()
595 ->setSelect(['PARENT_LINK_HASH'])
596 ->where('CONFERENCE_ID', $conferenceId)
597 ->exec()->fetchObject()
598 ;
599
600 if (is_null($entityObject))
601 {
602 return null;
603 }
604
605 $parentLink = $this->getLinkByHash($entityObject->getParentLinkHash());
606
607 return $parentLink instanceof Joint\JointLink ? $parentLink : null;
608 }
609
610 public function getCrmDealJointLink(
611 int $entityId,
612 int $ownerId,
613 ?int $contactId = null,
614 ?int $contactType = null
616 {
617 $sharingLinkEO = SharingLinkTable::query()
618 ->setSelect(self::SELECT)
619 ->where('OBJECT_ID', $entityId)
620 ->where('OBJECT_TYPE', Helper::CRM_DEAL_SHARING_TYPE)
621 ->where('ACTIVE', 'Y')
622 ->where('OWNER_ID', $ownerId)
623 ->where('CONTACT_ID', $contactId)
624 ->where('CONTACT_TYPE', $contactType)
625 ->whereNotNull('MEMBERS.MEMBER_ID')
626 ->exec()->fetchObject();
627
628 if ($sharingLinkEO === null)
629 {
630 return null;
631 }
632
633 return $this->getCrmDealLinkMapper()->getByEntityObject($sharingLinkEO);
634 }
635
636 private function getUserLinkMapper(): UserLinkMapper
637 {
638 if (self::$userLinkMapper === null)
639 {
640 self::$userLinkMapper = new UserLinkMapper();
641 }
642
643 return self::$userLinkMapper;
644 }
645
646 private function getEventLinkMapper(): EventLinkMapper
647 {
648 if (self::$eventLinkMapper === null)
649 {
650 self::$eventLinkMapper = new EventLinkMapper();
651 }
652
653 return self::$eventLinkMapper;
654 }
655
656 private function getCrmDealLinkMapper(): CrmDealLinkMapper
657 {
658 if (self::$crmDealLinkMapper === null)
659 {
660 self::$crmDealLinkMapper = new CrmDealLinkMapper();
661 }
662
663 return self::$crmDealLinkMapper;
664 }
665
666 private function getGroupLinkMapper(): GroupLinkMapper
667 {
668 if (self::$groupLinkMapper === null)
669 {
670 self::$groupLinkMapper = new GroupLinkMapper();
671 }
672
673 return self::$groupLinkMapper;
674 }
675}
$hash
Определения ajax_redirector.php:8
if(empty( $fields)) foreach($fields as $field) $channelId
Определения push.php:23
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$query
Определения get_search.php:11
const BX_RESIZE_IMAGE_EXACT
Определения constants.php:12
$user
Определения mysql_to_pgsql.php:33
$entityId
Определения payment.php:4
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799