Tax not getting added to cart total

Siddharth Gupta
Member since: 2018
 

Hi,

I am using Commerce version 12.2, this is wrt Tax Calculation. We have our custom tax cacluator which was using ITaxCalculator previously, but now it implements IOrderGroupCalculator. We are able to calculate the tax correctly, but now I see that the total does not add the tax which was not the case previously.

I wrote the below code to overcome this issue:

var TotalAmount = ServiceLocator.Current.GetInstance().GetTotal(Cart).Amount + ServiceLocator.Current.GetInstance().GetTaxTotal(Cart).Amount;

Also, wouldnt it call both GetTotal and GetTaxTotal everytime even if there is no change (which is an unwanted back and forth)

Is there a better way to implement this?

Regards,

Siddharth

#194470 Jun 21, 2018 19:28
  • Tuan Doan
    Member since: 2011
     

    Hi Siddharth, 

    I guess you just want to get the total of order with tax, then you only need to use IOrderGroupCalculator.GetTotal(Cart). This method will includes GetTaxTotal(Cart) as well, and it doesn't calculate the tax if there's no change. 

    That means your code should be: 

    var TotalAmount = ServiceLocator.Current.GetInstance<IOrderGroupCalculator>().GetTotal(Cart).Amount

    /Tuan

    #194483 Jun 22, 2018 9:48
  •  

    Hi,

    I just want to add up more information. In Commerce 12, we've introduced a new setting on IMarket, PricesIncludeTax, indicating whether the prices of the market includes tax or not. In the order we have that setting as well, got from the market when order was created. So if it is true, it means the prices (item prices, shipping costs,..) already include tax, therefore the tax total got from the tax calculator was not added up to the order total, since the order already includes tax. So please check that setting as well.

    /Bien Nguyen

    #194486 Jun 22, 2018 10:04
  • Siddharth Gupta
    Member since: 2018
     

    Hi Siddharth, 

    I guess you just want to get the total of order with tax, then you only need to use IOrderGroupCalculator.GetTotal(Cart). This method will includes GetTaxTotal(Cart) as well, and it doesn't calculate the tax if there's no change. 

    That means your code should be: 

    var TotalAmount = ServiceLocator.Current.GetInstance().GetTotal(Cart).Amount

    /Tuan

    @Tuan: I actually tried that first but it doesnt return me the correct value (cart total + tax), hence I manually added the tax myself. Also, I can see that in the Orderform table in SQL the TaxTotal column is 0.00 for all orders. 

    #194508 Jun 22, 2018 15:59
  • Siddharth Gupta
    Member since: 2018
     

    Hi,

    I just want to add up more information. In Commerce 12, we've introduced a new setting on IMarket, PricesIncludeTax, indicating whether the prices of the market includes tax or not. In the order we have that setting as well, got from the market when order was created. So if it is true, it means the prices (item prices, shipping costs,..) already include tax, therefore the tax total got from the tax calculator was not added up to the order total, since the order already includes tax. So please check that setting as well.

    /Bien Nguyen

    Hi @Bien, the PricesIncludeTax is false for the market. Below is the code:Submit

    bool taxIncluded = ServiceLocator.Current.GetInstance<ICurrentMarket>().GetCurrentMarket().PricesIncludeTax;

    #194511 Jun 22, 2018 16:21
  •  

    Hi,

    You said that your custom tax calculator was using ITaxCalculator but now it implements IOrderGroupCaclculator. Could you show us your custome codes? Not need the detail implementation but I want to know what methods that you customized, so that I could have a better guess.

    /Bien Nguyen

    #194544 Jun 25, 2018 10:42
  • Siddharth Gupta
    Member since: 2018
     

    Hi,

    You said that your custom tax calculator was using ITaxCalculator but now it implements IOrderGroupCaclculator. Could you show us your custome codes? Not need the detail implementation but I want to know what methods that you customized, so that I could have a better guess.

    /Bien Nguyen

    @Bein Nguyen: Below is the code snippet for your reference:

    public class CustomTaxCalculator : DefaultOrderGroupCalculator, IOrderGroupCalculator
    {
    public readonly IOrderFormCalculator _orderFormCalculator;
    public readonly IReturnOrderFormCalculator _returnOrderFormCalculator;
    public readonly IMarketService _marketservice;
    
    public CustomTaxCalculator(IOrderFormCalculator orderFormCalculator, IReturnOrderFormCalculator returnOrderFormCalculator, IMarketService marketservice) 
    : base(orderFormCalculator, returnOrderFormCalculator, marketservice)
    {
    this._orderFormCalculator = orderFormCalculator;
    this._returnOrderFormCalculator = returnOrderFormCalculator;
    this._marketservice = marketservice;
    }
    
    public new Money GetTaxTotal(IOrderGroup orderGroup)
    {
    return CalculateTaxTotal(orderGroup);
    
    }
    
    public new Money GetTotal(IOrderGroup orderGroup)
    {
    Money total = this.CalculateTotal(orderGroup);
    this.ValidateTotal(total);
    return total;
    }
    
    protected override Money CalculateTaxTotal(IOrderGroup orderGroup)
    {
    decimal taxTotal = 0.0M;
    var orderGroupObj = orderGroup as OrderGroup;
    if (orderGroupObj == null)
    return new Money(0, Currency.USD);
    orderGroupObj.TaxTotal = 0;
    if (orderGroup.GetFirstForm().Shipments.Count > 0)
    { 
    foreach (IShipment shipment in orderGroup.GetFirstForm().Shipments)
    {
    IOrderAddress address = shipment.ShippingAddress;
    if (address != null)
    {
    taxTotal = CalculateTaxUsingCustomService(orderGroup);
    }
    }
    }
    return new Money(taxTotal, Currency.USD);
    }
    
    protected override Money CalculateTotal(IOrderGroup orderGroup)
    {
    Currency currency = orderGroup.Currency;
    Money money = this.GetSubTotal(orderGroup) + this.GetHandlingTotal(orderGroup) + this.GetShippingSubTotal(orderGroup) - this.GetOrderDiscountTotal(orderGroup) - orderGroup.GetShippingDiscountTotal();
    if (!orderGroup.PricesIncludeTax)
    money += this.GetTaxTotal(orderGroup);
    return money;
    }
    }

    Also, now is see the tax total being computed, but it is not getting stored in the database. For example: The tax total is being displayed on the UI, but the TaxTotal columns in the database is always 0.00 (OrderForm, OrderGroup).

    #194554 Edited, Jun 25, 2018 13:28
  •  

    Hi,

    I would suggest you to override the following method as well, and update the tax total and order total values with your custom tax calculation:

    public new OrderGroupTotals GetOrderGroupTotals(IOrderGroup orderGroup)
    {
        // your custom code here...
    }

    /Bien Nguyen

    #194581 Edited, Jun 26, 2018 4:49
  • Siddharth Gupta
    Member since: 2018
     

    @Bien: That did the trick for me, thank you!

    #194751 Edited, Jun 29, 2018 20:03