---
title: Return purchase order calculator
slug: commerce-connect-15/docs/return-purchase-order-calculator
docTags: 
createdAt: 2026-07-30T20:34:44.000Z
---

## total

Calculates the total of all return order forms in a purchase order.

```csharp
public void GetTotal(IPurchaseOrder purchaseOrder, IReturnPurchaseOrderCalculator returnPurchaseOrderCalculator) {
  var total = returnPurchaseOrderCalculator.GetTotal(purchaseOrder);
  Debug.WriteLine("Total for return order '{0}': {1}", purchaseOrder.OrderLink.OrderGroupId, total);
}
```

## subTotal

Calculates the subtotal of all return order forms in a purchase order.

```csharp
public void GetSubTotal(IPurchaseOrder purchaseOrder, IReturnPurchaseOrderCalculator returnPurchaseOrderCalculator) {
  var subTotal = returnPurchaseOrderCalculator.GetSubTotal(purchaseOrder);
  Debug.WriteLine("Subtotal for return order '{0}': {1}", purchaseOrder.OrderLink.OrderGroupId, subTotal);
}
```

## shippingSubTotal

Calculates the shipping subtotal of all return order forms in a purchase order.

```csharp
public void GetShippingSubTotal(IPurchaseOrder purchaseOrder, IReturnPurchaseOrderCalculator returnPurchaseOrderCalculator) {
  var shippingSubTotal = returnPurchaseOrderCalculator.GetShippingSubTotal(purchaseOrder);
  Debug.WriteLine("Shipping subtotal for return order '{0}': {1}", purchaseOrder.OrderLink.OrderGroupId, shippingSubTotal);
}
```

## Change the default calculation

Inherit from `DefaultReturnPurchaseOrderCalculator`, the default implementation of `IReturnPurchaseOrderCalculator`, and override one or more of its methods to change the calculation behavior.

```csharp
public class ReturnPurchaseOrderCalculatorOverridingDefault: DefaultReturnPurchaseOrderCalculator {
  public ReturnPurchaseOrderCalculatorOverridingDefault(IReturnOrderFormCalculator returnOrderFormCalculator): base(returnOrderFormCalculator) {}
  protected override Money GetOrderDiscountTotal(IPurchaseOrder purchaseOrder) {
    return new Money(0, purchaseOrder.Currency);
  }
  protected override Money CalculateTotal(IPurchaseOrder purchaseOrder) {
    return new Money(0, purchaseOrder.Currency);
  }
  protected override Money CalculateSubTotal(IPurchaseOrder purchaseOrder) {
    return new Money(0, purchaseOrder.Currency);
  }
  protected override Money CalculateShippingSubTotal(IPurchaseOrder purchaseOrder) {
    return new Money(0, purchaseOrder.Currency);
  }
  protected override IEnumerable<IReturnOrderForm> GetActiveReturnForms(IPurchaseOrder purchaseOrder) {
    return new List<IReturnOrderForm>();
  }
}
```

## Change the default validation

The default implementation validates that each total is non-negative after calculation. To change the behavior, override the `ValidateTotal`, `ValidateSubTotal`, or `ValidateShippingSubTotal` method.

```csharp
public class ReturnPurchaseOrderCalculatorOverridingDefault: DefaultReturnPurchaseOrderCalculator {
  public ReturnPurchaseOrderCalculatorOverridingDefault(IReturnOrderFormCalculator returnOrderFormCalculator): base(returnOrderFormCalculator) {}
  protected override void ValidateTotal(Money money) {
    if (money.Amount < 0) {
      throw new ValidationException("Order total must not be negative.");
    }
  }
  protected override void ValidateSubTotal(Money money) {
    if (money.Amount < 0) {
      throw new ValidationException("Order subtotal must not be negative.");
    }
  }
  protected override void ValidateShippingSubTotal(Money money) {
    if (money.Amount < 0) {
      throw new ValidationException("Shipping subtotal must not be negative.");
    }
  }
}
```
