CRM-20678 Fix issue where repeattransaction was creating transactions in incorrect...
authorSeamus Lee <seamuslee001@gmail.com>
Sun, 11 Jun 2017 04:12:09 +0000 (14:12 +1000)
committerSeamus Lee <seamuslee001@gmail.com>
Sun, 11 Jun 2017 04:12:51 +0000 (14:12 +1000)
CRM/Contribute/BAO/Contribution.php
tests/phpunit/api/v3/ContributionTest.php

index 7e4cc23a423d6fb8c918148182560033972ff10d..c201c5aec178f066692e0b462c352200be13954b 100644 (file)
@@ -4531,6 +4531,12 @@ WHERE eft.financial_trxn_id IN ({$trxnId}, {$baseTrxnId['financialTrxnId']})
       'source' => self::getRecurringContributionDescription($contribution, $event),
     ), array_intersect_key($input, array_fill_keys($inputContributionWhiteList, 1)
     ));
+
+    // CRM-20678 Ensure that the currency is correct in subseqent transcations.
+    if (empty($contributionParams['currency']) && isset($objects['first_contribution']->currency)) {
+      $contributionParams['currency'] = $objects['first_contribution']->currency;
+    }
+
     $contributionParams['payment_processor'] = $input['payment_processor'] = $paymentProcessorId;
 
     // If paymentProcessor is not set then the payment_instrument_id would not be correct.
index 4fa292cbe5cefb4a08aafe40ce616b13f382e4f6..7d81aac3afebe6c274fbe24c7e017853f14c4379 100644 (file)
@@ -3462,7 +3462,7 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
    *
    * @return array
    */
-  protected function setUpRepeatTransaction($recurParams = array(), $flag) {
+  protected function setUpRepeatTransaction($recurParams = array(), $flag, $contributionParams = array()) {
     $paymentProcessorID = $this->paymentProcessorCreate();
     $contributionRecur = $this->callAPISuccess('contribution_recur', 'create', array_merge(array(
       'contact_id' => $this->_individualId,
@@ -3479,8 +3479,9 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
     $originalContribution = '';
     if ($flag == 'multiple') {
       // CRM-19309 create a contribution + also add in line_items (plural):
+      $params = array_merge($this->_params, $contributionParams);
       $originalContribution = $this->callAPISuccess('contribution', 'create', array_merge(
-          $this->_params,
+          $params,
           array(
             'contribution_recur_id' => $contributionRecur['id'],
             'skipLineItem' => 1,
@@ -3505,10 +3506,9 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
       );
     }
     elseif ($flag == 'single') {
-      $originalContribution = $this->callAPISuccess('contribution', 'create', array_merge(
-          $this->_params,
-          array('contribution_recur_id' => $contributionRecur['id']))
-      );
+      $params = array_merge($this->_params, array('contribution_recur_id' => $contributionRecur['id']));
+      $params = array_merge($params, $contributionParams);
+      $originalContribution = $this->callAPISuccess('contribution', 'create', $params);
     }
     $originalContribution['payment_processor_id'] = $paymentProcessorID;
     return $originalContribution;
@@ -3796,4 +3796,18 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
     $this->assertEquals(CRM_Utils_Array::value('pan_truncation', $financialTrxn), 2345);
   }
 
+  /**
+   * Test repeat contribution uses non default currency
+   * @see https://issues.civicrm.org/jira/projects/CRM/issues/CRM-20678
+   */
+  public function testRepeatTransactionWithDifferenceCurrency() {
+    $originalContribution = $this->setUpRepeatTransaction(array('currency' => 'AUD'), 'single', array('currency' => 'AUD'));
+    $contribution = $this->callAPISuccess('contribution', 'repeattransaction', array(
+      'original_contribution_id' => $originalContribution['id'],
+      'contribution_status_id' => 'Completed',
+      'trxn_id' => uniqid(),
+    ));
+    $this->assertEquals('AUD', $contribution['values'][$contribution['id']]['currency']);
+  }
+
 }