• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/ads/form/webhookformfillhandler.php
  • Класс: Bitrix\Crm\Ads\Form\WebHookFormFillHandler
  • Вызов: WebHookFormFillHandler::processItem
private function processItem(string $serviceType, Payload\LeadItem $externalFormFillItem, string $originId): void
{
	$linkDb =
		AdsFormLinkTable::query()
			->setSelect(['WEBFORM_ID'])
			->where('ADS_FORM_ID', $adsFormId = $externalFormFillItem->getFormId())
			->where('ADS_TYPE', $serviceType)
			->addOrder('DATE_INSERT', 'DESC')
			->exec();

	if ($linkDb->getSelectedRowsCount() <= 0)
	{
		$this->addError("Linked crm-forms by ads-form-id `{$adsFormId}` not found.");

		return;
	}

	/**@var \Bitrix\Seo\LeadAds\Form */
	$form = $this->service->getForm($serviceType);
	$adsResult = $form->getResult($externalFormFillItem);

	if (!$adsResult || !$adsResult->isSuccess())
	{
		$this->errorCollection->add($adsResult->getErrors());

		return;
	}

	for ($incomeFields = []; $item = $adsResult->fetch();)
	{
		$incomeFields[$item['NAME']] = $item['VALUES'];
	}

	for (; $link = $linkDb->fetch();)
	{
		// check existing form
		if (($form = new Form()) && !$form->load($link['WEBFORM_ID']))
		{
			$this->addError("Can not load crm-form by id `{$link['WEBFORM_ID']}`.");
			continue;
		}
		// check existing result
		if ($form->hasResult($originId))
		{
			continue;
		}
		// chek if map exists
		if (!$mapper = $form->getIntegration()->getIntegrationFieldsMapper($serviceType, $adsFormId))
		{
			$this->addError("Mapper not exists for this form");
			continue;
		}

		// add result
		$result = $form->addResult(
			$mapper->prepareFormFillResult($incomeFields),
			[
				'ORIGIN_ID' => $originId,
				'COMMON_DATA' => [
					'TRACE_ID' => Trace::create()
						->addChannel($serviceType === Service::TYPE_FACEBOOK ? new FbLeadAds() : new VkLeadAds())
						->addChannel(new Channel\Form($link['WEBFORM_ID']))
						->save(),
				],
			]
		);

		foreach ($result->getErrors() as $errorMessage)
		{
			$this->addError($errorMessage);
		}
	}
}