Interface IOrderFormCalculator

Calculates totals on the order form.

Namespace: EPiServer.Commerce.Order
Assembly: Mediachase.Commerce.dll
Version: 12.17.2
Syntax
public interface IOrderFormCalculator
Examples
    /// <summary>
/// Sample implementation of <see cref="IOrderFormCalculator"/>.
/// </summary>
public class OrderFormCalculatorSample : IOrderFormCalculator
{
private readonly IShippingCalculator _shippingCalculator;

public OrderFormCalculatorSample(IShippingCalculator shippingCalculator)
{
_shippingCalculator = shippingCalculator;
}

public Money GetTotal(IOrderForm orderForm, IMarket market, Currency currency)
{
var total = GetSubTotal(orderForm, currency) +
    GetHandlingTotal(orderForm, currency) +
    GetShippingSubTotal(orderForm, market, currency);

//If the prices in the order where the order form belongs to already include tax, then it does not need to calculate tax.
if (orderForm.PricesIncludeTax)
{
    return total;
}

//otherwise; the prices in the order exclude tax, it should calculate the tax total and include it to the return value.
total += GetTaxTotal(orderForm, market, currency);

return total;
}

public Money GetSubTotal(IOrderForm orderForm, Currency currency)
{
//It's the total of prices of all line items in all shipments of the order form (so all line items of the order form).
var orderSubTotal = orderForm.Shipments.Sum(shipment => _shippingCalculator.GetShippingItemsTotal(shipment, currency));

return new Money(orderSubTotal, currency);
}

public Money GetHandlingTotal(IOrderForm orderForm, Currency currency)
{
return new Money(orderForm.HandlingTotal, currency);
}

public Money GetShippingSubTotal(IOrderForm orderForm, IMarket market, Currency currency)
{
var shippingSubTotal = orderForm.Shipments.Sum(shipment => _shippingCalculator.GetShippingCost(shipment, market, currency).Amount);

return new Money(shippingSubTotal, currency);
}

[Obsolete("This is no longer used. The order discount total should be calculated at IOrderGroup level. See IOrderGroupCalculator.GetOrderDiscountTotal(orderGroup).")]
public Money GetOrderDiscountTotal(IOrderForm orderForm, Currency currency)
{
return new Money(0, currency);
}

public Money GetDiscountTotal(IOrderForm orderForm, Currency currency)
{
var discountTotal = orderForm.Shipments.Sum(shipment =>
    shipment.GetShipmentDiscountPrice(currency) +
    shipment.LineItems.Sum(item => item.GetDiscountTotal(currency)));

return new Money(discountTotal, currency);
}

public OrderFormTotals GetOrderFormTotals(IOrderForm orderForm, IMarket market, Currency currency)
{
var formHandlingTotal = GetHandlingTotal(orderForm, currency);
var formShippingTotal = GetShippingSubTotal(orderForm, market, currency);
var formSubTotal = GetSubTotal(orderForm, currency);
var formTaxTotal = GetTaxTotal(orderForm, market, currency);
var formTotal = GetTotal(orderForm, market, currency);
var formDiscountTotal = GetDiscountTotal(orderForm, currency);
var shipmentTotalsDictionary = orderForm.Shipments.ToDictionary(shipment => shipment, shipment => _shippingCalculator.GetShippingTotals(shipment, market, currency));

return new OrderFormTotals(formHandlingTotal, formShippingTotal, formSubTotal, formTaxTotal, formTotal, formDiscountTotal, shipmentTotalsDictionary);
}

public Money GetTaxTotal(IOrderForm orderForm, IMarket market, Currency currency)
{
//It's the total of all shipping taxes and sales taxes.
var taxTotal = orderForm.Shipments.Sum(shipment => (
    _shippingCalculator.GetShippingTax(shipment, market, currency) +
    _shippingCalculator.GetSalesTax(shipment, market, currency)));

return new Money(taxTotal, currency);
}
}

Methods

GetDiscountTotal(IOrderForm, Currency)

Gets the total of all discounts applied on an IOrderForm.

Declaration
Money GetDiscountTotal(IOrderForm orderForm, Currency currency)
Parameters
Type Name Description
IOrderForm orderForm

The given order form.

Currency currency

The currency.

Returns
Type Description
Money

The discount total of the order form.

Remarks

There're three types of discount can be applied to an order: order level, shipment level (or shipping discount) and line item level discount.

Examples
        public void GetDiscountTotal(IOrderForm orderForm, Currency currency, IOrderFormCalculator orderFormCalculator)
{
var discountTotal = orderFormCalculator.GetDiscountTotal(orderForm, currency);
Debug.WriteLine("Discount total for order form '{0}': {1}", orderForm.OrderFormId, discountTotal);
}

GetHandlingTotal(IOrderForm, Currency)

Gets the handling total of an IOrderForm.

Declaration
Money GetHandlingTotal(IOrderForm orderForm, Currency currency)
Parameters
Type Name Description
IOrderForm orderForm

The given order form.

Currency currency

The currency to be used in the calculation.

Returns
Type Description
Money

The handling total for the order form.

Examples
        public void GetHandlingTotal(IOrderForm orderForm, Currency currency, IOrderFormCalculator orderFormCalculator)
{
var handlingTotal = orderFormCalculator.GetHandlingTotal(orderForm, currency);
Debug.WriteLine("Handling total for order form '{0}': {1}", orderForm.OrderFormId, handlingTotal);
}

GetOrderDiscountTotal(IOrderForm, Currency)

Gets the order discount price of the orderForm.

Declaration
[Obsolete("This method is no longer used. Will remain at least until May 2019.")]
Money GetOrderDiscountTotal(IOrderForm orderForm, Currency currency)
Parameters
Type Name Description
IOrderForm orderForm

The order form.

Currency currency

The currency.

Returns
Type Description
Money

The order discount price for the order form.

Examples
        public void GetOrderDiscountTotal(IOrderForm orderForm, Currency currency, IOrderFormCalculator orderFormCalculator)
{
var orderDiscountTotal = orderFormCalculator.GetOrderDiscountTotal(orderForm, currency);
Debug.WriteLine("Order discount total for order form '{0}': {1}", orderForm.OrderFormId, orderDiscountTotal);
}

GetOrderFormTotals(IOrderForm, IMarket, Currency)

Gets the order form totals of an IOrderForm.

Declaration
OrderFormTotals GetOrderFormTotals(IOrderForm orderForm, IMarket market, Currency currency)
Parameters
Type Name Description
IOrderForm orderForm

The given order form.

IMarket market

The market to be used in the calculation.

Currency currency

The currency.

Returns
Type Description
OrderFormTotals

An order form totals.

Examples
        public void GetOrderFormTotals(IOrderForm orderForm, IMarket market, Currency currency, IOrderFormCalculator orderFormCalculator)
{
var orderFormTotals = orderFormCalculator.GetOrderFormTotals(orderForm, market, currency);

Debug.WriteLine("Handling total for order form '{0}': {1}", orderForm.OrderFormId, orderFormTotals.HandlingTotal);
Debug.WriteLine("Shipping subtotal for order form '{0}': {1}", orderForm.OrderFormId, orderFormTotals.ShippingTotal);
Debug.WriteLine("Tax total for order form '{0}': {1}", orderForm.OrderFormId, orderFormTotals.TaxTotal);
Debug.WriteLine("Subtotal for order form '{0}': {1}", orderForm.OrderFormId, orderFormTotals.SubTotal);
Debug.WriteLine("Discount total for order form '{0}': {1}", orderForm.OrderFormId, orderFormTotals.DiscountTotal);
Debug.WriteLine("Total for order form '{0}': {1}", orderForm.OrderFormId, orderFormTotals.Total);
}

GetShippingSubTotal(IOrderForm, IMarket, Currency)

Gets the total of shipping cost of all shipments in an IOrderForm.

Declaration
Money GetShippingSubTotal(IOrderForm orderForm, IMarket market, Currency currency)
Parameters
Type Name Description
IOrderForm orderForm

The given order form.

IMarket market

The market to be used in the calculation.

Currency currency

The currency to be used in the calculations.

Returns
Type Description
Money

The shipping subtotal of the order form.

Examples
        public void GetShippingSubTotal(IOrderForm orderForm, IMarket market, Currency currency, IOrderFormCalculator orderFormCalculator)
{
var shippingSubTotal = orderFormCalculator.GetShippingSubTotal(orderForm, market, currency);
Debug.WriteLine("Shipping subtotal for order form '{0}': {1}", orderForm.OrderFormId, shippingSubTotal);
}

GetSubTotal(IOrderForm, Currency)

Gets the subtotal of an IOrderForm.

Declaration
Money GetSubTotal(IOrderForm orderForm, Currency currency)
Parameters
Type Name Description
IOrderForm orderForm

The given order form.

Currency currency

The currency to be used in the calculation.

Returns
Type Description
Money

The subtotal of the order form.

Examples
        public void GetSubTotal(IOrderForm orderForm, Currency currency, IOrderFormCalculator orderFormCalculator)
{
var subTotal = orderFormCalculator.GetSubTotal(orderForm, currency);
Debug.WriteLine("Subtotal for order form '{0}': {1}", orderForm.OrderFormId, subTotal);
}

GetTaxTotal(IOrderForm, IMarket, Currency)

Gets the tax total of of an IOrderForm.

Declaration
Money GetTaxTotal(IOrderForm orderForm, IMarket market, Currency currency)
Parameters
Type Name Description
IOrderForm orderForm

The given order form.

IMarket market

The market to be used in the calculation.

Currency currency

The currency to be used in the calculation.

Returns
Type Description
Money

The total tax amount of the order form.

Examples
        public void GetTaxTotal(IOrderForm orderForm, IMarket market, Currency currency, IOrderFormCalculator orderFormCalculator)
{
var taxTotal = orderFormCalculator.GetTaxTotal(orderForm, market, currency);
Debug.WriteLine("Tax total for order form '{0}': {1}", orderForm.OrderFormId, taxTotal);
}

GetTotal(IOrderForm, IMarket, Currency)

Gets the total of an IOrderForm.

Declaration
Money GetTotal(IOrderForm orderForm, IMarket market, Currency currency)
Parameters
Type Name Description
IOrderForm orderForm

The given order form.

IMarket market

The market to be used in the calculation.

Currency currency

The currency to be used in the calculation.

Returns
Type Description
Money

The total of the order form.

Examples
        public void GetTotal(IOrderForm orderForm, IMarket market, Currency currency, IOrderFormCalculator orderFormCalculator)
{
var total = orderFormCalculator.GetTotal(orderForm, market, currency);
Debug.WriteLine("Total for order form '{0}': {1}", orderForm.OrderFormId, total);
}