diff --git a/CRM/Contact/Import/Parser/Contact.php b/CRM/Contact/Import/Parser/Contact.php index 137d61d88a0e5c5747743abce3ac4cbcca300c43..172280834b66f164c6c62561b014f024eecf430c 100644 --- a/CRM/Contact/Import/Parser/Contact.php +++ b/CRM/Contact/Import/Parser/Contact.php @@ -194,7 +194,7 @@ class CRM_Contact_Import_Parser_Contact extends CRM_Import_Parser { $extraFields['related_contact_matched']++; } } - $this->setImportStatus($rowNumber, $this->getStatus(CRM_Import_Parser::VALID), $this->getSuccessMessage(), $contactID, $extraFields); + $this->setImportStatus($rowNumber, $this->getStatus(CRM_Import_Parser::VALID), $this->getSuccessMessage(), $contactID, $extraFields, [$contactID]); return CRM_Import_Parser::VALID; } diff --git a/CRM/Import/Parser.php b/CRM/Import/Parser.php index 753f0a5077d51450b39b9da6ec5284f468aa258d..5c0876082fe1a2ebfcab52aec432e0551fc66579 100644 --- a/CRM/Import/Parser.php +++ b/CRM/Import/Parser.php @@ -1994,11 +1994,18 @@ abstract class CRM_Import_Parser { * Optional created entity ID * @param array $additionalFields * Additional fields to be tracked + * @param array $createdContactIDs * * @noinspection PhpDocMissingThrowsInspection * @noinspection PhpUnhandledExceptionInspection */ - protected function setImportStatus(int $id, string $status, string $message = '', ?int $entityID = NULL, $additionalFields = []): void { + protected function setImportStatus(int $id, string $status, string $message = '', ?int $entityID = NULL, $additionalFields = [], $createdContactIDs = []): void { + foreach ($createdContactIDs as $createdContactID) { + // Store any created contacts for post_actions like tag or add to group. + // These are done on a 'per-batch' status in processPorstActions + // so holding in a property is OK. + $this->createdContacts[$createdContactID] = $createdContactID; + } $this->getDataSourceObject()->updateStatus($id, $status, $message, $entityID, $additionalFields); } diff --git a/tests/phpunit/CRM/Contact/Import/Form/data/contact_id_only.csv b/tests/phpunit/CRM/Contact/Import/Form/data/contact_id_only.csv new file mode 100644 index 0000000000000000000000000000000000000000..63e41e1f5be9d72e7d8f2e937b30b0f451b0b1fa --- /dev/null +++ b/tests/phpunit/CRM/Contact/Import/Form/data/contact_id_only.csv @@ -0,0 +1,2 @@ +Contact ID +3 diff --git a/tests/phpunit/CRM/Contact/Import/Parser/ContactTest.php b/tests/phpunit/CRM/Contact/Import/Parser/ContactTest.php index 5f70b8b6e4c837b88a9831b64076d2bb9d16ba70..4f30f10a37feb43c81edd2d2f89be466590d249c 100644 --- a/tests/phpunit/CRM/Contact/Import/Parser/ContactTest.php +++ b/tests/phpunit/CRM/Contact/Import/Parser/ContactTest.php @@ -18,6 +18,8 @@ use Civi\Api4\Address; use Civi\Api4\Contact; use Civi\Api4\ContactType; use Civi\Api4\Email; +use Civi\Api4\Group; +use Civi\Api4\GroupContact; use Civi\Api4\IM; use Civi\Api4\LocationType; use Civi\Api4\OpenID; @@ -1068,6 +1070,22 @@ class CRM_Contact_Import_Parser_ContactTest extends CiviUnitTestCase { } } + /** + * @throws \API_Exception + * @throws \CRM_Core_Exception + */ + public function testImportContactToGroup(): void { + $this->individualCreate(); + $this->importCSV('contact_id_only.csv', [['id']], [ + 'newGroupName' => 'My New Group', + ]); + $dataSource = new CRM_Import_DataSource_CSV(UserJob::get(FALSE)->setSelect(['id'])->execute()->first()['id']); + $row = $dataSource->getRow(); + $this->assertEquals('IMPORTED', $row['_status']); + $group = Group::get()->addWhere('title', '=', 'My New Group')->execute()->first(); + $this->assertCount(1, GroupContact::get()->addWhere('group_id', '=', $group['id'])->execute()); + } + /** * Get combinations to test for validation. * @@ -2065,11 +2083,18 @@ class CRM_Contact_Import_Parser_ContactTest extends CiviUnitTestCase { 'groups' => [], ], $submittedValues); $form = $this->getFormObject('CRM_Contact_Import_Form_DataSource', $submittedValues); + $values = $_SESSION['_' . $form->controller->_name . '_container']['values']; + $form->buildForm(); $form->postProcess(); $this->userJobID = $form->getUserJobID(); + + // This gets reset in DataSource so re-do.... + $_SESSION['_' . $form->controller->_name . '_container']['values'] = $values; + /* @var CRM_Contact_Import_Form_MapField $form */ $form = $this->getFormObject('CRM_Contact_Import_Form_MapField', $submittedValues); + $form->setUserJobID($this->userJobID); $form->buildForm(); $form->postProcess();