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

	$currentMap = array();
	foreach($data as $type => $values)
	{
		if(!is_array($values))
		{
			continue;
		}

		if(!isset($currentMap[$type]))
		{
			$currentMap[$type] = array();
		}

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

	$persistentMap = array();
	$result = $connection->query("SELECT ID, TYPE, VALUE FROM b_crm_dp_comm_mcd WHERE ENTITY_TYPE_ID = {$entityTypeID} AND ENTITY_ID = {$entityID}");
	while($fields = $result->fetch())
	{
		$type = $fields['TYPE'];
		if(!isset($persistentMap[$type]))
		{
			$persistentMap[$type] = array();
		}

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

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

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

	$sqlHelper = $connection->getSqlHelper();
	if(!empty($deleteIDs))
	{
		$idsSql = implode(',', $deleteIDs);
		$connection->queryExecute(
			"DELETE FROM b_crm_dp_comm_mcd WHERE ID IN ({$idsSql})"
		);
	}

	if(!empty($insertItems))
	{
		if($connection instanceof \Bitrix\Main\DB\MysqlCommonConnection)
		{
			$valueData = array();
			foreach($insertItems as $item)
			{
				$typeSql = $sqlHelper->forSql($item['type']);
				$valueSql = $sqlHelper->forSql($item['value']);
				$valueData[] = "({$entityTypeID}, {$entityID}, '{$typeSql}', '{$valueSql}')";
			}

			$valuesSql = implode(', ', $valueData);
			$connection->queryExecute(
				"INSERT INTO b_crm_dp_comm_mcd(ENTITY_TYPE_ID, ENTITY_ID, TYPE, VALUE) VALUES {$valuesSql}"
			);
		}
		elseif($connection instanceof \Bitrix\Main\DB\MssqlConnection)
		{
			if(count($insertItems) > 1)
			{
				$valueData = array();
				foreach($insertItems as $item)
				{
					$typeSql = $sqlHelper->forSql($item['type']);
					$valueSql = $sqlHelper->forSql($item['value']);
					$valueData[] = "SELECT {$entityTypeID}, {$entityID}, '{$typeSql}', '{$valueSql}'";
				}
				$valuesSql = implode(' UNION ALL ', $valueData);

				if($valuesSql !== '')
				{
					$connection->queryExecute(
						"INSERT INTO b_crm_dp_comm_mcd(ENTITY_TYPE_ID, ENTITY_ID, TYPE, VALUE) {$valuesSql}"
					);
				}
			}
			else
			{
				$item = $insertItems[0];
				$typeSql = $sqlHelper->forSql($item['type']);
				$valueSql = $sqlHelper->forSql($item['value']);
				$valuesSql = "({$entityTypeID}, {$entityID}, '{$typeSql}', '{$valueSql}')";
				$connection->queryExecute(
					"INSERT INTO b_crm_dp_comm_mcd(ENTITY_TYPE_ID, ENTITY_ID, TYPE, VALUE) VALUES {$valuesSql}"
				);
			}
		}
		elseif($connection instanceof \Bitrix\Main\DB\OracleConnection)
		{
			if(count($insertItems) > 1)
			{
				$valueData = array();
				foreach($insertItems as $item)
				{
					$typeSql = $sqlHelper->forSql($item['type']);
					$valueSql = $sqlHelper->forSql($item['value']);
					$valueData[] = "SELECT {$entityTypeID}, {$entityID}, '{$typeSql}', '{$valueSql}' FROM dual";
				}
				$valuesSql = implode(' UNION ALL ', $valueData);
				$connection->queryExecute(
					"INSERT INTO b_crm_dp_comm_mcd(ENTITY_TYPE_ID, ENTITY_ID, TYPE, VALUE) {$valuesSql}"
				);
			}
			else
			{
				$item = $insertItems[0];
				$typeSql = $sqlHelper->forSql($item['type']);
				$valueSql = $sqlHelper->forSql($item['value']);
				$valuesSql = "({$entityTypeID}, {$entityID}, '{$typeSql}', '{$valueSql}')";
				$connection->queryExecute(
					"INSERT INTO b_crm_dp_comm_mcd(ENTITY_TYPE_ID, ENTITY_ID, TYPE, VALUE) VALUES {$valuesSql}"
				);
			}
		}
		else
		{
			$dbType = $connection->getType();
			throw new Main\NotSupportedException("The '{$dbType}' is not supported in current context");
		}
	}
}