diff --git a/CRM/Contribute/BAO/Contribution.php b/CRM/Contribute/BAO/Contribution.php index 6b7ae24cf49da5e35fce1f2f97fb281ed2515b03..a057a9674bd90de1fdd523286c4dbe31c846debf 100644 --- a/CRM/Contribute/BAO/Contribution.php +++ b/CRM/Contribute/BAO/Contribution.php @@ -3788,15 +3788,17 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac elseif ($previousLineItemTotal != $lineItemDetails['line_total']) { $taxAmount -= CRM_Utils_Array::value('tax_amount', CRM_Utils_Array::value($fieldValueId, $previousLineItems), 0); } - $itemParams['amount'] = self::getMultiplier($params['contribution']->contribution_status_id, $context) * $taxAmount; - $itemParams['description'] = $taxTerm; - if ($lineItemDetails['financial_type_id']) { - $itemParams['financial_account_id'] = CRM_Contribute_PseudoConstant::getRelationalFinancialAccount( - $lineItemDetails['financial_type_id'], - 'Sales Tax Account is' - ); + if ($taxAmount != 0) { + $itemParams['amount'] = self::getMultiplier($params['contribution']->contribution_status_id, $context) * $taxAmount; + $itemParams['description'] = $taxTerm; + if ($lineItemDetails['financial_type_id']) { + $itemParams['financial_account_id'] = CRM_Contribute_PseudoConstant::getRelationalFinancialAccount( + $lineItemDetails['financial_type_id'], + 'Sales Tax Account is' + ); + } + CRM_Financial_BAO_FinancialItem::create($itemParams, NULL, $trxnIds); } - CRM_Financial_BAO_FinancialItem::create($itemParams, NULL, $trxnIds); } } } diff --git a/tests/phpunit/CRM/Contribute/BAO/ContributionTest.php b/tests/phpunit/CRM/Contribute/BAO/ContributionTest.php index a453d51d754d9a67f317c84f20fdaa0c1b2d4240..03dbdb236924f2bb6cc5591e004d974af8b35548 100644 --- a/tests/phpunit/CRM/Contribute/BAO/ContributionTest.php +++ b/tests/phpunit/CRM/Contribute/BAO/ContributionTest.php @@ -1573,6 +1573,104 @@ WHERE eft.entity_id = %1 AND ft.to_financial_account_id <> %2"; ), $checkAgainst); } + /** + * https://lab.civicrm.org/dev/financial/issues/56 + * Changing financial type on a contribution records correct financial items + */ + public function testChangingFinancialTypeWithoutTax() { + $ids = $values = []; + $contactId = $this->individualCreate(); + $params = array( + 'contact_id' => $contactId, + 'receive_date' => date('YmdHis'), + 'total_amount' => 100.00, + 'financial_type_id' => 'Donation', + 'contribution_status_id' => 'Completed', + ); + /* first test the scenario when sending an email */ + $contributionId = $this->callAPISuccess( + 'contribution', + 'create', + $params + )['id']; + + // Update Financial Type. + $this->callAPISuccess('contribution', 'create', [ + 'id' => $contributionId, + 'financial_type_id' => 'Event Fee', + ]); + + // Get line item + $lineItem = $this->callAPISuccessGetSingle('LineItem', [ + 'contribution_id' => $contributionId, + 'return' => ["financial_type_id.name", "line_total"], + ]); + + $this->assertEquals( + $lineItem['line_total'], + 100.00, + 'Invalid line amount.' + ); + + $this->assertEquals( + $lineItem['financial_type_id.name'], + 'Event Fee', + 'Invalid Financial Type stored.' + ); + + // Get Financial Items. + $financialItems = $this->callAPISuccess('FinancialItem', 'get', [ + 'entity_id' => $lineItem['id'], + 'sequential' => 1, + 'entity_table' => 'civicrm_line_item', + 'options' => ['sort' => "id"], + 'return' => ["financial_account_id.name", "amount", "description"], + ]); + + $this->assertEquals($financialItems['count'], 3, 'Count mismatch.'); + + $toCheck = [ + ['Donation', 100.00], + ['Donation', -100.00], + ['Event Fee', 100.00], + ]; + + foreach ($financialItems['values'] as $key => $values) { + $this->assertEquals( + $values['financial_account_id.name'], + $toCheck[$key][0], + 'Invalid Financial Account stored.' + ); + $this->assertEquals( + $values['amount'], + $toCheck[$key][1], + 'Amount mismatch.' + ); + $this->assertEquals( + $values['description'], + 'Contribution Amount', + 'Description mismatch.' + ); + } + + // Check transactions. + $financialTransactions = $this->callAPISuccess('EntityFinancialTrxn', 'get', [ + 'return' => ["financial_trxn_id"], + 'entity_table' => "civicrm_contribution", + 'entity_id' => $contributionId, + 'sequential' => 1, + ]); + $this->assertEquals($financialTransactions['count'], 3, 'Count mismatch.'); + + foreach ($financialTransactions['values'] as $key => $values) { + $this->callAPISuccessGetCount('EntityFinancialTrxn', [ + 'financial_trxn_id' => $values['financial_trxn_id'], + 'amount' => $toCheck[$key][1], + 'financial_trxn_id.total_amount' => $toCheck[$key][1], + ], 2); + } + } + /** * CRM-21424 Check if the receipt update is set after composing the receipt message */