From f7ab4201ef4c557909a7a5d076a5fce956442932 Mon Sep 17 00:00:00 2001 From: Matthew Wire Date: Thu, 15 Dec 2022 21:46:42 +0000 Subject: [PATCH] Allow activity import matching source/target contact on external ID --- CRM/Activity/Import/Parser/Activity.php | 11 +++++-- CRM/Import/Forms.php | 2 +- CRM/Import/Parser.php | 2 +- .../Activity/Import/Parser/ActivityTest.php | 30 +++++++++++++++++++ .../data/activityexternalidentifier.csv | 2 ++ 5 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 tests/phpunit/CRM/Activity/Import/Parser/data/activityexternalidentifier.csv diff --git a/CRM/Activity/Import/Parser/Activity.php b/CRM/Activity/Import/Parser/Activity.php index 0517dd1abb..129a0ca9b1 100644 --- a/CRM/Activity/Import/Parser/Activity.php +++ b/CRM/Activity/Import/Parser/Activity.php @@ -64,6 +64,10 @@ class CRM_Activity_Import_Parser_Activity extends CRM_Import_Parser { try { $params = $this->getMappedRow($values); + if (!empty($params['source_contact_external_identifier'])) { + $params['source_contact_id'] = $this->lookupExternalIdentifier($params['source_contact_external_identifier'], $this->getContactType(), $params['contact_id'] ?? NULL); + } + if (empty($params['external_identifier']) && empty($params['target_contact_id'])) { // Retrieve contact id using contact dedupe rule. @@ -169,7 +173,7 @@ class CRM_Activity_Import_Parser_Activity extends CRM_Import_Parser { } if ($mappedField['name']) { $fieldName = $this->getFieldMetadata($mappedField['name'])['name']; - if (in_array($mappedField['name'], ['target_contact_id', 'source_contact_id'])) { + if (in_array($mappedField['name'], ['target_contact_id', 'source_contact_id', 'source_contact_external_identifier'])) { $fieldName = $mappedField['name']; } $params[$fieldName] = $this->getTransformedFieldValue($mappedField['name'], $values[$i]); @@ -217,7 +221,10 @@ class CRM_Activity_Import_Parser_Activity extends CRM_Import_Parser { } } $tmpContactField['external_identifier'] = $contactFields['external_identifier']; - $tmpContactField['external_identifier']['title'] = $contactFields['external_identifier']['title'] . ' (match to contact)'; + $tmpContactField['external_identifier']['title'] = $contactFields['external_identifier']['title'] . ' (target contact)' . ' (match to contact)'; + $tmpContactField['source_contact_external_identifier'] = $contactFields['external_identifier']; + $tmpContactField['source_contact_external_identifier']['title'] = $contactFields['external_identifier']['title'] . ' (source contact)' . ' (match to contact)'; + $fields = array_merge($fields, $tmpContactField); $fields = array_merge($fields, $tmpFields); $fields = array_merge($fields, CRM_Core_BAO_CustomField::getFieldsForImport('Activity')); diff --git a/CRM/Import/Forms.php b/CRM/Import/Forms.php index 41e5654728..f1b84b984e 100644 --- a/CRM/Import/Forms.php +++ b/CRM/Import/Forms.php @@ -744,7 +744,7 @@ class CRM_Import_Forms extends CRM_Core_Form { // https://lab.civicrm.org/dev/core/-/issues/4317#note_91322 $name = str_replace('_.', '~~', $name); $name = str_replace('.', '__', $name); - $return[$name] = $field['html']['label'] ?? $field['title']; + $return[$name] = $field['title']; } return $return; } diff --git a/CRM/Import/Parser.php b/CRM/Import/Parser.php index 170f1e5b52..f8ec36d4e4 100644 --- a/CRM/Import/Parser.php +++ b/CRM/Import/Parser.php @@ -208,7 +208,7 @@ abstract class CRM_Import_Parser implements UserJobInterface { * @return string */ protected function getContactType(): string { - return $this->getSubmittedValue('contactType') ?: $this->getContactTypeForEntity('Contact'); + return $this->getSubmittedValue('contactType') ?: $this->getContactTypeForEntity('Contact') ?? ''; } /** diff --git a/tests/phpunit/CRM/Activity/Import/Parser/ActivityTest.php b/tests/phpunit/CRM/Activity/Import/Parser/ActivityTest.php index f37404e5b9..dc3aec82e7 100644 --- a/tests/phpunit/CRM/Activity/Import/Parser/ActivityTest.php +++ b/tests/phpunit/CRM/Activity/Import/Parser/ActivityTest.php @@ -348,6 +348,36 @@ class CRM_Activity_Import_Parser_ActivityTest extends CiviUnitTestCase { $this->callAPISuccessGetSingle('Activity', ['priority_id' => 'Urgent']); } + /** + * Test the full form-flow import and make sure we can map source/target external identifier correctly. + */ + public function testImportCSVExternalIdentifier() :void { + $contactID1 = $this->individualCreate(['email' => 'mum@example.com', 'external_identifier' => 'individual1']); + $contactID2 = $this->individualCreate(['email' => 'mum@example.com', 'external_identifier' => 'individual2'], 'individual_2'); + $this->importCSV('activityexternalidentifier.csv', [ + ['name' => 'activity_date_time'], + ['name' => 'activity_status_id'], + ['name' => 'email'], + ['name' => 'activity_type_id'], + ['name' => 'activity_details'], + ['name' => 'activity_duration'], + ['name' => 'priority_id'], + ['name' => 'activity_location'], + ['name' => 'activity_subject'], + ['name' => 'do_not_import'], + ['name' => 'source_contact_external_identifier'], + ['name' => 'external_identifier'], + ]); + $dataSource = new CRM_Import_DataSource_CSV($this->userJobID); + $row = $dataSource->getRow(); + $this->assertEquals('IMPORTED', $row['_status']); + $activity = $this->callAPISuccessGetSingle('Activity', ['priority_id' => 'Urgent']); + $activityContacts = $this->callAPISuccess('ActivityContact', 'get', ['activity_id' => $activity['id'], 'sequential' => TRUE]); + $this->assertCount(2, $activityContacts['values']); + $this->assertEquals($activityContacts['values'][0]['contact_id'], $contactID1); + $this->assertEquals($activityContacts['values'][1]['contact_id'], $contactID2); + } + /** * @param array $submittedValues * diff --git a/tests/phpunit/CRM/Activity/Import/Parser/data/activityexternalidentifier.csv b/tests/phpunit/CRM/Activity/Import/Parser/data/activityexternalidentifier.csv new file mode 100644 index 0000000000..ba65aeed20 --- /dev/null +++ b/tests/phpunit/CRM/Activity/Import/Parser/data/activityexternalidentifier.csv @@ -0,0 +1,2 @@ +Activity Date,Activity Status,Email (match to contact),Activity Type,Details,Duration,Priority,Location,Subject,Blah,source,target +2022-12-07 07:55:56,Completed,mum@example.com,Email,Some stuff,77,Urgent,Phoned up,Long chat,ignore,individual1,individual2 -- 2.25.1