public ActionResult ECheck()
        {
            var customer = HttpContext.GetCustomer();

            if (!PaymentOptionProvider.PaymentMethodSelectionIsValid(AppLogic.ro_PMECheck, customer))
            {
                NoticeProvider.PushNotice(
                    message: AppLogic.GetString("checkout.paymentmethodnotallowed"),
                    type: NoticeType.Failure);
                return(RedirectToAction(ActionNames.Index, ControllerNames.Checkout));
            }

            // AcceptJS is currently only way to use EChecks
            if (AppLogic.ActivePaymentGatewayCleaned() != Gateway.ro_GWACCEPTJS)
            {
                NoticeProvider.PushNotice(
                    message: AppLogic.GetString("acceptjs.echeck.notconfigured"),
                    type: NoticeType.Failure);
                return(RedirectToAction(ActionNames.Index, ControllerNames.Checkout));
            }

            var liveMode = AppLogic.AppConfigBool("UseLiveTransactions");

            var acceptJsModel = new AcceptJsViewModel(
                clientKey: liveMode
                                        ? AppLogic.AppConfig("AcceptJs.Live.ClientKey")
                                        : AppLogic.AppConfig("AcceptJs.Test.ClientKey"),
                apiLoginId: liveMode
                                        ? AppLogic.AppConfig("AcceptJs.Live.ApiLoginId")
                                        : AppLogic.AppConfig("AcceptJs.Test.ApiLoginId"),
                scriptUrlHostedForm: liveMode
                                        ? AppLogic.AppConfig("AcceptJs.Form.Hosted.Live.Url")
                                        : AppLogic.AppConfig("AcceptJs.Form.Hosted.Test.Url"),
                scriptUrlOwnForm: liveMode
                                        ? AppLogic.AppConfig("AcceptJs.Form.Own.Live.Url")
                                        : AppLogic.AppConfig("AcceptJs.Form.Own.Test.Url"));

            var acceptJsECheckModel = new AcceptJsEcheckViewModel(
                acceptJsViewModel: acceptJsModel,
                eCheckViewModel: new ECheckViewModel(),
                checkoutECheckViewModel: new CheckoutECheckViewModel(string.Empty, string.Empty),
                accountTypes: ECheckAccountTypeProvider.GetECheckAccountTypesSelectList());

            return(View(ViewNames.AcceptJsECheck, acceptJsECheckModel));
        }
        public ActionResult CreditCard()
        {
            var customer = HttpContext.GetCustomer();

            if (!PaymentOptionProvider.PaymentMethodSelectionIsValid(AppLogic.ro_PMCreditCard, customer))
            {
                NoticeProvider.PushNotice(
                    message: AppLogic.GetString("checkout.paymentmethodnotallowed"),
                    type: NoticeType.Failure);
                return(RedirectToAction(ActionNames.Index, ControllerNames.Checkout));
            }

            //Decide which form to display
            if (AppLogic.ActivePaymentGatewayCleaned() == Gateway.ro_GWBRAINTREE)
            {
                var processor = GatewayLoader.GetProcessor(Gateway.ro_GWBRAINTREE);

                var clientToken = processor.ObtainBraintreeToken();

                if (string.IsNullOrEmpty(clientToken))
                {
                    NoticeProvider.PushNotice(AppLogic.GetString("braintree.creditcardunavailable"), NoticeType.Failure);
                    return(RedirectToAction(ActionNames.Index, ControllerNames.Checkout));
                }

                var braintreeModel = new BraintreeViewModel(token: clientToken,
                                                            scriptUrl: AppLogic.AppConfig("Braintree.ScriptUrl"));

                return(View(ViewNames.BraintreeCreditCard, braintreeModel));
            }
            else if (AppLogic.ActivePaymentGatewayCleaned() == Gateway.ro_GWACCEPTJS)
            {
                var liveMode = AppLogic.AppConfigBool("UseLiveTransactions");
                var cart     = CachedShoppingCartProvider.Get(customer, CartTypeEnum.ShoppingCart, AppLogic.StoreID());

                var acceptJsModel = new AcceptJsViewModel(
                    clientKey: liveMode
                                                ? AppLogic.AppConfig("AcceptJs.Live.ClientKey")
                                                : AppLogic.AppConfig("AcceptJs.Test.ClientKey"),
                    apiLoginId: liveMode
                                                ? AppLogic.AppConfig("AcceptJs.Live.ApiLoginId")
                                                : AppLogic.AppConfig("AcceptJs.Test.ApiLoginId"),
                    scriptUrlHostedForm: liveMode
                                                ? AppLogic.AppConfig("AcceptJs.Form.Hosted.Live.Url")
                                                : AppLogic.AppConfig("AcceptJs.Form.Hosted.Test.Url"),
                    scriptUrlOwnForm: liveMode
                                                ? AppLogic.AppConfig("AcceptJs.Form.Own.Live.Url")
                                                : AppLogic.AppConfig("AcceptJs.Form.Own.Test.Url"));


                return(View(ViewNames.AcceptJsCreditCard, acceptJsModel));
            }
            else if (AppLogic.ActivePaymentGatewayCleaned() == Gateway.ro_GWSAGEPAYPI)
            {
                var processor = (ISagePayPiGatewayProcessor)GatewayLoader.GetProcessor(Gateway.ro_GWSAGEPAYPI);

                var clientMerchantSessionKey = processor.ObtainSagePayPiMerchantSessionKey();

                if (string.IsNullOrEmpty(clientMerchantSessionKey))
                {
                    NoticeProvider.PushNotice(AppLogic.GetString("sagepaypi.creditcardunavailable"), NoticeType.Failure);
                    return(RedirectToAction(ActionNames.Index, ControllerNames.Checkout));
                }

                var sagePayPiModel = new SagePayPiViewModel(merchantSessionKey: clientMerchantSessionKey,
                                                            scriptUrl: AppLogic.AppConfigBool("UseLiveTransactions")
                                                ? AppLogic.AppConfig("SagePayPi.LiveScriptUrl")
                                                : AppLogic.AppConfig("SagePayPi.TestScriptUrl"),
                                                            validateCreditCardNumber: AppLogic.AppConfigBool("ValidateCreditCardNumbers"));

                return(View(ViewNames.SagePayPiCreditCard, sagePayPiModel));
            }
            else
            {
                var ccModel = BuildCheckoutCreditCardViewModel(customer);
                return(View(ViewNames.CreditCard, ccModel));
            }
        }