• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/activity/provider/calltracker.php
  • Класс: Bitrix\Crm\Activity\Provider\CallTracker
  • Вызов: CallTracker::onAfterUpdate
static function onAfterUpdate(
	int $id,
	array $changedFields,
	array $oldActivityFields,
	array $newActivityFields,
	array $params = null
)
{
	// counter should be updated only if deadline, completed flag or responsible was changed
	// also we try to guess, was the activity counted in counter before or not

	$prevDeadline = $oldActivityFields['DEADLINE'] ?? null;
	$curDeadline = $newActivityFields['DEADLINE'] ?? null;
	$deadlineChanged = ($prevDeadline !== $curDeadline);
	$prevDeadline = $prevDeadline ? new \Bitrix\Main\Type\DateTime($prevDeadline) : null;
	$curDeadline = $curDeadline ? new \Bitrix\Main\Type\DateTime($curDeadline) : null;

	$prevCompleted = ($oldActivityFields['COMPLETED'] ?? '') == 'Y';
	$curCompleted = ($newActivityFields['COMPLETED'] ?? '')  == 'Y';
	$completedChanged = ($prevCompleted !== $curCompleted);

	$prevResponsibleId = (int)($oldActivityFields['RESPONSIBLE_ID'] ?? 0);
	$curResponsibleId = (int)($newActivityFields['RESPONSIBLE_ID'] ?? 0);
	$responsibleIdChanged = ($prevResponsibleId !== $curResponsibleId);

	if (!$completedChanged && !$deadlineChanged && !$responsibleIdChanged)
	{
		// nothing important was changed
		return;
	}

	$wasCounterUpdatedEarlier = self::needUpdateCounter($prevCompleted, $prevDeadline);
	$needUpdateCounterNow = self::needUpdateCounter($curCompleted, $curDeadline);

	$needIncrease =
		($completedChanged || $deadlineChanged)
		&& !$wasCounterUpdatedEarlier
		&& $needUpdateCounterNow
	;

	$needDecrease =
		($completedChanged || $deadlineChanged)
		&& $wasCounterUpdatedEarlier
		&& !$needUpdateCounterNow
	;

	if ($responsibleIdChanged)
	{
		$needIncrease = false;
		$needDecrease = $wasCounterUpdatedEarlier;
	}

	if ($curResponsibleId > 0)
	{
		$counter = \Bitrix\Crm\Counter\EntityCounterFactory::createCallTrackerCounter($curResponsibleId);
		if ($needIncrease)
		{
			$counter->increase();
		}
		if ($needDecrease)
		{
			$counter->decrease();
		}
	}
	if ($responsibleIdChanged && $prevResponsibleId > 0 && $needUpdateCounterNow)
	{
		$prevUserCounter = \Bitrix\Crm\Counter\EntityCounterFactory::createCallTrackerCounter($prevResponsibleId);
		$prevUserCounter->increase();
	}
}