Order form calculator
Describes OrderFormCalculator in Optimizely Commerce Connect 13, which calculates the following for an order form: total, subtotal, handling total, shipping subtotal, order discount total, discount total, order form totals, and tax total.
-
Total – Calculates the total for an order form.
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); }
-
SubTotal – Calculates the total of all shipments in an order form.
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); }
-
HandlingTotal – Calculates the handling total for an order form.
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); }
-
ShippingSubtotal – Calculates the shipping subtotal for an order form.
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); }
-
OrderDiscountTotal – Calculates the order form discount amount. It is the total of all order-level discounts of all line items in all shipments in an order form.
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); }
-
DiscountTotal – Calculates the order form discount total. It is the total of
- order-level discount amounts
- line item discount amounts for all line items in all shipments
- shipment discount amounts of all shipments in an order form
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); }
-
OrderFormTotals – Calculates the order form total.
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); }
-
TaxTotal – Calculates an order form's tax total.
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); }
Change the default calculation
By inheriting from the default implementation of the interface, DefaultOrderFormCalculator, you can override the calculations. Just override one or more methods in DefaultOrderFormCalculator.
public class OrderFormCalculatorOverridingDefault : DefaultOrderFormCalculator
{
public OrderFormCalculatorOverridingDefault(IShippingCalculator shippingCalculator, ITaxCalculator taxCalculator)
: base(shippingCalculator, taxCalculator)
{ }
protected override Money CalculateTotal(IOrderForm orderForm, IMarket market, Currency currency)
{
return new Money(0, currency);
}
protected override Money CalculateSubtotal(IOrderForm orderForm, Currency currency)
{
return new Money(0, currency);
}
protected override Money CalculateHandlingTotal(IOrderForm orderForm, Currency currency)
{
return new Money(0, currency);
}
protected override Money CalculateShippingSubTotal(IOrderForm orderForm, IMarket market, Currency currency)
{
return new Money(0, currency);
}
protected override Money CalculateTaxTotal(IOrderForm orderForm, IMarket market, Currency currency)
{
return new Money(0, currency);
}
}
Change the default validation
The default implementation validates that the total is not negative after the calculation. To change the behavior, override the appropriate method: ValidateTotal, ValidateSubtotal, ValidateHandlingTotal, ValidateShippingSubtotal, or ValidateTaxTotal.
public class OrderFormCalculatorOverridingDefault : DefaultOrderFormCalculator
{
public OrderFormCalculatorOverridingDefault(IShippingCalculator shippingCalculator, ITaxCalculator taxCalculator)
: base(shippingCalculator, taxCalculator)
{ }
protected override void ValidateTotal(Money money)
{
if (money.Amount <= 0)
{
throw new ValidationException("Order total must be greater than 0");
}
}
protected override void ValidateSubtotal(Money money)
{
if (money.Amount <= 0)
{
throw new ValidationException("Subtotal must be greater than 0");
}
}
protected override void ValidateHandlingTotal(Money money)
{
if (money.Amount <= 0)
{
throw new ValidationException("Handling total must be greater than 0");
}
}
protected override void ValidateShippingSubTotal(Money money)
{
if (money.Amount <= 0)
{
throw new ValidationException("Shipping subtotal must be greater than 0");
}
}
protected override void ValidateTaxTotal(Money money)
{
if (money.Amount <= 0)
{
throw new ValidationException("Tax total must be greater than 0");
}
}
}
Updated 2 months ago