diff --git a/CRM/Contribute/BAO/Contribution.php b/CRM/Contribute/BAO/Contribution.php index 2ce7c31a3000..09e2fba30197 100644 --- a/CRM/Contribute/BAO/Contribution.php +++ b/CRM/Contribute/BAO/Contribution.php @@ -388,7 +388,7 @@ public static function calculateMissingAmountParams(&$params, $contributionID) { // net_amount may need adjusting. $contribution = civicrm_api3('Contribution', 'getsingle', array( 'id' => $contributionID, - 'return' => array('total_amount', 'net_amount'), + 'return' => array('total_amount', 'net_amount', 'fee_amount'), )); $totalAmount = isset($params['total_amount']) ? $params['total_amount'] : CRM_Utils_Array::value('total_amount', $contribution); $feeAmount = isset($params['fee_amount']) ? $params['fee_amount'] : CRM_Utils_Array::value('fee_amount', $contribution); diff --git a/tests/phpunit/api/v3/ContributionTest.php b/tests/phpunit/api/v3/ContributionTest.php index 3f7294e023ad..ebffd99ff2cd 100644 --- a/tests/phpunit/api/v3/ContributionTest.php +++ b/tests/phpunit/api/v3/ContributionTest.php @@ -1628,6 +1628,65 @@ public function testCreateUpdateContribution() { $this->assertAPISuccess($result); } + /** + * Check that net_amount is updated when a contribution is updated. + * + * Update fee amount AND total amount, just fee amount, just total amount + * and neither to check that net_amount is keep updated. + */ + public function testUpdateContributionNetAmountVariants() { + $contributionID = $this->contributionCreate(['contact_id' => $this->individualCreate()]); + + $this->callAPISuccess('Contribution', 'create', [ + 'id' => $contributionID, + 'total_amount' => 90, + 'fee_amount' => 6, + ]); + $contribution = $this->callAPISuccessGetSingle('Contribution', [ + 'id' => $contributionID, + 'return' => ['net_amount', 'fee_amount', 'total_amount'], + ]); + $this->assertEquals(6, $contribution['fee_amount']); + $this->assertEquals(90, $contribution['total_amount']); + $this->assertEquals(84, $contribution['net_amount']); + + $this->callAPISuccess('Contribution', 'create', [ + 'id' => $contributionID, + 'fee_amount' => 3, + ]); + $contribution = $this->callAPISuccessGetSingle('Contribution', [ + 'id' => $contributionID, + 'return' => ['net_amount', 'fee_amount', 'total_amount'], + ]); + $this->assertEquals(3, $contribution['fee_amount']); + $this->assertEquals(90, $contribution['total_amount']); + $this->assertEquals(87, $contribution['net_amount']); + + $this->callAPISuccess('Contribution', 'create', [ + 'id' => $contributionID, + 'total_amount' => 200, + ]); + $contribution = $this->callAPISuccessGetSingle('Contribution', [ + 'id' => $contributionID, + 'return' => ['net_amount', 'fee_amount', 'total_amount'], + ]); + $this->assertEquals(3, $contribution['fee_amount']); + $this->assertEquals(200, $contribution['total_amount']); + $this->assertEquals(197, $contribution['net_amount']); + + $this->callAPISuccess('Contribution', 'create', [ + 'id' => $contributionID, + 'payment_instrument' => 'Cash' + ]); + $contribution = $this->callAPISuccessGetSingle('Contribution', [ + 'id' => $contributionID, + 'return' => ['net_amount', 'fee_amount', 'total_amount'], + ]); + $this->assertEquals(3, $contribution['fee_amount']); + $this->assertEquals(200, $contribution['total_amount']); + $this->assertEquals(197, $contribution['net_amount']); + } + /** * Attempt (but fail) to delete a contribution without parameters. */