- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/lib/activity/provider/configurablerestapp.php
- Класс: Bitrix\Crm\Activity\Provider\ConfigurableRestApp
- Вызов: ConfigurableRestApp::syncBadges
static function syncBadges(int $activityId, array $activityFields, array $rawBindings): void
{
$badgeType = (string)($activityFields['PROVIDER_PARAMS']['badgeCode'] ?? '');
if ($badgeType !== '')
{
if (!\Bitrix\Crm\Badge\Model\CustomBadgeTable::getByCode($badgeType))
{
$badgeType = '';
}
}
$bindings = [];
foreach ($rawBindings as $rawBinding)
{
$ownerTypeId = (int)$rawBinding['OWNER_TYPE_ID'];
$ownerId = (int)$rawBinding['OWNER_ID'];
if (\CCrmOwnerType::IsDefined($ownerTypeId) && $ownerId > 0)
{
$bindings[] = new ItemIdentifier($ownerTypeId, $ownerId);
}
}
$sourceIdentifier = new Badge\SourceIdentifier(
Badge\SourceIdentifier::CRM_OWNER_TYPE_PROVIDER,
\CCrmOwnerType::Activity,
$activityId,
);
$existedBadges = [];
$existedBadgesIterator = BadgeTable::query()
->where('TYPE', Badge\Type\RestAppStatus::REST_APP_TYPE)
->where('SOURCE_PROVIDER_ID', $sourceIdentifier->getProviderId())
->where('SOURCE_ENTITY_TYPE_ID', $sourceIdentifier->getEntityTypeId())
->where('SOURCE_ENTITY_ID', $sourceIdentifier->getEntityId())
->setSelect([
'ID',
'VALUE',
'ENTITY_TYPE_ID',
'ENTITY_ID',
])
->exec()
;
while($existedBadge = $existedBadgesIterator->fetch())
{
$existedBadges[$existedBadge['ENTITY_TYPE_ID']][$existedBadge['ENTITY_ID']] = $existedBadge['VALUE'];
}
$isCompleted = isset($activityFields['COMPLETED']) && $activityFields['COMPLETED'] === 'Y';
if ($isCompleted || $badgeType === '') // remove existed badges
{
foreach ($existedBadges as $existedBadgeEntityTypeId => $byTypeId)
{
foreach ($byTypeId as $existedBadgeEntityId => $value)
{
$existedBadge = Container::getInstance()->getBadge(
Badge\Type\RestAppStatus::REST_APP_TYPE,
$value,
);
$itemIdentifier = new ItemIdentifier((int)$existedBadgeEntityTypeId, (int)$existedBadgeEntityId);
$existedBadge->unbind($itemIdentifier, $sourceIdentifier);
}
}
return;
}
$newBadge = Container::getInstance()->getBadge(
Badge\Type\RestAppStatus::REST_APP_TYPE,
$badgeType
);
foreach ($bindings as $singleBinding)
{
$existedBadgeValue = $existedBadges[$singleBinding->getEntityTypeId()][$singleBinding->getEntityId()] ?? null;
if ($existedBadgeValue === $badgeType) // existed record was not changed
{
continue;
}
if ($existedBadgeValue)
{
$existedBadge = Container::getInstance()->getBadge(
Badge\Type\RestAppStatus::REST_APP_TYPE,
$existedBadgeValue,
);
$existedBadge->unbind($singleBinding, $sourceIdentifier);
}
$newBadge->bind($singleBinding, $sourceIdentifier);
}
}