/// <summary>
            /// Captures the payment.
            /// </summary>
            /// <param name="request">The request.</param>
            /// <returns>A response containing the captured tender line.</returns>
            private static CapturePaymentServiceResponse CapturePayment(CapturePaymentServiceRequest request)
            {
                if (request == null)
                {
                    throw new ArgumentNullException("request");
                }

                switch (request.TenderLine.Status)
                {
                case TenderLineStatus.PendingCommit:
                    IRequestHandler paymentService = ResolvePaymentService(request.RequestContext, request.GetType(), request.TenderLine.TenderTypeId);
                    return(request.RequestContext.Runtime.Execute <CapturePaymentServiceResponse>(request, request.RequestContext, paymentService));

                case TenderLineStatus.Committed:
                    return(new CapturePaymentServiceResponse(request.TenderLine));

                case TenderLineStatus.Historical:
                case TenderLineStatus.Voided:
                    // for tender lines that are voided or historical do nothing and simple return same tender line.
                    return(new CapturePaymentServiceResponse(request.TenderLine));

                case TenderLineStatus.NotProcessed:
                case TenderLineStatus.None:
                    throw new DataValidationException(
                              DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_InvalidRequest,
                              string.Format("Tender line in status {0} cannot be captured.", request.TenderLine.Status));

                default:
                    throw new DataValidationException(
                              DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_InvalidRequest,
                              string.Format("Tender line in status {0} is not supported.", request.TenderLine.Status));
                }
            }
            /// <summary>
            /// Captures the payment.
            /// </summary>
            /// <param name="request">The request.</param>
            /// <returns>A response containing the captured tender line.</returns>
            private static CapturePaymentServiceResponse CapturePayment(CapturePaymentServiceRequest request)
            {
                if (request == null)
                {
                    throw new ArgumentNullException("request");
                }

                if (request.TenderLine.Amount <= 0)
                {
                    throw new PaymentException(PaymentErrors.Microsoft_Dynamics_Commerce_Runtime_InvalidPaymentRequest, "Only positive amount can be paid by credit memo.");
                }

                if (string.IsNullOrWhiteSpace(request.TenderLine.CreditMemoId))
                {
                    throw new PaymentException(PaymentErrors.Microsoft_Dynamics_Commerce_Runtime_InvalidPaymentRequest, "Credit memo identifier is not specified.");
                }

                var payCreditMemoRealtimeRequest = new PayCreditMemoRealtimeRequest(
                    request.TenderLine.CreditMemoId,
                    request.RequestContext.GetPrincipal().ChannelId.ToString(CultureInfo.InvariantCulture),
                    request.RequestContext.GetPrincipal().TerminalId.ToString(CultureInfo.InvariantCulture),
                    request.RequestContext.GetPrincipal().UserId,
                    request.Transaction.Id,
                    request.Transaction.ReceiptId,
                    request.TenderLine.Currency,
                    request.TenderLine.Amount);

                request.RequestContext.Execute <NullResponse>(payCreditMemoRealtimeRequest);

                request.TenderLine.Status     = TenderLineStatus.Committed;
                request.TenderLine.IsVoidable = false;

                return(new CapturePaymentServiceResponse(request.TenderLine));
            }
            /// <summary>
            /// Captures the payment.
            /// </summary>
            /// <param name="request">The request.</param>
            /// <returns>A response containing the captured tender line.</returns>
            private static CapturePaymentServiceResponse CapturePayment(CapturePaymentServiceRequest request)
            {
                if (request == null)
                {
                    throw new ArgumentNullException("request");
                }

                if (request.RequestContext == null)
                {
                    throw new ArgumentException("request.RequestContext cannot be null.");
                }

                // Post redeem type reward point trans to HQ.
                var redeemLoyaltyRewardPointServiceRequest = new PostLoyaltyCardRewardPointRealtimeRequest(LoyaltyRewardPointEntryType.Redeem, request.Transaction);

                request.RequestContext.Execute <NullResponse>(redeemLoyaltyRewardPointServiceRequest);

                var refundLoyaltyRewardPointServiceRequest = new PostLoyaltyCardRewardPointRealtimeRequest(LoyaltyRewardPointEntryType.Refund, request.Transaction);

                request.RequestContext.Execute <NullResponse>(refundLoyaltyRewardPointServiceRequest);

                request.TenderLine.Status     = TenderLineStatus.Committed;
                request.TenderLine.IsVoidable = false;

                return(new CapturePaymentServiceResponse(request.TenderLine));
            }
            /// <summary>
            /// Captures the payment.
            /// </summary>
            /// <param name="request">The request.</param>
            /// <returns>A response containing the captured tender line.</returns>
            private static CapturePaymentServiceResponse CapturePayment(CapturePaymentServiceRequest request)
            {
                if (request == null)
                {
                    throw new ArgumentNullException("request");
                }

                var payUsingGiftCardRequest = new PayGiftCardRealtimeRequest(
                    request.TenderLine.GiftCardId,
                    request.TenderLine.AmountInTenderedCurrency, // amount in gift card currency
                    request.TenderLine.Currency,                 // gift card currency code
                    request.RequestContext.GetPrincipal().ChannelId,
                    request.RequestContext.GetTerminal() == null ? string.Empty : request.RequestContext.GetTerminal().TerminalId,
                    request.RequestContext.GetPrincipal().UserId ?? string.Empty,
                    request.Transaction.Id,
                    request.Transaction.ReceiptId ?? string.Empty);

                request.RequestContext.Execute <NullResponse>(payUsingGiftCardRequest);

                // To match ePOS behavior (and not break statement calculation and posting) updating tender
                // line to respresent payment done in channel currency.
                request.TenderLine.Currency = request.RequestContext.GetChannelConfiguration().Currency;
                request.TenderLine.AmountInTenderedCurrency = request.TenderLine.Amount;
                request.TenderLine.ExchangeRate             = 1.0m;
                request.TenderLine.Status     = TenderLineStatus.Committed;
                request.TenderLine.IsVoidable = true;

                return(new CapturePaymentServiceResponse(request.TenderLine));
            }