dev/core#1972 Fix tax_amount calclation on renewal form
authoreileen <emcnaughton@wikimedia.org>
Fri, 28 Aug 2020 00:52:42 +0000 (12:52 +1200)
committereileen <emcnaughton@wikimedia.org>
Fri, 28 Aug 2020 01:55:33 +0000 (13:55 +1200)
CRM/Financial/BAO/Order.php
tests/phpunit/CRM/Member/Form/MembershipRenewalTest.php

index 528cdcefb143443554f56e18b12662475257a11b..43fa9cd2d72a7c81950994a9eee0865686cf614e 100644 (file)
@@ -236,18 +236,17 @@ class CRM_Financial_BAO_Order {
       $lineItems[$valueID] = CRM_Price_BAO_PriceSet::getLine($params, $throwAwayArray, $this->getPriceSetID(), $this->getPriceFieldSpec($fieldID), $fieldID, 0)[1][$valueID];
     }
 
-    $taxRates = CRM_Core_PseudoConstant::getTaxRates();
     foreach ($lineItems as &$lineItem) {
       // Set any pre-calculation to zero as we will calculate.
       $lineItem['tax_amount'] = 0;
       if ($this->getOverrideFinancialTypeID() !== FALSE) {
         $lineItem['financial_type_id'] = $this->getOverrideFinancialTypeID();
       }
-      $taxRate = $taxRates[$lineItem['financial_type_id']] ?? 0;
+      $taxRate = $this->getTaxRate((int) $lineItem['financial_type_id']);
       if ($this->getOverrideTotalAmount() !== FALSE) {
         if ($taxRate) {
           // Total is tax inclusive.
-          $lineItem['tax_amount'] = ($taxRate / 100) * $this->getOverrideTotalAmount();
+          $lineItem['tax_amount'] = ($taxRate / 100) * $this->getOverrideTotalAmount() / (1 + ($taxRate / 100));
           $lineItem['line_total'] = $lineItem['unit_price'] = $this->getOverrideTotalAmount() - $lineItem['tax_amount'];
         }
         else {
@@ -276,4 +275,19 @@ class CRM_Financial_BAO_Order {
     return $amount;
   }
 
+  /**
+   * Get the tax rate for the given financial type.
+   *
+   * @param int $financialTypeID
+   *
+   * @return float
+   */
+  public function getTaxRate(int $financialTypeID) {
+    $taxRates = CRM_Core_PseudoConstant::getTaxRates();
+    if (!isset($taxRates[$financialTypeID])) {
+      return 0;
+    }
+    return $taxRates[$financialTypeID];
+  }
+
 }
index c990c6318f90080d28dde7fa2d7ea5bbd98d4af7..d70f497c2f1dd6dacc7fcc0e9b641d2a5f46ca91 100644 (file)
@@ -241,7 +241,7 @@ class CRM_Member_Form_MembershipRenewalTest extends CiviUnitTestCase {
       ],
       'credit_card_type' => 'Visa',
       'billing_first_name' => 'Test',
-      'billing_middlename' => 'Last',
+      'billing_middle_name' => 'Last',
       'billing_street_address-5' => '10 Test St',
       'billing_city-5' => 'Test',
       'billing_state_province_id-5' => '1003',
@@ -250,7 +250,7 @@ class CRM_Member_Form_MembershipRenewalTest extends CiviUnitTestCase {
     ]);
     $contribution = $this->callAPISuccessGetSingle('Contribution', ['contact_id' => $this->_individualId, 'is_test' => TRUE, 'return' => ['total_amount', 'tax_amount']]);
     $this->assertEquals(50, $contribution['total_amount']);
-    $this->assertEquals(5, $contribution['tax_amount']);
+    $this->assertEquals(4.55, $contribution['tax_amount']);
   }
 
   /**