- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/lib/counter/monitor/countableactivitysynchronizer.php
- Класс: Bitrix\Crm\Counter\Monitor\CountableActivitySynchronizer
- Вызов: CountableActivitySynchronizer::synchronizeByActivityChange
static function synchronizeByActivityChange(ActivityChange $activityChange, array $entitiesData): void
{
if ($activityChange->wasActivityDeleted())
{
EntityCountableActivityTable::deleteByActivity($activityChange->getId());
return;
}
$canOldRecordExists =
(!is_null($activityChange->getOldDeadline()) || $activityChange->getOldIsIncomingChannel())
&& !$activityChange->getOldIsCompleted()
;
// if activity was completed:
if ($canOldRecordExists && $activityChange->getNewIsCompleted())
{
EntityCountableActivityTable::deleteByActivity($activityChange->getId());
}
// if deadline and incoming flag was removed:
elseif($canOldRecordExists && is_null($activityChange->getNewDeadline()) && !$activityChange->getNewIsIncomingChannel())
{
EntityCountableActivityTable::deleteByActivity($activityChange->getId());
}
// if activity has deadline or is incoming and is not completed:
elseif (
(!is_null($activityChange->getNewDeadline()) || $activityChange->getNewIsIncomingChannel())
&& !$activityChange->getNewIsCompleted()
)
{
/** @var ActCounterLightTimeRepo $lightCounterRepo */
$lightCounterRepo = ServiceLocator::getInstance()->get('crm.activity.actcounterlighttimerepo');
$lightCounterAt = $lightCounterRepo->queryLightTimeByActivityId($activityChange->getId());
$deadline = $activityChange->getNewDeadline() ?? \CCrmDateTimeHelper::getMaxDatabaseDateObject();
if (!$lightCounterAt)
{
$lightCounterAt = clone $deadline;
$lightCounterAt->add('-PT15M');
}
foreach ($activityChange->getNewBindings() as $binding)
{
if (!\CCrmOwnerType::IsEntity($binding->getEntityTypeId()))
{
continue;
}
$entityData = $entitiesData[$binding->getEntityTypeId()][$binding->getEntityId()] ?? [];
EntityCountableActivityTable::upsert([
'ENTITY_TYPE_ID' => $binding->getEntityTypeId(),
'ENTITY_ID' => $binding->getEntityId(),
'ENTITY_ASSIGNED_BY_ID' => $entityData['assignedBy'] ?? 0,
'ACTIVITY_ID' => $activityChange->getId(),
'ACTIVITY_RESPONSIBLE_ID' => (int)$activityChange->getNewResponsibleId(),
'ACTIVITY_DEADLINE' => $activityChange->getNewDeadline() ?? \CCrmDateTimeHelper::getMaxDatabaseDateObject(),
'ACTIVITY_IS_INCOMING_CHANNEL' => (bool)$activityChange->getNewIsIncomingChannel(),
'LIGHT_COUNTER_AT' => $lightCounterAt,
'DEADLINE_EXPIRED_AT' => self::endDayOfDateTime($deadline)
]);
}
}
}