/// <summary>
            /// Gets the transaction for custom receipts.
            /// </summary>
            /// <param name="request">The get receipt request.</param>
            /// <returns>The sales order.</returns>
            /// <remarks>
            /// This method is used to handle custom receipt. Since only sales order related receipt
            /// is using receipt designer while others are hardcoded, so we cannot support customizing receipts for
            /// NonSalesTransaction or DropAndDeclareTransaction.
            /// Here we first try to load the SalesOrder, if we cannot find it, then try to load
            /// a cart and convert it to sales order.
            /// </remarks>
            private SalesOrder GetTransactionForCustomReceipt(GetReceiptRequest request)
            {
                ReceiptRetrievalCriteria criteria = request.ReceiptRetrievalCriteria;
                string transactionId = request.TransactionId;

                SalesOrder salesOrder = null;

                if (!criteria.QueryBySalesId)
                {
                    salesOrder = this.GetTransactionByTransactionId(transactionId, false) ?? this.GetTransactionByTransactionId(transactionId, true);
                }
                else
                {
                    try
                    {
                        salesOrder = this.GetTransactionBySalesId(transactionId);
                    }
                    catch (FeatureNotSupportedException)
                    {
                        // Not able to get sales order in offline mode.
                    }
                }

                // If cannot find a sales order, then try to find a cart (suspended transaction).
                if (salesOrder == null)
                {
                    SalesTransaction salesTransaction = CartWorkflowHelper.LoadSalesTransaction(request.RequestContext, request.TransactionId);
                    if (salesTransaction != null)
                    {
                        salesOrder = new SalesOrder();

                        // Now ReceiptService only accept SalesOrder. So in order to reuse the code in ReceiptService, we need to convert
                        // SalesTransaction to SalesOrder. SalesOrder is extended from SalesTransaction, so in this case we are good. But
                        // in the future we should refactor ReceiptService to make it accept a common interface so that we can extend to
                        // other objects.
                        salesOrder.CopyFrom(salesTransaction);
                    }
                    else
                    {
                        throw new DataValidationException(
                                  DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_ObjectNotFound,
                                  string.Format("Unable to get the transaction created. ID: {0}", transactionId));
                    }
                }

                return(salesOrder);
            }