Exemplo n.º 1
0
 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");
 }
Exemplo n.º 2
0
 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;
 }
Exemplo n.º 3
0
     }
     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))));
 }
Exemplo n.º 5
0
 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;
 }
Exemplo n.º 6
0
 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);
     }
 }
Exemplo n.º 7
0
 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;
 }
Exemplo n.º 8
0
                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());
 }