From f6fc1b15afbc8bf5a2bf06441e0ae62c2bb3b188 Mon Sep 17 00:00:00 2001 From: Jamie McClelland <jm@mayfirst.org> Date: Tue, 19 Apr 2022 09:41:41 -0400 Subject: [PATCH] ensure checkbox custom fields on contributions import properly --- CRM/Contribute/Import/Parser/Contribution.php | 18 ++++---------- CRM/Import/Parser.php | 7 +----- .../Import/Parser/ContributionTest.php | 24 +++++++++++++++++++ 3 files changed, 29 insertions(+), 20 deletions(-) diff --git a/CRM/Contribute/Import/Parser/Contribution.php b/CRM/Contribute/Import/Parser/Contribution.php index b7ce5392c6..d8a23f9131 100644 --- a/CRM/Contribute/Import/Parser/Contribution.php +++ b/CRM/Contribute/Import/Parser/Contribution.php @@ -886,13 +886,7 @@ class CRM_Contribute_Import_Parser_Contribution extends CRM_Import_Parser { return CRM_Import_Parser::ERROR; } - if ($onDuplicate != CRM_Import_Parser::DUPLICATE_UPDATE) { - $formatted['custom'] = CRM_Core_BAO_CustomField::postProcess($formatted, - NULL, - 'Contribution' - ); - } - else { + if ($onDuplicate == CRM_Import_Parser::DUPLICATE_UPDATE) { //fix for CRM-2219 - Update Contribution // onDuplicate == CRM_Import_Parser::DUPLICATE_UPDATE if (!empty($paramValues['invoice_id']) || !empty($paramValues['trxn_id']) || !empty($paramValues['contribution_id'])) { @@ -901,15 +895,10 @@ class CRM_Contribute_Import_Parser_Contribution extends CRM_Import_Parser { 'trxn_id' => $paramValues['trxn_id'] ?? NULL, 'invoice_id' => $paramValues['invoice_id'] ?? NULL, ]; - $ids['contribution'] = CRM_Contribute_BAO_Contribution::checkDuplicateIds($dupeIds); if ($ids['contribution']) { $formatted['id'] = $ids['contribution']; - $formatted['custom'] = CRM_Core_BAO_CustomField::postProcess($formatted, - $formatted['id'], - 'Contribution' - ); //process note if (!empty($paramValues['note'])) { $noteID = []; @@ -953,8 +942,9 @@ class CRM_Contribute_Import_Parser_Contribution extends CRM_Import_Parser { } $formatted['id'] = $ids['contribution']; - $newContribution = CRM_Contribute_BAO_Contribution::create($formatted); - $this->_newContributions[] = $newContribution->id; + + $newContribution = civicrm_api3('contribution', 'create', $formatted); + $this->_newContributions[] = $newContribution['id']; //return soft valid since we need to show how soft credits were added if (!empty($formatted['soft_credit'])) { diff --git a/CRM/Import/Parser.php b/CRM/Import/Parser.php index eb05e31038..c219b269f6 100644 --- a/CRM/Import/Parser.php +++ b/CRM/Import/Parser.php @@ -993,12 +993,7 @@ abstract class CRM_Import_Parser { if ((strtolower(trim($customLabel['label'])) == strtolower(trim($v1))) || (strtolower(trim($customValue)) == strtolower(trim($v1))) ) { - if ($fieldType == 'CheckBox') { - $values[$customValue] = 1; - } - else { - $values[] = $customValue; - } + $values[] = $customValue; } } } diff --git a/tests/phpunit/CRM/Contribute/Import/Parser/ContributionTest.php b/tests/phpunit/CRM/Contribute/Import/Parser/ContributionTest.php index faac17af3f..03ff2e181d 100644 --- a/tests/phpunit/CRM/Contribute/Import/Parser/ContributionTest.php +++ b/tests/phpunit/CRM/Contribute/Import/Parser/ContributionTest.php @@ -220,6 +220,30 @@ class CRM_Contribute_Import_Parser_ContributionTest extends CiviUnitTestCase { $this->assertArrayHasKey('phone', $fields); } + /** + * Test custom multi-value checkbox field is imported properly. + */ + public function testCustomSerializedCheckBox(): void { + $this->createCustomGroupWithFieldOfType([], 'checkbox'); + $customField = $this->getCustomFieldName('checkbox'); + $contactID = $this->individualCreate(); + $values = ['contribution_contact_id' => $contactID, 'total_amount' => 10, 'financial_type' => 'Donation', $customField => 'L,V']; + $this->runImport($values, CRM_Import_Parser::DUPLICATE_SKIP, NULL); + $initialContribution = $this->callAPISuccessGetSingle('Contribution', ['contact_id' => $contactID]); + $this->assertContains('L', $initialContribution[$customField], "Contribution Duplicate Skip Import contains L"); + $this->assertContains('V', $initialContribution[$customField], "Contribution Duplicate Skip Import contains V"); + + // Now update. + $values['contribution_id'] = $initialContribution['id']; + $values[$customField] = 'V'; + $this->runImport($values, CRM_Import_Parser::DUPLICATE_UPDATE, NULL); + + $updatedContribution = $this->callAPISuccessGetSingle('Contribution', ['id' => $initialContribution['id']]); + $this->assertNotContains('L', $updatedContribution[$customField], "Contribution Duplicate Update Import does not contain L"); + $this->assertContains('V', $updatedContribution[$customField], "Contribution Duplicate Update Import contains V"); + + } + /** * Run the import parser. * -- 2.25.1