---
title: Order group calculator
slug: commerce-connect-15/docs/order-group-calculator
docTags: 
createdAt: 2026-07-30T20:34:40.000Z
---

## total

Calculates the total for an order.

```csharp
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.

```csharp
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.

```csharp
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.

```csharp
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.

```csharp
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).

```csharp
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.

```csharp
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.

```csharp
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`.

```csharp
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.");
    }
  }
}
```
