From 120d25c07151630b1492968e75455aed7ab7ebdd Mon Sep 17 00:00:00 2001 From: KarinG Date: Sun, 22 Jan 2017 14:33:28 -0700 Subject: [PATCH] Fundamental Fixes for TaxMath Calculations. --- CRM/Contribute/BAO/Contribution/Utils.php | 3 ++- CRM/Price/BAO/LineItem.php | 32 +++++++---------------- CRM/Price/BAO/PriceSet.php | 5 ++-- templates/CRM/Price/Page/LineItem.tpl | 2 +- 4 files changed, 15 insertions(+), 27 deletions(-) diff --git a/CRM/Contribute/BAO/Contribution/Utils.php b/CRM/Contribute/BAO/Contribution/Utils.php index a5a20458b28d..59e98fcc58c2 100644 --- a/CRM/Contribute/BAO/Contribution/Utils.php +++ b/CRM/Contribute/BAO/Contribution/Utils.php @@ -931,7 +931,8 @@ public static function getFirstLastDetails($contactID) { */ public static function calculateTaxAmount($amount, $taxRate) { $taxAmount = array(); - $taxAmount['tax_amount'] = round(($taxRate / 100) * CRM_Utils_Rule::cleanMoney($amount), 2); + // There can not be any rounding at this stage - as this is prior to quantity multiplication + $taxAmount['tax_amount'] = ($taxRate / 100) * CRM_Utils_Rule::cleanMoney($amount); return $taxAmount; } diff --git a/CRM/Price/BAO/LineItem.php b/CRM/Price/BAO/LineItem.php index 290da64d813b..04dfc78d2cf1 100644 --- a/CRM/Price/BAO/LineItem.php +++ b/CRM/Price/BAO/LineItem.php @@ -251,7 +251,15 @@ public static function getLineItems($entityId, $entity = 'participant', $isQuick 'membership_num_terms' => $dao->membership_num_terms, 'tax_amount' => $dao->tax_amount, ); - $lineItems[$dao->id]['tax_rate'] = CRM_Price_BAO_LineItem::calculateTaxRate($lineItems[$dao->id]); + $taxRates = CRM_Core_PseudoConstant::getTaxRates(); + if (isset($lineItems[$dao->id]['financial_type_id']) && array_key_exists($lineItems[$dao->id]['financial_type_id'], $taxRates)) { + // We are close to output/display here - so apply some rounding at output/display level - to not show Tax Rate in it's full 8 decimals + $lineItems[$dao->id]['tax_rate'] = round($taxRates[$lineItems[$dao->id]['financial_type_id']], 3); + } + else { + // There is no Tax Rate associated with this Financial Type + $lineItems[$dao->id]['tax_rate'] = FALSE; + } $lineItems[$dao->id]['subTotal'] = $lineItems[$dao->id]['qty'] * $lineItems[$dao->id]['unit_price']; if ($lineItems[$dao->id]['tax_amount'] != '') { $getTaxDetails = TRUE; @@ -537,26 +545,4 @@ public static function getLineItemArray(&$params, $entityId = NULL, $entityTable } } - /** - * Calculate tax rate in percentage. - * - * @param array $lineItemId - * An assoc array of lineItem. - * - * @return int|void - * tax rate - */ - public static function calculateTaxRate($lineItemId) { - if ($lineItemId['unit_price'] == 0) { - return FALSE; - } - if ($lineItemId['html_type'] == 'Text') { - $tax = round($lineItemId['tax_amount'] / ($lineItemId['unit_price'] * $lineItemId['qty']) * 100, 2); - } - else { - $tax = round(($lineItemId['tax_amount'] / $lineItemId['unit_price']) * 100, 2); - } - return $tax; - } - } diff --git a/CRM/Price/BAO/PriceSet.php b/CRM/Price/BAO/PriceSet.php index 879f34f8ae51..f401d63eb66c 100644 --- a/CRM/Price/BAO/PriceSet.php +++ b/CRM/Price/BAO/PriceSet.php @@ -1536,11 +1536,12 @@ public static function copyPriceSet($baoName, $id, $newId) { * @return array */ public static function setLineItem($field, $lineItem, $optionValueId) { + // Here we round - i.e. after multiplying by quantity if ($field['html_type'] == 'Text') { - $taxAmount = $field['options'][$optionValueId]['tax_amount'] * $lineItem[$optionValueId]['qty']; + $taxAmount = round($field['options'][$optionValueId]['tax_amount'] * $lineItem[$optionValueId]['qty'], 2); } else { - $taxAmount = $field['options'][$optionValueId]['tax_amount']; + $taxAmount = round($field['options'][$optionValueId]['tax_amount'], 2); } $taxRate = $field['options'][$optionValueId]['tax_rate']; $lineItem[$optionValueId]['tax_amount'] = $taxAmount; diff --git a/templates/CRM/Price/Page/LineItem.tpl b/templates/CRM/Price/Page/LineItem.tpl index 91cd54961930..1c7aaa9ce1e5 100644 --- a/templates/CRM/Price/Page/LineItem.tpl +++ b/templates/CRM/Price/Page/LineItem.tpl @@ -72,7 +72,7 @@ {if $getTaxDetails} {$line.line_total|crmMoney} {if $line.tax_rate != "" || $line.tax_amount != ""} - {$taxTerm} ({$line.tax_rate|string_format:"%.2f"}%) + {$taxTerm} ({$line.tax_rate|string_format:"%.3f"}%) {$line.tax_amount|crmMoney} {else}