Create a return order form and exchange offer
Describes how create a return order form and an exchange order in Optimizely Commerce Connect.
EPiServer.Commerce.Order.IReturnOrderForm– Provides information about a return order form. This interface inherits fromIOrderForm. TheReturnFormscollection inIPurchaseOrderwas changed fromICollection<IOrderForm>toICollection<IReturnForm>.EPiServer.Commerce.Order.IReturnLineItem– Provides information about a return line item. This interface inherits fromILineItem. TheLineItemclass inheritsIReturnLineItemand includesOriginalLineItemId.EPiServer.Commerce.Order.IReturnLineItemCalculator– Calculates the extended price for anIReturnLineItem.GetExtendedPrice– Gets the extended price for anIReturnLineItem.GetDiscountedPrice– Gets the discounted price for anIReturnLineItem.
EPiServer.Commerce.Order.IReturnOrderFormCalculator– Calculates totals on anIReturnOrderForm.GetHandlingTotal– Gets the handling total for anIReturnOrderForm.GetSubTotal– Calculates the total of all shipments in anIReturnOrderForm.GetTotal– Gets the total for anIReturnOrderForm.GetOrderDiscountTotal– Gets the discount price of anIReturnOrderForm.GetDiscountTotal– Gets the discount total of anIReturnOrderForm.
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 anIReturnOrderForm.
EPiServer.Commerce.Order.IPurchaseOrderFactory– Creates instances of purchasing order components.CreateReturnOrderForm– Creates the return order form for a purchase order.
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.
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.
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.
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.
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.
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.
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 onIReturnOrderFormsuch 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.
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.
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.
OrderStatusManager.RecalculatePurchaseOrder(purchaseOrder);
orderRepository.Service.Save(purchaseOrder);CompleteReturn– Completes a return form.
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.
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.
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.
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);
}Updated 11 days ago