---
title: Create a return order form and exchange offer
slug: commerce-connect-14/docs/using-the-return-order-form
docTags: 
createdAt: 2026-07-23T10:25:33.361Z
---

- `EPiServer.Commerce.Order.IReturnOrderForm`  – Provides information about a return order form. This interface inherits from `IOrderForm`. The `ReturnForms` collection in `IPurchaseOrder` was changed from `ICollection<IOrderForm>` to `ICollection<IReturnForm>`.
- `EPiServer.Commerce.Order.IReturnLineItem`  – Provides information about a return line item. This interface inherits from `ILineItem`. The `LineItem` class inherits `IReturnLineItem` and includes `OriginalLineItemId`.
- `EPiServer.Commerce.Order.IReturnLineItemCalculator`  – Calculates the extended price for an `IReturnLineItem`.
  - `GetExtendedPrice`  – Gets the extended price for an `IReturnLineItem`.
  - `GetDiscountedPrice`  – Gets the discounted price for an `IReturnLineItem`.
- `EPiServer.Commerce.Order.IReturnOrderFormCalculator`  – Calculates totals on an `IReturnOrderForm`.
  - `GetHandlingTotal`  – Gets the handling total for an `IReturnOrderForm`.
  - `GetSubTotal`  – Calculates the total of all shipments in an `IReturnOrderForm`.
  - `GetTotal`  – Gets the total for an `IReturnOrderForm`.
  - `GetOrderDiscountTotal`  – Gets the discount price of an `IReturnOrderForm`.
  - `GetDiscountTotal`  – Gets the discount total of an `IReturnOrderForm`.
- `EPiServer.Commerce.Order.IShippingCalculator`  – Provides an API for shipping calculations.
  - `GetShippingReturnItemsTotal`  – Gets the total process for all return line items in the shipment.
- `EPiServer.Commerce.Order.ITaxCalculator`  – Provides APIs for tax calculations.
  - `GetShippingReturnTaxTotal`  – Gets the tax total for a return shipment.
  - `GetReturnTaxTotal`  – Gets the return tax total for an `IReturnOrderForm`.
- `EPiServer.Commerce.Order.IPurchaseOrderFactory`  – Creates instances of purchasing order components.
  - `CreateReturnOrderForm`  – Creates the return order form for a purchase order.

```csharp
var purchaseOrderFactory = ServiceLocator.Current.GetInstance<IPurchaseOrderFactory>();
var orderRepository = ServiceLocator.Current.GetInstance<IOrderRepository>();
var orderLink = new OrderReference(1, "Default", Guid.NewGuid(), typeof(IPurchaseOrder));
var purchaseOrder = orderRepository.Load<IPurchaseOrder>(orderLink.OrderGroupId);
var returnOrderForm = purchaseOrderFactory.CreateReturnOrderForm(purchaseOrder);
```

- `CreateReturnShipment`  – Creates a shipment for the return.

```csharp
var purchaseOrderFactory = ServiceLocator.Current.GetInstance<IPurchaseOrderFactory>();
var orderRepository = ServiceLocator.Current.GetInstance<IOrderRepository>();
var orderLink = new OrderReference(1, "Default", Guid.NewGuid(), typeof(IPurchaseOrder));
var purchaseOrder = orderRepository.Load<IPurchaseOrder>(orderLink.OrderGroupId);
var shipment = purchaseOrder.GetFirstShipment();
var returnShipment = purchaseOrderFactory.CreateReturnShipment(shipment);
```

- `CreateReturnLineItem`  – Creates a return line item from an original line item, with a specified return quantity and reason.

```csharp
var purchaseOrderFactory = ServiceLocator.Current.GetInstance<IPurchaseOrderFactory>();
var orderRepository = ServiceLocator.Current.GetInstance<IOrderRepository>();
var orderLink = new OrderReference(1, "Default", Guid.NewGuid(), typeof(IPurchaseOrder));
var purchaseOrder = orderRepository.Load<IPurchaseOrder>(orderLink.OrderGroupId);
var shipment = purchaseOrder.GetFirstShipment();
var returnLineItem = purchaseOrderFactory.CreateReturnLineItem(shipment.LineItems.First(), 1, "broken");
```

- `CreateExchangePayment`  – Creates a payment for an exchange order.

```csharp
var purchaseOrderFactory = ServiceLocator.Current.GetInstance<IPurchaseOrderFactory>();
var orderRepository = ServiceLocator.Current.GetInstance<IOrderRepository>();
var orderLink = new OrderReference(1, "Default", Guid.NewGuid(), typeof(IPurchaseOrder));
var purchaseOrder = orderRepository.Load<IPurchaseOrder>(orderLink.OrderGroupId);
var shipment = purchaseOrder.GetFirstShipment();
var exchangePayment = purchaseOrderFactory.CreateExchangePayment();
```

- `EPiServer.Commerce.Order.IReturnPurchaseOrderCalculator`  – Calculates return totals on a purchase order.
- `GetTotal`  – Gets the total of all return order forms.

```csharp
var returnOrderCalculator = ServiceLocator.Current.GetInstance<IReturnOrderCalculator>();
var orderRepository = ServiceLocator.Current.GetInstance<IOrderRepository>();
var orderLink = new OrderReference(1, "Default", Guid.NewGuid(), typeof(IPurchaseOrder));
var purchaseOrder = orderRepository.Load<IPurchaseOrder>(orderLink.OrderGroupId);
var returnTotal = returnOrderCalculator.GetTotal(purchaseOrder);
```

- `GetSubTotal`  – Gets the subtotal of all return order forms.

```csharp
var returnOrderCalculator = ServiceLocator.Current.GetInstance<IReturnOrderCalculator>();
var orderRepository = ServiceLocator.Current.GetInstance<IOrderRepository>();
var orderLink = new OrderReference(1, "Default", Guid.NewGuid(), typeof(IPurchaseOrder));
var purchaseOrder = orderRepository.Load<IPurchaseOrder>(orderLink.OrderGroupId);
var returnSubTotal = returnOrderCalculator.GetSubTotal(purchaseOrder);
```

- `EPiServer.Commerce.Order.IReturnOrderNumberGenerator`  – Generates the return order form number and exchange order number.

```csharp
var purchaseOrderFactory = ServiceLocator.Current.GetInstance<IPurchaseOrderFactory>();
var orderRepository = ServiceLocator.Current.GetInstance<IOrderRepository>();
var orderLink = new OrderReference(1, "Default", Guid.NewGuid(), typeof(IPurchaseOrder));
var order = orderRepository.Load<IPurchaseOrder>(orderLink.OrderGroupId);
var returnOrderNumberGenerator = ServiceLocator.Current.GetInstance<IReturnOrderNumberGenerator>();
var exchangeOrderNumber = returnOrderNumberGenerator.GenerateExchangeOrderNumber(order);
var returnOrderFormNumber = returnOrderNumberGenerator.GenerateReturnOrderFormNumber(order);
```

- `EPiServer.Commerce.Order.IReturnOrderFormExtensions`  – Provides extensions for the return order form.

**Extensions**

- `CanCreateExchangeOrder`  – Checks whether an exchange order can be created from a return order form.
- `IsEditable`  – Checks whether a return order form is editable.
- `IsCancellable`  – Checks whether a return order form is cancellable.
- `IsCompletable`  – Checks whether a return order form is completable.
- `IsAwaitingCompletable`  – Checks whether a return order form is awaiting completion.
- `EPiServer.Commerce.Order.IReturnOrderService`  – Handles operations on `IReturnOrderForm` such as completing, canceling a return, or acknowledging receipt of items. Also provides an operation to create an exchange order from a purchase order.
- `AcknowledgeReceiptItems`  – Acknowledges the receipt of items on a return form.

```csharp
var returnOrderService = ServiceLocator.Current.GetInstance<IReturnOrderService>();
var orderRepository = ServiceLocator.Current.GetInstance<IOrderRepository>();
var orderLink = new OrderReference(1, "Default", Guid.NewGuid(), typeof(IPurchaseOrder));
var purchaseOrder = orderRepository.Load<IPurchaseOrder>(orderLink.OrderGroupId);
var returnOrderForm = purchaseOrder.ReturnForms.First();
returnOrderService.AcknowledgeReceiptItems(returnOrderForm);
```

- `CancelReturn`  – Cancels a return form.

```csharp
var returnOrderService = ServiceLocator.Current.GetInstance<IReturnOrderService>();
var orderRepository = ServiceLocator.Current.GetInstance<IOrderRepository>();
var orderLink = new OrderReference(1, "Default", Guid.NewGuid(), typeof(IPurchaseOrder));
var purchaseOrder = orderRepository.Load<IPurchaseOrder>(orderLink.OrderGroupId);
var returnOrderForm = purchaseOrder.ReturnForms.First();
returnOrderService.CancelReturn(returnOrderForm);
```

Note that the purchase order was saved but not recalculated. It needs to be recalculated and saved.

```csharp
OrderStatusManager.RecalculatePurchaseOrder(purchaseOrder);
orderRepository.Service.Save(purchaseOrder);
```

- `CompleteReturn`  – Completes a return form.

```csharp
var returnOrderService = ServiceLocator.Current.GetInstance<IReturnOrderService>();
var orderRepository = ServiceLocator.Current.GetInstance<IOrderRepository>();
var orderLink = new OrderReference(1, "Default", Guid.NewGuid(), typeof(IPurchaseOrder));
var purchaseOrder = orderRepository.Load<IPurchaseOrder>(orderLink.OrderGroupId);
var returnOrderForm = purchaseOrder.ReturnForms.First();
returnOrderService.CompleteReturn(returnOrderForm);
```

Note that the purchase order and any exchange order were saved but not recalculated. They need to be recalculated and saved.

```csharp
OrderStatusManager.RecalculatePurchaseOrder(purchaseOrder);
orderRepository.Service.Save(purchaseOrder);
var exchangeOrder = orderRepository.Service.Load<IPurchaseOrder>(purchaseOrder.ExchangeOrderGroupId.Value);
if (exchangeOrder != null)
{
  OrderStatusManager.RecalculatePurchaseOrder((PurchaseOrder)exchangeOrder);
  orderRepository.Service.Save(exchangeOrder);
}
```

- `CreateExchangeOrder`  – Creates an exchange order from a purchase order.

```csharp
var returnOrderService = ServiceLocator.Current.GetInstance<IReturnOrderService>();
var orderRepository = ServiceLocator.Current.GetInstance<IOrderRepository>();
var orderLink = new OrderReference(1, "Default", Guid.NewGuid(), typeof(IPurchaseOrder));
var purchaseOrder = orderRepository.Load<IPurchaseOrder>(orderLink.OrderGroupId);
var exchangeOrder = returnOrderService.CreateExchangeOrder(purchaseOrder, purchaseOrder.GetFirstShipment());
```

After creating an exchange order, if you are using `PurchaseOrder` (from `IPurchaseOrder`) and `OrderAddress` (from `IOrderAddress`), the address needs to be cloned from the original purchase order to the exchange order.

```csharp
var purchaseOrder = orderRepository.Load<IPurchaseOrder>(orderLink.OrderGroupId) as PurchaseOrder;
var exchangeOrder = returnOrderService.CreateExchangeOrder(purchaseOrder, purchaseOrder.GetFirstShipment()) as PurchaseOrder;
exchangeOrder.OrderAddresses.Clear();
        
foreach (var orderAddress in purchaseOrder.OrderAddresses)
{
   var clonedOrderAddress = (OrderAddress)orderAddress.Clone();
   clonedOrderAddress.OrderGroupId = purchaseOrder.OrderGroupId;
   purchaseOrder.OrderAddresses.Add(clonedOrderAddress);
}
```
