3namespace Bitrix\Im\V2\Integration\HumanResources\Sync;
5use Bitrix\HumanResources\Contract\Repository\NodeRelationRepository;
6use Bitrix\HumanResources\Contract\Service\NodeMemberService;
7use Bitrix\HumanResources\Item\NodeMember;
8use Bitrix\HumanResources\Item\NodeRelation;
9use Bitrix\HumanResources\Service\Container;
10use Bitrix\HumanResources\Service\NodeRelationService;
11use Bitrix\HumanResources\Type\RelationEntityType;
12use Bitrix\Im\V2\Common\PeriodAgentTrait;
13use Bitrix\Im\V2\Integration\HumanResources\Sync\Item\EntityType;
14use Bitrix\Im\V2\Integration\HumanResources\Sync\Item\SyncDirection;
15use Bitrix\Im\V2\Integration\HumanResources\Sync\SyncProcessor\Base;
16use Bitrix\Im\V2\Result;
17use Bitrix\Main\Application;
19use Bitrix\Main\Loader;
37 ?NodeRelationService $nodeRelationService =
null,
41 Loader::requireModule(
'humanresources');
45 $this->memberService =
$memberService ?? Container::getNodeMemberService();
46 $this->relationService = $nodeRelationService ?? Container::getNodeRelationService();
53 Item\EntityType::CHAT->value =>
'\Bitrix\Im\V2\Integration\HumanResources\Sync\SyncService::syncRelationAgent();',
54 Item\EntityType::USER->value =>
'\Bitrix\Im\V2\Integration\HumanResources\Sync\SyncService::syncMemberAgent();',
60 public static function onMemberAdded(
Event $event): void
63 $member =
$event->getParameter(
'member');
65 (
new static(EntityType::USER))
66 ->
startSync(
Item\SyncInfo::createFromNodeMember($member,
Item\SyncDirection::ADD))
70 public static function onMemberDeleted(
Event $event): void
73 $member =
$event->getParameter(
'member');
75 (
new static(EntityType::USER))
76 ->
startSync(Item\SyncInfo::createFromNodeMember($member, Item\SyncDirection::DELETE))
80 public static function onMemberUpdated(
Event $event): void
83 $member =
$event->getParameter(
'member');
85 $previousMember =
$event->getParameter(
'previousMember');
87 if ($previousMember ===
null)
92 if ($member->nodeId === $previousMember->nodeId)
97 (
new static(EntityType::USER))
98 ->
startSync(Item\SyncInfo::createFromNodeMember($member, Item\SyncDirection::ADD))
100 (
new static(EntityType::USER))
101 ->
startSync(Item\SyncInfo::createFromNodeMember($previousMember, Item\SyncDirection::DELETE))
105 public static function onRelationAdded(Event
$event): void
108 $relation =
$event->getParameter(
'relation');
110 $relation->entityType !== RelationEntityType::CHAT
111 || $relation->node ===
null
117 (
new static(EntityType::CHAT))
118 ->
startSync(Item\SyncInfo::createFromNodeRelation($relation, Item\SyncDirection::ADD))
122 public static function onRelationDeleted(Event
$event): void
125 $relation =
$event->getParameter(
'relation');
127 $relation->entityType !== RelationEntityType::CHAT
128 || $relation->node ===
null
134 (
new static(EntityType::CHAT))
135 ->
startSync(Item\SyncInfo::createFromNodeRelation($relation, Item\SyncDirection::DELETE))
141 if (!Loader::includeModule(
'humanresources'))
146 (
new static(EntityType::CHAT))->
sync();
153 if (!Loader::includeModule(
'humanresources'))
158 (
new static(EntityType::USER))->
sync();
165 $itemResult = $this->syncProcessor->getOrCreateWithLock($syncInfo);
166 if ($itemResult->skip())
173 $item = $itemResult->getResult();
176 $firstIterationResult = $this->syncProcessor->makeIteration($item);
177 if (!$firstIterationResult->hasMore())
179 $this->syncProcessor->finalizeSync($item);
183 return $firstIterationResult;
185 catch (\Throwable $exception)
187 $item->setErrorStatus();
208 $syncInfo = $this->syncProcessor->dequeue();
210 if ($syncInfo ===
null)
215 $item = $this->syncProcessor->tryGetWithLock($syncInfo);
222 $iterationResult = $this->syncProcessor->makeIteration($item);
223 if ($iterationResult->hasMore())
229 $this->syncProcessor->finalizeSync($item);
232 catch (\Throwable $exception)
235 $item->setErrorStatus();
243 return $newPeriod === self::AGENT_SHORT_PERIOD;
248 return fn () => $this->syncProcessor->hasItemsInQueue() ? self::AGENT_SHORT_PERIOD : self::AGENT_LONG_PERIOD;
253 self::setPeriodByName($fromAgent, self::getAgentNameByEntityType($this->entityType), $this->
getPeriodGetter());
static getInstance(EntityType $entityType)
static syncRelationAgent()
NodeRelationService $relationService
NodeMemberService $memberService
startSync(Item\SyncInfo $syncInfo)
static getAgentNameByEntityType(Item\EntityType $entityType)
determinePeriod(bool $fromAgent)
static isAgentPeriodShort(int $newPeriod)
NodeRelationRepository $relationRepository
SyncProcessor $syncProcessor
__construct(EntityType $entityType, ?NodeMemberService $memberService=null, ?NodeRelationService $nodeRelationService=null, ?NodeRelationRepository $relationRepository=null)