From 607fe36692cfb497a94e778e68e36b078acad3d6 Mon Sep 17 00:00:00 2001 From: Eileen McNaughton Date: Fri, 10 Mar 2023 13:13:01 +1300 Subject: [PATCH] dev/core#4156 Fix failure to update organization_name on employees during merge --- CRM/Dedupe/Merger.php | 19 +++++++++++------ tests/phpunit/CRM/Dedupe/MergerTest.php | 27 +++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/CRM/Dedupe/Merger.php b/CRM/Dedupe/Merger.php index 7fdb55f585..b09c0c1bad 100644 --- a/CRM/Dedupe/Merger.php +++ b/CRM/Dedupe/Merger.php @@ -9,6 +9,7 @@ +--------------------------------------------------------------------+ */ +use Civi\Api4\Contact; use Civi\Api4\CustomGroup; /** @@ -685,7 +686,18 @@ INNER JOIN civicrm_membership membership2 ON membership1.membership_type_id = m // This parameter causes blank fields to be be emptied out. // We can probably remove. $params['updateBlankLocInfo'] = TRUE; + if (empty($params['contact_type']) || ($params['contact_type'] === 'Organization' && empty($params['organization_name']))) { + // Ensuring this is set addresses https://lab.civicrm.org/dev/core/-/issues/4156 + // but not that RM_Dedupe_MergerTest::testMergeWithEmployer covers this scenario + // so refactoring of this is safe. + $contact = Contact::get(FALSE)->addWhere('id', '=', $contactID)->addSelect('organization_name', 'contact_type')->execute()->first(); + $params['contact_type'] = $contact['contact_type']; + if (empty($params['organization_name']) && $params['contact_type'] === 'Organization') { + $params['organization_name'] = $contact['organization_name']; + } + } $data = self::formatProfileContactParams($params, $contactID); + CRM_Contact_BAO_Contact::create($data); } @@ -707,13 +719,12 @@ INNER JOIN civicrm_membership membership2 ON membership1.membership_type_id = m int $contactID ) { - $data = $contactDetails = []; + $data = ['contact_type' => $params['contact_type']]; // get the contact details (hier) $details = CRM_Contact_BAO_Contact::getHierContactDetails($contactID, []); $contactDetails = $details[$contactID]; - $data['contact_type'] = $contactDetails['contact_type'] ?? NULL; $data['contact_sub_type'] = $contactDetails['contact_sub_type'] ?? NULL; //fix contact sub type CRM-5125 @@ -993,10 +1004,6 @@ INNER JOIN civicrm_membership membership2 ON membership1.membership_type_id = m } } - if (!isset($data['contact_type'])) { - $data['contact_type'] = 'Individual'; - } - return $data; } diff --git a/tests/phpunit/CRM/Dedupe/MergerTest.php b/tests/phpunit/CRM/Dedupe/MergerTest.php index 9aad35e896..c821f75d18 100644 --- a/tests/phpunit/CRM/Dedupe/MergerTest.php +++ b/tests/phpunit/CRM/Dedupe/MergerTest.php @@ -1,5 +1,7 @@ callAPISuccess('Contact', 'create', [ 'id' => $duplicateContactID1, - "{$customFieldName}" => 'def', + $customFieldName => 'def', ]); $this->assertCustomFieldValue($duplicateContactID1, 'def', $customFieldName); @@ -1453,7 +1455,28 @@ WHERE CRM_Core_DAO_AllCoreTables::flush(); $contact1 = $this->individualCreate(); $contact2 = $this->individualCreate(['api.Im.create' => ['name' => 'chat_handle']]); - $this->callAPISuccess('Contact', 'merge', ['to_keep_id' => $contact1, 'to_remove_id' => $contact2]); + $this->callAPISuccess('Contact', 'merge', [ + 'to_keep_id' => $contact1, + 'to_remove_id' => $contact2, + ]); + } + + /** + * Test that organization name is updated for employees of merged organizations.. + * + * @throws \CRM_Core_Exception + */ + public function testMergeWithEmployer(): void { + $organizationToRemoveID = $this->organizationCreate(['organization_name' => 'remove']); + $organizationToKeepID = $this->organizationCreate(['organization_name' => 'keep']); + $individualID = $this->createContactWithEmployerRelationship([ + 'contact_id_b' => $organizationToRemoveID, + ]); + $employerName = Contact::get()->addSelect('organization_name')->addWhere('id', '=', $individualID)->execute()->first()['organization_name']; + $this->assertEquals('remove', $employerName); + $this->callAPISuccess('Contact', 'merge', ['to_keep_id' => $organizationToKeepID, 'to_remove_id' => $organizationToRemoveID, 'mode' => 'aggressive']); + $employerName = Contact::get()->addSelect('organization_name')->addWhere('id', '=', $individualID)->execute()->first()['organization_name']; + $this->assertEquals('keep', $employerName); } /** -- 2.25.1