ensure checkbox custom fields on contributions import properly
authorJamie McClelland <jm@mayfirst.org>
Tue, 19 Apr 2022 13:41:41 +0000 (09:41 -0400)
committerJamie McClelland <jm@mayfirst.org>
Wed, 20 Apr 2022 00:37:06 +0000 (20:37 -0400)
CRM/Contribute/Import/Parser/Contribution.php
CRM/Import/Parser.php
tests/phpunit/CRM/Contribute/Import/Parser/ContributionTest.php

index b7ce5392c6dd923eda8b231bf9b4b37a74b6b4e7..d8a23f91311f9bfd763b46fc81f599d255a5c3b9 100644 (file)
@@ -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'])) {
index eb05e31038232aa0d9db4793cda1bf9e98d7e3f1..c219b269f6761e0f1e734d1e1aa4c95594bac4bc 100644 (file)
@@ -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;
         }
       }
     }
index faac17af3f817394479870f7d0fcac8e662db434..03ff2e181d51306d368346c6b17017d7b8ad0da0 100644 (file)
@@ -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.
    *