diff --git a/CRM/Contact/Import/Parser/Contact.php b/CRM/Contact/Import/Parser/Contact.php index dc3441baaad2..7d079a8c5a3d 100644 --- a/CRM/Contact/Import/Parser/Contact.php +++ b/CRM/Contact/Import/Parser/Contact.php @@ -1690,7 +1690,51 @@ public function createContact(&$formatted, &$contactFields, $onDuplicate, $conta // Resetting and rebuilding cache could be expensive. CRM_Core_Config::setPermitCacheFlushMode(FALSE); - $cid = CRM_Contact_BAO_Contact::createProfileContact($formatted, $contactFields, $contactId, NULL, NULL, $formatted['contact_type']); + + // If a user has logged in, or accessed via a checksum + // Then deliberately 'blanking' a value in the profile should remove it from their record + // @todo this should either be TRUE or FALSE in the context of import - once + // we figure out which we can remove all the rest. + // Also note the meaning of this parameter is less than it used to + // be following block cleanup. + $formatted['updateBlankLocInfo'] = TRUE; + if ((CRM_Core_Session::singleton()->get('authSrc') & (CRM_Core_Permission::AUTH_SRC_CHECKSUM + CRM_Core_Permission::AUTH_SRC_LOGIN)) == 0) { + $formatted['updateBlankLocInfo'] = FALSE; + } + + list($data, $contactDetails) = CRM_Contact_BAO_Contact::formatProfileContactParams($formatted, $contactFields, $contactId, NULL, $formatted['contact_type']); + + // manage is_opt_out + if (array_key_exists('is_opt_out', $contactFields) && array_key_exists('is_opt_out', $formatted)) { + $wasOptOut = $contactDetails['is_opt_out'] ?? FALSE; + $isOptOut = $formatted['is_opt_out']; + $data['is_opt_out'] = $isOptOut; + // on change, create new civicrm_subscription_history entry + if (($wasOptOut != $isOptOut) && !empty($contactDetails['contact_id'])) { + $shParams = [ + 'contact_id' => $contactDetails['contact_id'], + 'status' => $isOptOut ? 'Removed' : 'Added', + 'method' => 'Web', + ]; + CRM_Contact_BAO_SubscriptionHistory::create($shParams); + } + } + + $contact = CRM_Contact_BAO_Contact::create($data); + $cid = $contact->id; + + // Process group and tag + if (isset($formatted['group'])) { + $method = 'Admin'; + CRM_Contact_BAO_GroupContact::create($formatted['group'], $cid, FALSE, $method); + } + + if (!empty($fields['tag']) && array_key_exists('tag', $formatted)) { + // Convert comma separated form values from select2 v3 + $tags = is_array($formatted['tag']) ? $formatted['tag'] : array_fill_keys(array_filter(explode(',', $formatted['tag'])), 1); + CRM_Core_BAO_EntityTag::create($tags, 'civicrm_contact', $cid); + } + CRM_Core_Config::setPermitCacheFlushMode(TRUE); $contact = [