• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/tracking/trace.php
  • Класс: Bitrix\Crm\Tracking\Trace
  • Вызов: Trace::save
public function save()
{
	if ($this->id)
	{
		return $this->id;
	}

	$traceId = $this->detect();
	if ($traceId)
	{
		return $traceId;
	}

	$this->detectEntities();

	foreach ($this->previousTraces as $previousTrace)
	{
		$previousTrace->save();
	}

	$trace = (new Internals\EO_Trace)
		->setSourceId($this->getSourceId())
		->setIsMobile($this->isMobile)
		->setTagsRaw($this->utm)
		->setHasChild(!empty($this->previousTraces))
		->setPagesRaw(array_map(
			function ($page)
			{
				$dateInsert = $page['DATE_INSERT'];
				// @var DateTime $dateInsert
				$page['DATE_INSERT'] = $dateInsert->getTimestamp();
				return $page;
			},
			$this->pages
		));

	if ($this->dateCreate)
	{
		$trace->setDateCreate($this->dateCreate);
	}

	$result = $trace->save();
	if ($result->isSuccess())
	{
		$this->id = $result->getId();
		foreach ($this->previousTraces as $previousTrace)
		{
			if (!$previousTrace->getId())
			{
				continue;
			}

			Internals\TraceTreeTable::add([
				'PARENT_ID' => $this->id,
				'CHILD_ID' => $previousTrace->getId()
			])->isSuccess();
		}
		foreach ($this->channelCollection as $channel)
		{
			self::appendChannel($this->id, $channel);
		}
		foreach ($this->entityCollection as $entity)
		{
			/** @var Crm\Entity\Identificator\Complex $entity */
			self::appendEntity($this->id, $entity->getTypeId(), $entity->getId());
		}

		Source\Level\TraceSplitter::instance()->split($this);
		$this->sendEventForAnalytics();
	}

	return $this->id;
}