public static function getMatchHash($typeID, array $matches) { if ($typeID === DuplicateIndexType::PERSON) { return DuplicatePersonCriterion::prepareMatchHash($matches); } elseif ($typeID === DuplicateIndexType::ORGANIZATION) { return DuplicateOrganizationCriterion::prepareMatchHash($matches); } elseif ($typeID === DuplicateIndexType::COMMUNICATION_EMAIL || $typeID === DuplicateIndexType::COMMUNICATION_PHONE) { return DuplicateCommunicationCriterion::prepareMatchHash($matches); } throw new Main\NotSupportedException("Criterion type(s): '" . DuplicateIndexType::resolveName($typeID) . "' is not supported in current context"); }
public function findMultifieldDuplicates($type, \Bitrix\Crm\EntityAdapter $adapter, DuplicateSearchParams $params) { if (!is_string($type)) { throw new Main\ArgumentTypeException('type', 'string'); } if ($type !== 'EMAIL' && $type !== 'PHONE') { throw new Main\NotSupportedException("Type: '{$type}' is not supported in current context"); } $allMultiFields = $adapter->getFieldValue('FM'); $multiFields = is_array($allMultiFields) && isset($allMultiFields[$type]) ? $allMultiFields[$type] : null; if (!is_array($multiFields) || empty($multiFields)) { return array(); } $criterions = array(); $dups = array(); foreach ($multiFields as &$multiField) { $value = isset($multiField['VALUE']) ? $multiField['VALUE'] : ''; if ($value === '') { continue; } $criterion = new DuplicateCommunicationCriterion($type, $value); $isExists = false; foreach ($criterions as $curCriterion) { /** @var DuplicateCriterion $curCriterion */ if ($criterion->equals($curCriterion)) { $isExists = true; break; } } if ($isExists) { continue; } $criterions[] = $criterion; $duplicate = $criterion->find(); if ($duplicate !== null) { $dups[] = $duplicate; } } unset($multiField); return $dups; }
} if (!isset($item['FM'][$type])) { $item['FM'][$type] = array(); } for ($i = 0; $i < $valueCount; $i++) { $item['FM'][$type]['n' . strval($i + 1)] = array('VALUE_TYPE' => $valueType, 'VALUE' => $values[$i]['VALUE']); } } else { if (isset($item['FM'][$type]) && !empty($item['FM'][$type])) { $valuesToAdd = array(); foreach ($values as &$value) { $code = $value['CODE']; $isFound = false; foreach ($item['FM'][$type] as $k => &$v) { if ($v['VALUE_TYPE'] === $valueType) { if ($code === \Bitrix\Crm\Integrity\DuplicateCommunicationCriterion::prepareCode($type, $v['VALUE'])) { $isFound = true; break; } } } unset($v); if (!$isFound) { $valuesToAdd[] = $value['VALUE']; } } unset($value); $valueToAddCount = count($valuesToAdd); if ($valueToAddCount > 0) { for ($i = 0; $i < $valueToAddCount; $i++) { $item['FM'][$type]['n' . strval($i + 1)] = array('VALUE_TYPE' => $valueType, 'VALUE' => $valuesToAdd[$i]);
public static function registerEntityStatistics($entityTypeID, $entityID, array $entityFields) { $lastChanged = 0; $completeness = 0; if ($entityTypeID === \CCrmOwnerType::Contact) { if (isset($entityFields['DATE_MODIFY']) && $entityFields['DATE_MODIFY'] !== '') { $lastChanged = MakeTimeStamp($entityFields['DATE_MODIFY']); } if (isset($entityFields['NAME']) && $entityFields['NAME'] !== '') { $completeness++; } if (isset($entityFields['SECOND_NAME']) && $entityFields['SECOND_NAME'] !== '') { $completeness++; } if (isset($entityFields['LAST_NAME']) && $entityFields['LAST_NAME'] !== '') { $completeness++; } } elseif ($entityTypeID === \CCrmOwnerType::Company) { if (isset($entityFields['DATE_MODIFY']) && $entityFields['DATE_MODIFY'] !== '') { $lastChanged = MakeTimeStamp($entityFields['DATE_MODIFY']); } if (isset($entityFields['TITLE']) && $entityFields['TITLE'] !== '') { $completeness++; } if (isset($entityFields['ADDRESS']) && $entityFields['ADDRESS'] !== '') { $completeness++; } if (isset($entityFields['ADDRESS_LEGAL']) && $entityFields['ADDRESS_LEGAL'] !== '') { $completeness++; } } elseif ($entityTypeID === \CCrmOwnerType::Lead) { if (isset($entityFields['DATE_MODIFY']) && $entityFields['DATE_MODIFY'] !== '') { $lastChanged = MakeTimeStamp($entityFields['DATE_MODIFY']); } if (isset($entityFields['TITLE']) && $entityFields['TITLE'] !== '') { $completeness++; } if (isset($entityFields['COMPANY_TITLE']) && $entityFields['COMPANY_TITLE'] !== '') { $completeness++; } if (isset($entityFields['NAME']) && $entityFields['NAME'] !== '') { $completeness++; } if (isset($entityFields['SECOND_NAME']) && $entityFields['SECOND_NAME'] !== '') { $completeness++; } if (isset($entityFields['LAST_NAME']) && $entityFields['LAST_NAME'] !== '') { $completeness++; } if (isset($entityFields['ADDRESS']) && $entityFields['ADDRESS'] !== '') { $completeness++; } } else { throw new Main\NotSupportedException('Entity type: ' . \CCrmOwnerType::ResolveName($entityTypeID) . ' is not supported in current context'); } if ($lastChanged <= 0) { $lastChanged = time() + \CTimeZone::GetOffset(); } $completeness += count(DuplicateCommunicationCriterion::getRegisteredTypes($entityTypeID, $entityID)); Entity\DuplicateEntityStatisticsTable::upsert(array('ENTITY_TYPE_ID' => $entityTypeID, 'ENTITY_ID' => $entityID, 'RANKING_DATA' => serialize(array('LAST_CHANGED' => $lastChanged, 'COMPLETENESS' => $completeness)))); }
protected function getRegisteredEntityMatches($entityTypeID, $entityID) { $results = array(); $types = Integrity\DuplicateIndexBuilder::getExistedTypes($entityTypeID, $this->userID); foreach ($types as $typeID) { if ($typeID === Integrity\DuplicateIndexType::PERSON) { $results[$typeID] = Integrity\DuplicatePersonCriterion::getRegisteredEntityMatches($entityTypeID, $entityID); } elseif ($typeID === Integrity\DuplicateIndexType::ORGANIZATION) { $results[$typeID] = Integrity\DuplicateOrganizationCriterion::getRegisteredEntityMatches($entityTypeID, $entityID); } elseif ($typeID === Integrity\DuplicateIndexType::COMMUNICATION_EMAIL || $typeID === Integrity\DuplicateIndexType::COMMUNICATION_PHONE) { $results[$typeID] = Integrity\DuplicateCommunicationCriterion::getRegisteredEntityMatches($entityTypeID, $entityID, Integrity\DuplicateCommunicationCriterion::resolveTypeByIndexTypeID($typeID)); } } return $results; }
public static function RebuildDuplicateIndex($IDs) { if (!is_array($IDs)) { $IDs = array($IDs); } $dbResult = self::GetListEx(array(), array('@ID' => $IDs, 'CHECK_PERMISSIONS' => 'N'), false, false, array('ID', 'TITLE', 'COMPANY_TITLE', 'NAME', 'SECOND_NAME', 'LAST_NAME', 'ADDRESS', 'DATE_MODIFY')); if (!is_object($dbResult)) { return; } $emails = array(); $phones = array(); $dbResultMultiFields = CCrmFieldMulti::GetList(array('ID' => 'asc'), array('=ENTITY_ID' => CCrmOwnerType::LeadName, '@TYPE_ID' => array('EMAIL', 'PHONE'), '@ELEMENT_ID' => $IDs)); if (is_object($dbResultMultiFields)) { while ($multiFields = $dbResultMultiFields->Fetch()) { $elementID = isset($multiFields['ELEMENT_ID']) ? $multiFields['ELEMENT_ID'] : ''; $typeID = isset($multiFields['TYPE_ID']) ? $multiFields['TYPE_ID'] : ''; $value = isset($multiFields['VALUE']) ? $multiFields['VALUE'] : ''; if ($elementID === '' || $typeID === '' || $value === '') { continue; } if ($typeID === 'EMAIL') { if (!isset($emails[$elementID])) { $emails[$elementID] = array(); } $emails[$elementID][] = $value; } elseif ($typeID === 'PHONE') { if (!isset($phones[$elementID])) { $phones[$elementID] = array(); } $phones[$elementID][] = $value; } } } while ($fields = $dbResult->Fetch()) { $ID = intval($fields['ID']); $companyTitle = isset($fields['COMPANY_TITLE']) ? $fields['COMPANY_TITLE'] : ''; if ($companyTitle !== '') { \Bitrix\Crm\Integrity\DuplicateOrganizationCriterion::register(CCrmOwnerType::Lead, $ID, $companyTitle); } $lastName = isset($fields['LAST_NAME']) ? $fields['LAST_NAME'] : ''; if ($lastName !== '') { \Bitrix\Crm\Integrity\DuplicatePersonCriterion::register(CCrmOwnerType::Lead, $ID, $lastName, isset($fields['NAME']) ? $fields['NAME'] : '', isset($fields['SECOND_NAME']) ? $fields['SECOND_NAME'] : ''); } $key = strval($ID); if (isset($emails[$key])) { \Bitrix\Crm\Integrity\DuplicateCommunicationCriterion::register(CCrmOwnerType::Lead, $ID, 'EMAIL', $emails[$key]); } if (isset($phones[$key])) { \Bitrix\Crm\Integrity\DuplicateCommunicationCriterion::register(CCrmOwnerType::Lead, $ID, 'PHONE', $phones[$key]); } \Bitrix\Crm\Integrity\DuplicateEntityRanking::registerEntityStatistics(CCrmOwnerType::Lead, $ID, $fields); } }
protected function prepareSortParams(array $entityIDs) { $resut = array('PERS' => array(), 'ORG' => array(), 'COMM' => array()); if (!empty($entityIDs)) { $entityTypeID = $this->getEntityTypeID(); if ($entityTypeID === \CCrmOwnerType::Lead) { $resut['PERS'] = DuplicatePersonCriterion::prepareSortParams($entityTypeID, $entityIDs); $resut['ORG'] = DuplicateOrganizationCriterion::prepareSortParams($entityTypeID, $entityIDs); } elseif ($entityTypeID === \CCrmOwnerType::Contact) { $resut['PERS'] = DuplicatePersonCriterion::prepareSortParams($entityTypeID, $entityIDs); } elseif ($entityTypeID === \CCrmOwnerType::Company) { $resut['ORG'] = DuplicateOrganizationCriterion::prepareSortParams($entityTypeID, $entityIDs); } $resut['COMM'] = DuplicateCommunicationCriterion::prepareSortParams($entityTypeID, $entityIDs); } return $resut; }
unset($entityInfo['IMAGE_FILE_ID']); } } unset($entityInfo); } $totalsText = $criterion->getTextTotals(count($entityInfos), 50); $result = array('INDEX_TYPE_NAME' => Integrity\DuplicateIndexType::resolveName($typeID), 'ENTITY_TYPE_NAME' => $entityTypeName, 'ENTITY_INFOS' => array_values($entityInfos), 'TEXT_TOTALS' => $totalsText); __CrmDedupeListEndResonse($result); } elseif ($action === 'GET_DUPLICATE_ENTITY_MULTI_FIELDS') { $entityTypeID = isset($_POST['ENTITY_TYPE_NAME']) ? CCrmOwnerType::ResolveID($_POST['ENTITY_TYPE_NAME']) : CCrmOwnerType::Undefined; $entityTypeName = CCrmOwnerType::ResolveName($entityTypeID); $entityID = isset($_POST['ENTITY_ID']) ? (int) $_POST['ENTITY_ID'] : 0; if (!CCrmPerms::IsAdmin($currentUserID) && !CCrmAuthorizationHelper::CheckReadPermission($entityTypeName, $entityID)) { __CrmDedupeListEndResonse(array('ERROR' => 'Access denied.')); } $result = Integrity\DuplicateCommunicationCriterion::getRegisteredCodes($entityTypeID, $entityID, false, $currentUserID, 50); __CrmDedupeListEndResonse(array('MULTI_FIELDS' => $result)); } elseif ($action === 'REBUILD_DEDUPE_INDEX') { __IncludeLang(dirname(__FILE__) . '/lang/' . LANGUAGE_ID . '/' . basename(__FILE__)); $params = isset($_POST['PARAMS']) && is_array($_POST['PARAMS']) ? $_POST['PARAMS'] : array(); $contextID = isset($params['CONTEXT_ID']) ? $params['CONTEXT_ID'] : ''; if ($contextID === '') { __CrmDedupeListEndResonse(array('ERROR' => 'Context ID is not defined.')); } $entityTypeName = isset($params['ENTITY_TYPE_NAME']) ? $params['ENTITY_TYPE_NAME'] : ''; $entityTypeID = CCrmOwnerType::ResolveID($entityTypeName); if (!CCrmOwnerType::IsDefined($entityTypeID)) { __CrmDedupeListEndResonse(array('ERROR' => 'Entity type name is not defined or invalid.')); } $typeNames = isset($params['INDEX_TYPE_NAMES']) && is_array($params['INDEX_TYPE_NAMES']) ? $params['INDEX_TYPE_NAMES'] : array(); $typeIDs = array();
protected function findEntityMatches($entityTypeID, $entityID, $matchHash) { return DuplicateCommunicationCriterion::loadEntityMatches($entityTypeID, $entityID, $this->getCommunicationType()); }