Skip to content

Commit d9e97c1

Browse files
committed
Tax calculatation round fix in Gross > Net scenarios
1 parent 9ef0c2c commit d9e97c1

3 files changed

Lines changed: 48 additions & 13 deletions

File tree

src/Libraries/SmartStore.Services/Orders/OrderTotalCalculationService.cs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -179,13 +179,32 @@ public virtual void GetShoppingCartSubTotal(IList<OrganizedShoppingCartItem> car
179179
decimal subTotalInclTaxWithoutDiscount = decimal.Zero;
180180

181181
foreach (var shoppingCartItem in cart)
182-
{
183-
decimal taxRate = decimal.Zero;
184-
decimal sciSubTotal = _priceCalculationService.GetSubTotal(shoppingCartItem, true);
182+
{
183+
#region Obsolete (RoundFix)
184+
//decimal taxRate = decimal.Zero;
185+
//decimal sciSubTotal = _priceCalculationService.GetSubTotal(shoppingCartItem, true);
186+
187+
//decimal sciExclTax = _taxService.GetProductPrice(shoppingCartItem.Item.Product, sciSubTotal, false, customer, out taxRate);
188+
//decimal sciInclTax = _taxService.GetProductPrice(shoppingCartItem.Item.Product, sciSubTotal, true, customer, out taxRate);
189+
#endregion
190+
191+
#region RoundFix
192+
int temQuantity = shoppingCartItem.Item.Quantity;
193+
shoppingCartItem.Item.Quantity = 1;
194+
195+
decimal taxRate = decimal.Zero;
196+
decimal sciSubTotal = _priceCalculationService.GetSubTotal(shoppingCartItem, true);
197+
198+
//Adaption to eliminate rounding erro
199+
decimal sciExclTax = _taxService.GetProductPrice(shoppingCartItem.Item.Product, sciSubTotal, false, customer, out taxRate);
200+
sciExclTax = Math.Round(sciExclTax, 2) * temQuantity;
201+
decimal sciInclTax = _taxService.GetProductPrice(shoppingCartItem.Item.Product, sciSubTotal, true, customer, out taxRate);
202+
sciInclTax = Math.Round(sciInclTax, 2) * temQuantity;
203+
204+
shoppingCartItem.Item.Quantity = temQuantity;
205+
#endregion
185206

186-
decimal sciExclTax = _taxService.GetProductPrice(shoppingCartItem.Item.Product, sciSubTotal, false, customer, out taxRate);
187-
decimal sciInclTax = _taxService.GetProductPrice(shoppingCartItem.Item.Product, sciSubTotal, true, customer, out taxRate);
188-
subTotalExclTaxWithoutDiscount += sciExclTax;
207+
subTotalExclTaxWithoutDiscount += sciExclTax;
189208
subTotalInclTaxWithoutDiscount += sciInclTax;
190209

191210
//tax rates

src/Libraries/SmartStore.Services/Tax/TaxService.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,15 @@ protected decimal CalculatePrice(decimal price, decimal percent, bool increase)
165165
result = price * (1 + percent / 100);
166166
}
167167
else
168-
{
169-
result = price - (price) / (100 + percent) * percent;
170-
}
168+
{
169+
#region Obsolete (RoundFix)
170+
//result = price - (price) / (100 + percent) * percent;
171+
#endregion
172+
173+
#region RoundFix
174+
result = price - Math.Round((price) / (100 + percent) * percent, 2);
175+
#endregion
176+
}
171177
return result;
172178
}
173179

src/Presentation/SmartStore.Web/Controllers/ShoppingCartController.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -316,13 +316,23 @@ private ShoppingCartModel.ShoppingCartItemModel PrepareShoppingCartItemModel(Org
316316
{
317317
//sub total
318318
decimal taxRate = decimal.Zero;
319-
decimal shoppingCartItemSubTotalWithDiscountBase = _taxService.GetProductPrice(product, _priceCalculationService.GetSubTotal(sci, true), out taxRate);
319+
320+
#region Obsolete (RoundFix)
321+
//decimal shoppingCartItemSubTotalWithDiscountBase = _taxService.GetProductPrice(product, _priceCalculationService.GetSubTotal(sci, true), out taxRate);
322+
//decimal shoppingCartItemSubTotalWithDiscount = _currencyService.ConvertFromPrimaryStoreCurrency(shoppingCartItemSubTotalWithDiscountBase, _workContext.WorkingCurrency);
323+
//model.SubTotal = _priceFormatter.FormatPrice(shoppingCartItemSubTotalWithDiscount);
324+
//// display an applied discount amount
325+
//decimal shoppingCartItemSubTotalWithoutDiscountBase = _taxService.GetProductPrice(product, _priceCalculationService.GetSubTotal(sci, false), out taxRate);
326+
#endregion
327+
328+
#region RoundFix
329+
decimal shoppingCartItemSubTotalWithDiscountBase = Math.Round(_taxService.GetProductPrice(product, _priceCalculationService.GetUnitPrice(sci, true), out taxRate), 2) * sci.Item.Quantity;
320330
decimal shoppingCartItemSubTotalWithDiscount = _currencyService.ConvertFromPrimaryStoreCurrency(shoppingCartItemSubTotalWithDiscountBase, _workContext.WorkingCurrency);
321-
322331
model.SubTotal = _priceFormatter.FormatPrice(shoppingCartItemSubTotalWithDiscount);
332+
// display an applied discount amount
333+
decimal shoppingCartItemSubTotalWithoutDiscountBase = Math.Round(_taxService.GetProductPrice(product, _priceCalculationService.GetUnitPrice(sci, false), out taxRate), 2) * sci.Item.Quantity;
334+
#endregion
323335

324-
//display an applied discount amount
325-
decimal shoppingCartItemSubTotalWithoutDiscountBase = _taxService.GetProductPrice(product, _priceCalculationService.GetSubTotal(sci, false), out taxRate);
326336
decimal shoppingCartItemDiscountBase = shoppingCartItemSubTotalWithoutDiscountBase - shoppingCartItemSubTotalWithDiscountBase;
327337

328338
if (shoppingCartItemDiscountBase > decimal.Zero)

0 commit comments

Comments
 (0)