• Модуль: 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)
			]);
		}
	}
}