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