- Модуль: 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}"
);
}
}