Merge pull request #23508 from eileenmcnaughton/import_subkid
authorcolemanw <coleman@civicrm.org>
Fri, 20 May 2022 21:38:35 +0000 (17:38 -0400)
committerGitHub <noreply@github.com>
Fri, 20 May 2022 21:38:35 +0000 (17:38 -0400)
[Import] Fix & test check on contact subtype change

1  2 
CRM/Contact/Import/Parser/Contact.php
tests/phpunit/CRM/Contact/Import/Parser/ContactTest.php

index 62f6bbb23caddb2b94acd88d4bc90e24a0cf8159,c8a42688cd5320c5fc9ccd8e4651a7f54f4a5437..1d66be5885ba915b14da19a8a180c7c36bee7983
@@@ -442,8 -307,30 +442,18 @@@ class CRM_Contact_Import_Parser_Contac
  
      $params['contact_sub_type'] = $this->getContactSubType() ?: ($params['contact_sub_type'] ?? NULL);
  
 -    if ($params['contact_sub_type']) {
 -      if (CRM_Contact_BAO_ContactType::isExtendsContactType($params['contact_sub_type'], $this->getContactType(), FALSE, 'label')) {
 -        // I think this bit is switching a passed in label to
 -        // a name.
 -        $subTypes = CRM_Contact_BAO_ContactType::subTypePairs($this->getContactType(), FALSE, NULL);
 -        $params['contact_sub_type'] = array_search($params['contact_sub_type'], $subTypes);
 -      }
 -    }
 -
      try {
 -      if ($params['contact_sub_type'] && !CRM_Contact_BAO_ContactType::isExtendsContactType($params['contact_sub_type'], $this->getContactType())) {
 -        throw new CRM_Core_Exception('Mismatched or Invalid Contact Subtype.', CRM_Import_Parser::NO_MATCH);
 -      }
        $params['id'] = $formatted['id'] = $this->lookupContactID($params, ($this->isSkipDuplicates() || $this->isIgnoreDuplicates()));
+       if ($params['id'] && $params['contact_sub_type']) {
+         $contactSubType = Contact::get(FALSE)
+           ->addWhere('id', '=', $params['id'])
+           ->addSelect('contact_sub_type')
+           ->execute()
+           ->first()['contact_sub_type'];
+         if (!empty($contactSubType) && $contactSubType[0] !== $params['contact_sub_type'] && !CRM_Contact_BAO_ContactType::isAllowEdit($params['id'], $contactSubType[0])) {
+           throw new CRM_Core_Exception('Mismatched contact SubTypes :', CRM_Import_Parser::NO_MATCH);
+         }
+       }
      }
      catch (CRM_Core_Exception $e) {
        $statuses = [CRM_Import_Parser::DUPLICATE => 'DUPLICATE', CRM_Import_Parser::ERROR => 'ERROR', CRM_Import_Parser::NO_MATCH => 'invalid_no_match'];
        // could be removed in favour of a simple check for whether the contact_type & id match
        $matchedIDs = $this->getIdsOfMatchingContacts($formatted);
        if (!empty($matchedIDs)) {
-         if (count($matchedIDs) >= 1) {
-           $updateflag = TRUE;
-           foreach ($matchedIDs as $contactId) {
-             if ($params['id'] == $contactId) {
-               //validation of subtype for update mode
-               //CRM-5125
-               $contactSubType = NULL;
-               if (!empty($params['contact_sub_type'])) {
-                 $contactSubType = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $params['id'], 'contact_sub_type');
-               }
  
-               if (!empty($contactSubType) && (!CRM_Contact_BAO_ContactType::isAllowEdit($params['id'], $contactSubType) && $contactSubType != CRM_Utils_Array::value('contact_sub_type', $formatted))) {
-                 $message = "Mismatched contact SubTypes :";
-                 array_unshift($values, $message);
-                 $updateflag = FALSE;
-                 $this->_retCode = CRM_Import_Parser::NO_MATCH;
-               }
-               else {
-                 $updateflag = FALSE;
-                 $this->_retCode = CRM_Import_Parser::VALID;
-               }
-             }
-           }
-           if ($updateflag) {
-             $message = "Mismatched contact IDs OR Mismatched contact Types :";
-             array_unshift($values, $message);
-             $this->_retCode = CRM_Import_Parser::NO_MATCH;
-           }
-         }
        }
 -      else {
 -        if (!empty($params['id'])) {
 -          //validation of subtype for update mode
 -          //CRM-5125
 -          $contactSubType = NULL;
 -          if (!empty($params['contact_sub_type'])) {
 -            $contactSubType = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $params['id'], 'contact_sub_type');
 -          }
 -
 -          if (!empty($contactSubType) && (!CRM_Contact_BAO_ContactType::isAllowEdit($params['id'], $contactSubType) && $contactSubType != CRM_Utils_Array::value('contact_sub_type', $formatted))) {
 -
 -            $message = "Mismatched contact SubTypes :";
 -            array_unshift($values, $message);
 -            $this->_retCode = CRM_Import_Parser::NO_MATCH;
 -          }
 -          else {
 -            $newContact = $this->createContact($formatted, $contactFields, $onDuplicate, $params['id'], FALSE, $this->_dedupeRuleGroupID);
 -            $this->_retCode = CRM_Import_Parser::VALID;
 -          }
 -        }
 -        else {
 -          //CRM-4148
 -          //now we want to create new contact on update/fill also.
 -          $createNewContact = TRUE;
 -        }
 -      }
 -
 -      if (isset($newContact) && is_a($newContact, 'CRM_Contact_BAO_Contact')) {
 -        $relationship = TRUE;
 -      }
      }
  
      //fixed CRM-4148