Fix code to not overwrite source contribution - unit test for 17455
authorJitendra Purohit <jitendra@fuzion.co.nz>
Wed, 15 Jul 2020 10:12:30 +0000 (15:42 +0530)
committereileen <emcnaughton@wikimedia.org>
Sun, 2 Aug 2020 21:39:15 +0000 (09:39 +1200)
CRM/Contribute/BAO/Contribution.php
tests/phpunit/CRM/Contribute/BAO/ContributionRecurTest.php

index 831f5e86aae6e73ff0fc762c5624b200fc49f0c7..84da2280dce92c27fe0d19e9a44d4d7c3e41cb81 100644 (file)
@@ -2575,12 +2575,11 @@ LEFT JOIN  civicrm_contribution contribution ON ( componentPayment.contribution_
    * @param CRM_Contribute_BAO_Contribution $contribution
    * @param array $input
    * @param array $contributionParams
-   * @param int $paymentProcessorID
    *
-   * @return bool
+   * @return bool|array
    * @throws CiviCRM_API3_Exception
    */
-  protected static function repeatTransaction(&$contribution, &$input, $contributionParams, $paymentProcessorID) {
+  protected static function repeatTransaction(&$contribution, &$input, $contributionParams) {
     if (!empty($contribution->id)) {
       return FALSE;
     }
@@ -2638,7 +2637,7 @@ LEFT JOIN  civicrm_contribution contribution ON ( componentPayment.contribution_
       $contribution->id = $createContribution['id'];
       $contribution->copyCustomFields($templateContribution['id'], $contribution->id);
       self::handleMembershipIDOverride($contribution->id, $input);
-      return TRUE;
+      return $createContribution;
     }
   }
 
@@ -4486,7 +4485,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
     }
     $changeDate = CRM_Utils_Array::value('trxn_date', $input, date('YmdHis'));
 
-    self::repeatTransaction($contribution, $input, $contributionParams, $paymentProcessorId);
+    $contributionResult = self::repeatTransaction($contribution, $input, $contributionParams);
     $contributionParams['financial_type_id'] = $contribution->financial_type_id;
 
     $values = [];
@@ -4534,7 +4533,9 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
     // CRM-19309 - if you update the contribution here with financial_type_id it can/will mess with $lineItem
     // unsetting it here does NOT cause any other contribution test to fail!
     unset($contributionParams['financial_type_id']);
-    $contributionResult = civicrm_api3('Contribution', 'create', $contributionParams);
+    if (!$contributionResult) {
+      $contributionResult = civicrm_api3('Contribution', 'create', $contributionParams);
+    }
 
     // Add new soft credit against current $contribution.
     if (!empty($objects['contributionRecur']) && $objects['contributionRecur']->id) {
index f5c9d4fe34b5c0c0916763ff2589b981957c7ada..d2bf0d85e9aec64c212f240f74383d0ec77814cc 100644 (file)
@@ -225,6 +225,7 @@ class CRM_Contribute_BAO_ContributionRecurTest extends CiviUnitTestCase {
       'contribution_recur_id' => $contributionRecur['id'],
       'total_amount' => '3.00',
       'financial_type_id' => 1,
+      'source' => 'Template Contribution',
       'payment_instrument_id' => 1,
       'currency' => 'USD',
       'contact_id' => $this->individualCreate(),
@@ -237,6 +238,7 @@ class CRM_Contribute_BAO_ContributionRecurTest extends CiviUnitTestCase {
       'contribution_recur_id' => $contributionRecur['id'],
       'total_amount' => '3.00',
       'financial_type_id' => 1,
+      'source' => 'Non-template Contribution',
       'payment_instrument_id' => 1,
       'currency' => 'USD',
       'contact_id' => $this->individualCreate(),
@@ -246,6 +248,12 @@ class CRM_Contribute_BAO_ContributionRecurTest extends CiviUnitTestCase {
     $fetchedTemplate = CRM_Contribute_BAO_ContributionRecur::getTemplateContribution($contributionRecur['id']);
     // Fetched template should be the is_template, not the latest contrib
     $this->assertEquals($fetchedTemplate['id'], $templateContrib['id']);
+
+    $repeatContribution = $this->callAPISuccess('Contribution', 'repeattransaction', [
+      'contribution_status_id' => 'Completed',
+      'contribution_recur_id' => $contributionRecur['id'],
+    ]);
+    $this->assertEquals('Template Contribution', $repeatContribution['values'][$repeatContribution['id']]['source']);
   }
 
   /**