1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
CollabUpdateEventListener.php
См. документацию.
1<?php
2
3declare(strict_types=1);
4
5namespace Bitrix\Socialnetwork\Collab\Onboarding\Event\Type;
6
7use Bitrix\Main\EventResult;
8use Bitrix\Socialnetwork\Collab\Control\Command\CollabUpdateCommand;
9use Bitrix\Socialnetwork\Collab\Control\Event\CollabUpdateEvent;
10use Bitrix\Socialnetwork\Collab\Onboarding\Collab\Repository\CollabRepository;
11use Bitrix\Socialnetwork\Collab\Onboarding\Entity\JobCollection;
12use Bitrix\Socialnetwork\Collab\Onboarding\Entity\JobFactory;
13use Bitrix\Socialnetwork\Collab\Onboarding\Entity\Type\CreatedTaskOrMeetingOrFileThreeDays;
14use Bitrix\Socialnetwork\Collab\Onboarding\Internals\Type;
15use Bitrix\Socialnetwork\Integration\Calendar\ClosestWorkDate\ClosestWorkDate;
16use Bitrix\Socialnetwork\Integration\HumanResources\AccessCodeConverter;
17use CTimeZone;
18
20{
21 private CollabRepository $collabRepository;
22
23 public function __construct()
24 {
25 parent::__construct();
26
27 $this->collabRepository = CollabRepository::getInstance();
28 }
29
31 {
32 $jobCollection = new JobCollection();
33
34 $command = $event->getCommand();
35 $collabId = $command->getId();
36 $initiatorId = $command->getInitiatorId();
37
38 if ($this->mayCreateCollabEntityJobs($initiatorId, $collabId))
39 {
40 $jobCollection->merge($this->getCollabEntityJobs($command));
41 }
42
43 if (!$this->isFirstMemberJustNowAdded($event))
44 {
45 $this->queueService->add($jobCollection);
46
47 return new EventResult(EventResult::SUCCESS);
48 }
49
50 if ($command->getAddInvitedMembers())
51 {
52 $jobCollection->merge($this->getJobsAfterFirstCollaberInvited($collabId, $initiatorId));
53 }
54
55 if ($command->getAddMembers() || $command->getAddModeratorMembers())
56 {
57 $jobCollection->merge($this->getJobsAfterFirstEmployeeInvited($collabId, $initiatorId));
58 }
59
60 $this->queueService->add($jobCollection);
61 $this->deleteJobsAfterMemberAdded($collabId);
62
63 return new EventResult(EventResult::SUCCESS);
64 }
65
66 private function isFirstMemberJustNowAdded(CollabUpdateEvent $event): bool
67 {
68 $collabBefore = $event->getCollabBefore();
69 $memberBeforeIds = $collabBefore->getUserMemberIds();
70
71 $isSingleMember = count($memberBeforeIds) === 1;
72
73 return $isSingleMember && $this->hasAddedMembersInCommand($event->getCommand());
74 }
75
76 private function hasAddedMembersInCommand(CollabUpdateCommand $command): bool
77 {
78 return
79 $command->getAddInvitedMembers()
80 || $command->getAddMembers()
81 || $command->getAddModeratorMembers()
82 ;
83 }
84
85 private function mayCreateCollabEntityJobs(int $initiatorId, int $collabId): bool
86 {
87 $firstAddedData = $this->collabRepository->getFirstAddedMemberData($collabId);
88
89 if (!$firstAddedData || !$firstAddedData->isFirstMemberAdded)
90 {
91 return true;
92 }
93
94 $lastDateForJobCreation = (new ClosestWorkDate())->get(
95 CreatedTaskOrMeetingOrFileThreeDays::JOB_OFFSET,
96 $firstAddedData->addedDate->toUserTime()
97 );
98
99 $userTimeOffset = CTimeZone::GetOffset($initiatorId);
100 $lastDateForJobCreation->add("-{$userTimeOffset} seconds");
101
102 return time() < $lastDateForJobCreation->getTimestamp();
103 }
104
105 private function getCollabEntityJobs(CollabUpdateCommand $command): JobCollection
106 {
107 $addedMembers = [];
108
109 if ($command->getAddMembers())
110 {
111 $addedMembers = $command->getAddMembers();
112 }
113
114 if ($command->getAddModeratorMembers())
115 {
116 $addedMembers = array_merge($addedMembers, $command->getAddModeratorMembers());
117 }
118
119 $firstAddedData = $this->collabRepository->getFirstAddedMemberData($command->getId());
120 if ($firstAddedData?->isFirstMemberAdded && $command->getAddInvitedMembers())
121 {
122 $addedMembers = array_merge($addedMembers, $command->getAddInvitedMembers());
123 }
124
125 $jobCollection = new JobCollection();
126
127 if (empty($addedMembers))
128 {
129 return $jobCollection;
130 }
131
132 $addedMemberIds = (new AccessCodeConverter(...$addedMembers))->getUserIds();
133
134 foreach ($addedMemberIds as $memberId)
135 {
136 $jobCollection->add(
137 JobFactory::create($command->getId(), $memberId, Type::CreatedTaskOrMeetingOrFileThreeDays->value)
138 );
139 }
140
141 return $jobCollection;
142 }
143
144 private function getJobsAfterFirstCollaberInvited(int $collabId, int $initiatorId): JobCollection
145 {
146 return new JobCollection(
147 JobFactory::create($collabId, $initiatorId, Type::CollaberNotAcceptInvitationOneDay->value),
148 JobFactory::create($collabId, $initiatorId, Type::CollaberNotAcceptInvitationTwoDays->value),
149 );
150 }
151
152 private function getJobsAfterFirstEmployeeInvited(int $collabId, int $initiatorId): JobCollection
153 {
154 return new JobCollection(
155 JobFactory::create($collabId, $initiatorId, Type::StartChattingOneDay->value),
156 JobFactory::create($collabId, $initiatorId, Type::CreatedTaskOrMeetingOrFileThreeDays->value),
157 );
158 }
159
160 private function deleteJobsAfterMemberAdded(int $collabId): void
161 {
162 $this->queueService->deleteByFilter([
163 'COLLAB_IDS' => [$collabId],
164 'JOB_TYPES' => [
165 Type::MembersNotInvitedOneDay->value,
166 Type::MembersNotInvitedTwoDays->value,
167 Type::MembersNotInvitedFourDays->value,
168 Type::MembersNotInvitedFiveDays->value,
169 ]
170 ]);
171 }
172}
$event
Определения prolog_after.php:141
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936