• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/integrity/duplicaterequisitematchcode.php
  • Класс: Bitrix\Crm\Integrity\DuplicateRequisiteMatchCodeTable
  • Вызов: DuplicateRequisiteMatchCodeTable::bulkReplaceValues
static function bulkReplaceValues($entityTypeID, $entityID, array $data)
{
	$connection = Application::getConnection();
	if(empty($data))
	{
		$connection->queryExecute(
			/** @lang MySQL */
			"DELETE FROM b_crm_dp_rq_mcd WHERE ENTITY_TYPE_ID = {$entityTypeID} AND ENTITY_ID = {$entityID}"
		);
		return;
	}

	$currentMap = array();
	foreach($data as $rqCountryId => $rqFields)
	{
		if(is_array($rqFields))
		{
			if (!isset($currentMap[$rqCountryId]))
			{
				$currentMap[$rqCountryId] = array();
			}

			foreach ($rqFields as $rqFieldName => $values)
			{
				if (is_array($values))
				{
					if (!isset($currentMap[$rqCountryId][$rqFieldName]))
					{
						$currentMap[$rqCountryId][$rqFieldName] = array();
					}

					foreach($values as $value)
					{
						$hash = md5($value);
						$currentMap[$rqCountryId][$rqFieldName][$hash] = array('value' => $value);
					}
				}
			}
		}
	}

	$persistentMap = array();
	$result = $connection->query(
		/** @lang MySQL */
		"SELECT ID, RQ_COUNTRY_ID, RQ_FIELD_NAME, VALUE".PHP_EOL.
		"FROM b_crm_dp_rq_mcd".PHP_EOL.
		"\tWHERE ENTITY_TYPE_ID = {$entityTypeID} AND ENTITY_ID = {$entityID}"
	);
	while($fields = $result->fetch())
	{
		$rqCountryId = $fields['RQ_COUNTRY_ID'];
		$rqFieldName = $fields['RQ_FIELD_NAME'];
		if(!isset($persistentMap[$rqCountryId]))
		{
			$persistentMap[$rqCountryId] = array();
		}
		if(!isset($persistentMap[$rqCountryId][$rqFieldName]))
		{
			$persistentMap[$rqCountryId][$rqFieldName] = array();
		}

		$ID = (int)$fields['ID'];
		$value = $fields['VALUE'];
		$hash = md5($value);
		$persistentMap[$rqCountryId][$rqFieldName][$hash] = array('id' => $ID, 'value' => $value);
	}

	$deleteIDs = array();
	foreach($persistentMap as $rqCountryId => $rqFields)
	{
		foreach ($rqFields as $rqFieldName => $items)
		{
			$currentItems = isset($currentMap[$rqCountryId][$rqFieldName]) ?
				$currentMap[$rqCountryId][$rqFieldName] : array();
			foreach($items as $hash => $item)
			{
				if(!isset($currentItems[$hash]))
				{
					$deleteIDs[] = $item['id'];
				}
			}
		}
	}

	$insertItems = array();
	foreach($currentMap as $rqCountryId => $rqFields)
	{
		foreach ($rqFields as $rqFieldName => $items)
		{
			$presentItems = isset($persistentMap[$rqCountryId][$rqFieldName]) ?
				$persistentMap[$rqCountryId][$rqFieldName] : array();
			foreach($items as $hash => $item)
			{
				if(!isset($presentItems[$hash]))
				{
					$insertItems[] = array(
						'rqCountryId' => $rqCountryId,
						'rqFieldName' => $rqFieldName,
						'value' => $item['value']
					);
				}
			}
		}
	}

	$sqlHelper = $connection->getSqlHelper();
	if(!empty($deleteIDs))
	{
		$idsSql = implode(',', $deleteIDs);
		$connection->queryExecute(
			/** @lang MySQL */
			"DELETE FROM b_crm_dp_rq_mcd WHERE ID IN ({$idsSql})"
		);
	}

	if(!empty($insertItems))
	{
		$valueData = array();
		foreach($insertItems as $item)
		{
			$rqCountryIdSql = (int)$item['rqCountryId'];
			$rqFieldNameSql = $sqlHelper->forSql($item['rqFieldName']);
			$valueSql = $sqlHelper->forSql($item['value']);
			$valueData[] =
				"({$entityTypeID}, {$entityID}, {$rqCountryIdSql}, '{$rqFieldNameSql}', '{$valueSql}')";
		}

		$valuesSql = implode(', ', $valueData);
		$connection->queryExecute(
			/** @lang MySQL */
			"INSERT INTO b_crm_dp_rq_mcd".PHP_EOL.
			"\t(ENTITY_TYPE_ID, ENTITY_ID, RQ_COUNTRY_ID, RQ_FIELD_NAME, VALUE) VALUES ".PHP_EOL.
			"\t{$valuesSql}"
		);
	}
}