Skip to content

Commit

Permalink
#4936 Default tax provider. Correct calculation of payment method add…
Browse files Browse the repository at this point in the history
…itional fee tax
  • Loading branch information
RomanovM committed Feb 18, 2021
1 parent 3f1deb8 commit 13c8ba9
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 60 deletions.
Expand Up @@ -149,93 +149,109 @@ public async Task<TaxRateResult> GetTaxRateAsync(TaxRateRequest taxRateRequest)
/// <returns>Tax total</returns>
public async Task<TaxTotalResult> GetTaxTotalAsync(TaxTotalRequest taxTotalRequest)
{
if (!(_httpContextAccessor.HttpContext.Items.TryGetValue("nop.TaxTotal", out var result) && result is TaxTotalResult taxTotalResult))
if (_httpContextAccessor.HttpContext.Items.TryGetValue("nop.TaxTotal", out var result)
&& result is (TaxTotalResult taxTotalResult, decimal paymentTax))
{
var taxRates = new SortedDictionary<decimal, decimal>();
//short-circuit to avoid circular reference when calculating payment method additional fee during the checkout process
if (!taxTotalRequest.UsePaymentMethodAdditionalFee)
return new TaxTotalResult { TaxTotal = taxTotalResult.TaxTotal - paymentTax };

//order sub total (items + checkout attributes)
var (_, _, _, _, orderSubTotalTaxRates) = await _orderTotalCalculationService
.GetShoppingCartSubTotalAsync(taxTotalRequest.ShoppingCart, false);
var subTotalTaxTotal = decimal.Zero;
foreach (var kvp in orderSubTotalTaxRates)
{
var taxRate = kvp.Key;
var taxValue = kvp.Value;
subTotalTaxTotal += taxValue;
return taxTotalResult;
}

if (taxRate > decimal.Zero && taxValue > decimal.Zero)
{
if (!taxRates.ContainsKey(taxRate))
taxRates.Add(taxRate, taxValue);
else
taxRates[taxRate] = taxRates[taxRate] + taxValue;
}
var taxRates = new SortedDictionary<decimal, decimal>();
var taxTotal = decimal.Zero;

//order sub total (items + checkout attributes)
var (_, _, _, _, orderSubTotalTaxRates) = await _orderTotalCalculationService
.GetShoppingCartSubTotalAsync(taxTotalRequest.ShoppingCart, false);
var subTotalTaxTotal = decimal.Zero;
foreach (var kvp in orderSubTotalTaxRates)
{
var taxRate = kvp.Key;
var taxValue = kvp.Value;
subTotalTaxTotal += taxValue;

if (taxRate > decimal.Zero && taxValue > decimal.Zero)
{
if (!taxRates.ContainsKey(taxRate))
taxRates.Add(taxRate, taxValue);
else
taxRates[taxRate] = taxRates[taxRate] + taxValue;
}
}
taxTotal += subTotalTaxTotal;

//shipping
var shippingTax = decimal.Zero;
if (_taxSettings.ShippingIsTaxable)
//shipping
var shippingTax = decimal.Zero;
if (_taxSettings.ShippingIsTaxable)
{
var (shippingExclTax, _, _) = await _orderTotalCalculationService
.GetShoppingCartShippingTotalAsync(taxTotalRequest.ShoppingCart, false);
var (shippingInclTax, taxRate, _) = await _orderTotalCalculationService
.GetShoppingCartShippingTotalAsync(taxTotalRequest.ShoppingCart, true);
if (shippingExclTax.HasValue && shippingInclTax.HasValue)
{
var (shippingExclTax, _, _) = await _orderTotalCalculationService
.GetShoppingCartShippingTotalAsync(taxTotalRequest.ShoppingCart, false);
var (shippingInclTax, taxRate, _) = await _orderTotalCalculationService
.GetShoppingCartShippingTotalAsync(taxTotalRequest.ShoppingCart, true);
if (shippingExclTax.HasValue && shippingInclTax.HasValue)
shippingTax = shippingInclTax.Value - shippingExclTax.Value;
if (shippingTax < decimal.Zero)
shippingTax = decimal.Zero;

if (taxRate > decimal.Zero && shippingTax > decimal.Zero)
{
shippingTax = shippingInclTax.Value - shippingExclTax.Value;
if (shippingTax < decimal.Zero)
shippingTax = decimal.Zero;

if (taxRate > decimal.Zero && shippingTax > decimal.Zero)
{
if (!taxRates.ContainsKey(taxRate))
taxRates.Add(taxRate, shippingTax);
else
taxRates[taxRate] = taxRates[taxRate] + shippingTax;
}
if (!taxRates.ContainsKey(taxRate))
taxRates.Add(taxRate, shippingTax);
else
taxRates[taxRate] = taxRates[taxRate] + shippingTax;
}
}

//add at least one tax rate (0%)
if (!taxRates.Any())
taxRates.Add(decimal.Zero, decimal.Zero);

var taxTotal = subTotalTaxTotal + shippingTax;

if (taxTotal < decimal.Zero)
taxTotal = decimal.Zero;

taxTotalResult = new TaxTotalResult { TaxTotal = taxTotal, TaxRates = taxRates };
_httpContextAccessor.HttpContext.Items.TryAdd("nop.TaxTotal", taxTotalResult);
}
taxTotal += shippingTax;

//short-circuit to avoid circular reference when calculating payment method additional fee during the checkout process
if (!taxTotalRequest.UsePaymentMethodAdditionalFee)
return new TaxTotalResult { TaxTotal = taxTotal };

//payment method additional fee
if (taxTotalRequest.UsePaymentMethodAdditionalFee && _taxSettings.PaymentMethodAdditionalFeeIsTaxable)
var paymentMethodAdditionalFeeTax = decimal.Zero;
if (_taxSettings.PaymentMethodAdditionalFeeIsTaxable)
{
var paymentMethodSystemName = taxTotalRequest.Customer != null
? await _genericAttributeService.GetAttributeAsync<string>(taxTotalRequest.Customer,
NopCustomerDefaults.SelectedPaymentMethodAttribute, taxTotalRequest.StoreId)
? await _genericAttributeService
.GetAttributeAsync<string>(taxTotalRequest.Customer, NopCustomerDefaults.SelectedPaymentMethodAttribute, taxTotalRequest.StoreId)
: string.Empty;
var paymentMethodAdditionalFee = await _paymentService.GetAdditionalHandlingFeeAsync(taxTotalRequest.ShoppingCart, paymentMethodSystemName);

var paymentMethodAdditionalFee = await _paymentService
.GetAdditionalHandlingFeeAsync(taxTotalRequest.ShoppingCart, paymentMethodSystemName);
var (paymentMethodAdditionalFeeExclTax, _) = await _taxService
.GetPaymentMethodAdditionalFeeAsync(paymentMethodAdditionalFee, false, taxTotalRequest.Customer);
var (paymentMethodAdditionalFeeInclTax, taxRate) = await _taxService
.GetPaymentMethodAdditionalFeeAsync(paymentMethodAdditionalFee, true, taxTotalRequest.Customer);
var paymentMethodAdditionalFeeTax = paymentMethodAdditionalFeeInclTax - paymentMethodAdditionalFeeExclTax;

paymentMethodAdditionalFeeTax = paymentMethodAdditionalFeeInclTax - paymentMethodAdditionalFeeExclTax;
if (paymentMethodAdditionalFeeTax < decimal.Zero)
paymentMethodAdditionalFeeTax = decimal.Zero;

taxTotalResult.TaxTotal += paymentMethodAdditionalFeeTax;

if (taxRate > decimal.Zero && paymentMethodAdditionalFeeTax > decimal.Zero)
{
if (!taxTotalResult.TaxRates.ContainsKey(taxRate))
taxTotalResult.TaxRates.Add(taxRate, paymentMethodAdditionalFeeTax);
if (!taxRates.ContainsKey(taxRate))
taxRates.Add(taxRate, paymentMethodAdditionalFeeTax);
else
taxTotalResult.TaxRates[taxRate] = taxTotalResult.TaxRates[taxRate] + paymentMethodAdditionalFeeTax;
taxRates[taxRate] = taxRates[taxRate] + paymentMethodAdditionalFeeTax;
}
}
taxTotal += paymentMethodAdditionalFeeTax;

//add at least one tax rate (0%)
if (!taxRates.Any())
taxRates.Add(decimal.Zero, decimal.Zero);

if (taxTotal < decimal.Zero)
taxTotal = decimal.Zero;

taxTotalResult = new TaxTotalResult { TaxTotal = taxTotal, TaxRates = taxRates, };

//store values within the scope of the request to avoid duplicate calculations
_httpContextAccessor.HttpContext.Items.TryAdd("nop.TaxTotal", (taxTotalResult, paymentMethodAdditionalFeeTax));

return taxTotalResult;
}
Expand Down
Expand Up @@ -2,7 +2,7 @@
"Group": "Tax providers",
"FriendlyName": "Manual (Fixed or By Country/State/Zip)",
"SystemName": "Tax.FixedOrByCountryStateZip",
"Version": "1.36",
"Version": "1.37",
"SupportedVersions": [ "4.40" ],
"Author": "nopCommerce team",
"DisplayOrder": 1,
Expand Down

0 comments on commit 13c8ba9

Please sign in to comment.