Dev GuideAPI Reference
Dev GuideAPI ReferenceUser GuideGitHubNuGetDev CommunityOptimizely AcademySubmit a ticketLog In
Dev Guide

Order group calculator

Describes OrderGroupCalculator, which calculates an order's total, subtotal, handling total, shipping subtotal, order discount total, order group total, and tax total in Optimizely Commerce Connect.

total

Calculates the total for an order.

public void GetTotal(IOrderGroup orderGroup, IOrderGroupCalculator orderGroupCalculator) {
  var total = orderGroupCalculator.GetTotal(orderGroup);
  Debug.WriteLine("Total for order group '{0}': {1}", orderGroup.OrderLink.OrderGroupId, total);
}

subTotal

Calculates the subtotal of all order forms for an order.

public void GetSubTotal(IOrderGroup orderGroup, IOrderGroupCalculator orderGroupCalculator) {
  var subTotal = orderGroupCalculator.GetSubTotal(orderGroup);
  Debug.WriteLine("Subtotal for order group '{0}': {1}", orderGroup.OrderLink.OrderGroupId, subTotal);
}

handlingTotal

Calculates an order's handling total.

public void GetHandlingTotal(IOrderGroup orderGroup, IOrderGroupCalculator orderGroupCalculator) {
  var handlingTotal = orderGroupCalculator.GetHandlingTotal(orderGroup);
  Debug.WriteLine("Handling total for order group '{0}': {1}", orderGroup.OrderLink.OrderGroupId, handlingTotal);
}

shippingSubTotal

Calculates an order's shipping subtotal.

public void GetShippingSubTotal(IOrderGroup orderGroup, IOrderGroupCalculator orderGroupCalculator) {
  var shippingSubTotal = orderGroupCalculator.GetShippingSubTotal(orderGroup);
  Debug.WriteLine("Shipping subtotal for order group '{0}': {1}", orderGroup.OrderLink.OrderGroupId, shippingSubTotal);
}

orderDiscountTotal

Calculates the order group discount amount, which is the sum of all order-level discounts applied to line items across every shipment and order form in the order group.

public void GetOrderDiscountTotal(IOrderGroup orderGroup, IOrderGroupCalculator orderGroupCalculator) {
  var orderDiscountTotal = orderGroupCalculator.GetOrderDiscountTotal(orderGroup);
  Debug.WriteLine("Order discount total for order group '{0}': {1}", orderGroup.OrderLink.OrderGroupId, orderDiscountTotal);
}

orderGroupTotals

Calculates all totals for the order group (handling total, shipping subtotal, tax total, subtotal, and total).

public void GetOrderGroupTotals(IOrderGroup orderGroup, IOrderGroupCalculator orderGroupCalculator) {
  var orderGroupTotals = orderGroupCalculator.GetOrderGroupTotals(orderGroup);

  Debug.WriteLine("Handling total for order group '{0}': {1}", orderGroup.OrderLink.OrderGroupId, orderGroupTotals.HandlingTotal);
  Debug.WriteLine("Shipping subtotal for order group '{0}': {1}", orderGroup.OrderLink.OrderGroupId, orderGroupTotals.ShippingTotal);
  Debug.WriteLine("Tax total for order group '{0}': {1}", orderGroup.OrderLink.OrderGroupId, orderGroupTotals.TaxTotal);
  Debug.WriteLine("Subtotal for order group '{0}': {1}", orderGroup.OrderLink.OrderGroupId, orderGroupTotals.SubTotal);
  Debug.WriteLine("Total for order group '{0}': {1}", orderGroup.OrderLink.OrderGroupId, orderGroupTotals.Total);
}

taxTotal

Calculates the tax total for the order.

public void GetTaxTotal(IOrderGroup orderGroup, IOrderGroupCalculator orderGroupCalculator) {
  var taxTotal = orderGroupCalculator.GetTaxTotal(orderGroup);
  Debug.WriteLine("Tax total for order group '{0}': {1}", orderGroup.OrderLink.OrderGroupId, taxTotal);
}

Change the default calculation

Inherit from DefaultOrderGroupCalculator, the default implementation of IOrderGroupCalculator, and override one or more of its methods to change the calculation behavior.

public class OrderGroupCalculatorOverridingDefault: DefaultOrderGroupCalculator {
  public OrderGroupCalculatorOverridingDefault(
    IOrderFormCalculator orderFormCalculator,
    IReturnOrderFormCalculator returnOrderFormCalculator,
    IMarketService marketService): base(orderFormCalculator, returnOrderFormCalculator, marketService) {}

  protected override Money CalculateTotal(IOrderGroup orderGroup) {
    return new Money(0, orderGroup.Currency);
  }

  protected override Money CalculateSubTotal(IOrderGroup orderGroup) {
    return new Money(0, orderGroup.Currency);
  }

  protected override Money CalculateHandlingTotal(IOrderGroup orderGroup) {
    return new Money(0, orderGroup.Currency);
  }

  protected override Money CalculateShippingSubTotal(IOrderGroup orderGroup) {
    return new Money(0, orderGroup.Currency);
  }

  protected override Money CalculateTaxTotal(IOrderGroup orderGroup) {
    return new Money(0, orderGroup.Currency);
  }
}

Change the default validation

The default implementation validates that each total is non-negative after calculation. To change the behavior, override the validation method that corresponds to the total you want to validate differently: ValidateTotal, ValidateSubTotal, ValidateHandlingTotal, ValidateShippingSubTotal, or ValidateTaxTotal.

public class OrderGroupCalculatorOverridingDefault: DefaultOrderGroupCalculator {
  public OrderGroupCalculatorOverridingDefault(
    IOrderFormCalculator orderFormCalculator,
    IReturnOrderFormCalculator returnOrderFormCalculator,
    IMarketService marketService): base(orderFormCalculator, returnOrderFormCalculator, marketService) {}

  protected override void ValidateTotal(Money money) {
    if (money.Amount < 0) {
      throw new ValidationException("Total must not be negative.");
    }
  }

  protected override void ValidateSubTotal(Money money) {
    if (money.Amount < 0) {
      throw new ValidationException("Subtotal must not be negative.");
    }
  }

  protected override void ValidateHandlingTotal(Money money) {
    if (money.Amount < 0) {
      throw new ValidationException("Handling total must not be negative.");
    }
  }

  protected override void ValidateShippingSubTotal(Money money) {
    if (money.Amount < 0) {
      throw new ValidationException("Shipping subtotal must not be negative.");
    }
  }

  protected override void ValidateTaxTotal(Money money) {
    if (money.Amount < 0) {
      throw new ValidationException("Tax total must not be negative.");
    }
  }
}