diff --git a/api/v3/Contribution.php b/api/v3/Contribution.php index bbe016918144e5c0ad12852764d0970b6c4ff544..f80cd79d2944a2cb4d4117eef601dc50c7e831b2 100644 --- a/api/v3/Contribution.php +++ b/api/v3/Contribution.php @@ -488,7 +488,8 @@ function civicrm_api3_contribution_completetransaction($params) { elseif ($contribution->contribution_status_id == CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Completed')) { throw new API_Exception(ts('Contribution already completed'), 'contribution_completed'); } - $input['trxn_id'] = !empty($params['trxn_id']) ? $params['trxn_id'] : $contribution->trxn_id; + $input['trxn_id'] = $params['trxn_id'] ?? $contribution->trxn_id; + if (!empty($params['fee_amount'])) { $input['fee_amount'] = $params['fee_amount']; } diff --git a/tests/phpunit/api/v3/ContributionTest.php b/tests/phpunit/api/v3/ContributionTest.php index b5779446337865592541cd580a48ffa8b3c883dc..5de4e1caad346b98eb0fd19cfc3b93938bb25b66 100644 --- a/tests/phpunit/api/v3/ContributionTest.php +++ b/tests/phpunit/api/v3/ContributionTest.php @@ -2905,7 +2905,10 @@ class api_v3_ContributionTest extends CiviUnitTestCase { $this->callAPISuccess('contribution', 'completetransaction', ['id' => $contribution['id'], 'trxn_date' => date('Y-m-d')]); $contribution = $this->callAPISuccess('contribution', 'get', ['id' => $contribution['id'], 'sequential' => 1]); $this->assertEquals('Completed', $contribution['values'][0]['contribution_status']); - $this->assertEquals(date('Y-m-d'), date('Y-m-d', strtotime($contribution['values'][0]['receive_date']))); + // Make sure receive_date is original date and make sure payment date is today + $this->assertEquals('2012-05-11', date('Y-m-d', strtotime($contribution['values'][0]['receive_date']))); + $payment = $this->callAPISuccess('payment', 'get', ['contribution_id' => $contribution['id'], 'sequential' => 1]); + $this->assertEquals(date('Y-m-d'), date('Y-m-d', strtotime($payment['values'][0]['trxn_date']))); $mut->checkMailLog([ 'Receipt - Contribution', 'receipt_date:::' . date('Ymd'), @@ -3184,7 +3187,11 @@ class api_v3_ContributionTest extends CiviUnitTestCase { $this->assertEquals(1, $status); $mut->checkMailLog([ 'amount:::500.00', - 'receive_date:::20130201000000', + // The `receive_date` should remain as it was created. + // TODO: the latest payment transaction date (and maybe other details, + // such as amount and payment instrument) would be a useful token to make + // available. + 'receive_date:::20120511000000', "receipt_date:::\n", ]); $mut->stop(); @@ -4738,4 +4745,30 @@ class api_v3_ContributionTest extends CiviUnitTestCase { return $result; } + /** + * Make sure that recording a payment doesn't alter the receive_date of a + * pending contribution. + */ + public function testPaymentDontChangeReceiveDate() { + $params = [ + 'contact_id' => $this->_individualId, + 'total_amount' => 100, + 'receive_date' => '2020-02-02', + 'contribution_status_id' => 'Pending', + ]; + $contributionID = $this->contributionCreate($params); + $paymentParams = [ + 'contribution_id' => $contributionID, + 'total_amount' => 100, + 'trxn_date' => '2020-03-04', + ]; + $this->callAPISuccess('payment', 'create', $paymentParams); + + //check if contribution status is set to "Completed". + $contribution = $this->callAPISuccess('Contribution', 'getSingle', [ + 'id' => $contributionID, + ]); + $this->assertEquals('2020-02-02 00:00:00', $contribution['receive_date']); + } + } diff --git a/tests/phpunit/api/v3/PaymentTest.php b/tests/phpunit/api/v3/PaymentTest.php index c01bf4b60829a788b9f8e740af85491642485d2a..19ff25b8f1a833020f6bdf19583e457fef6da60d 100644 --- a/tests/phpunit/api/v3/PaymentTest.php +++ b/tests/phpunit/api/v3/PaymentTest.php @@ -1124,9 +1124,7 @@ class api_v3_PaymentTest extends CiviUnitTestCase { $this->assertEquals($trxnID, $contribution['trxn_id'], "Contribution trxn_id should have been set to that of the payment."); - // change $trxnDate for $receiveDate if we agree that transactions should NOT - // update contributions. - $this->assertEquals($trxnDate, $contribution['receive_date'], + $this->assertEquals($originalReceiveDate, $contribution['receive_date'], "Contribution receive date was changed, but should not have been."); $this->validateAllPayments();