예제 #1
0
        public ActionResult Purchase(CheckoutViewModel viewModel, IPaymentMethodViewModel <PaymentMethodBase> paymentViewModel)
        {
            if (CartIsNullOrEmpty())
            {
                return(Redirect(Url.ContentUrl(ContentReference.StartPage)));
            }

            // Since the payment property is marked with an exclude binding attribute in the CheckoutViewModel
            // it needs to be manually re-added again.
            viewModel.Payment = paymentViewModel;

            if (User.Identity.IsAuthenticated)
            {
                _checkoutService.CheckoutAddressHandling.UpdateAuthenticatedUserAddresses(viewModel);

                var validation = _checkoutService.AuthenticatedPurchaseValidation;

                if (!validation.ValidateModel(ModelState, viewModel) ||
                    !validation.ValidateOrderOperation(ModelState, _cartService.ValidateCart(Cart)) ||
                    !validation.ValidateOrderOperation(ModelState, _cartService.RequestInventory(Cart)))
                {
                    return(View(viewModel));
                }
            }
            else
            {
                _checkoutService.CheckoutAddressHandling.UpdateAnonymousUserAddresses(viewModel);

                var validation = _checkoutService.AnonymousPurchaseValidation;

                if (!validation.ValidateModel(ModelState, viewModel) ||
                    !validation.ValidateOrderOperation(ModelState, _cartService.ValidateCart(Cart)) ||
                    !validation.ValidateOrderOperation(ModelState, _cartService.RequestInventory(Cart)))
                {
                    return(View(viewModel));
                }
            }

            _checkoutService.UpdateShippingAddresses(Cart, viewModel);
            _checkoutService.CreateAndAddPaymentToCart(Cart, viewModel);

            var purchaseOrder = _checkoutService.PlaceOrder(Cart, ModelState, viewModel);

            if (purchaseOrder == null)
            {
                return(View(viewModel));
            }

            var result = _klarnaPaymentsService.Complete(purchaseOrder);

            if (result.IsRedirect)
            {
                Redirect(result.RedirectUrl);
            }

            var confirmationSentSuccessfully = _checkoutService.SendConfirmation(viewModel, purchaseOrder);

            return(Redirect(_checkoutService.BuildRedirectionUrl(viewModel, purchaseOrder, confirmationSentSuccessfully)));
        }
예제 #2
0
        private void CreatePayment(IPaymentMethodViewModel <PaymentMethodBase> paymentViewModel, AddressModel billingAddress)
        {
            IOrderAddress address = _addressBookService.ConvertToAddress(billingAddress);
            var           total   = Cart.GetTotal(_orderGroupCalculator);
            var           payment = paymentViewModel.PaymentMethod.CreatePayment(total.Amount);

            Cart.AddPayment(payment, _orderFactory);
            payment.BillingAddress = address;
        }
        private void CreatePayment(IPaymentMethodViewModel <PaymentMethodBase> paymentViewModel, AddressModel billingAddress)
        {
            IOrderAddress address = _addressBookService.ConvertToAddress(Cart, billingAddress);
            var           total   = Cart.GetTotal(_orderGroupCalculator);
            var           payment = paymentViewModel.PaymentMethod.CreatePayment(Cart, total.Amount);

            Cart.AddPayment(payment, _orderGroupFactory);
            payment.BillingAddress = address;

            if (Cart.IsQuoteCart())
            {
                payment.TransactionType = TransactionType.Capture.ToString();
            }
        }
 private CheckoutViewModel CreateCheckoutViewModel(CheckoutPage currentPage, IPaymentMethodViewModel <PaymentMethodBase> paymentMethodViewModel)
 {
     return(new CheckoutViewModel
     {
         CurrentPage = currentPage,
         Payment = paymentMethodViewModel,
         UseBillingAddressForShipment = true,
         Shipments = _cart.Forms.SelectMany(x => x.Shipments).Select(shipment => new ShipmentViewModel
         {
             ShipmentId = shipment.ShipmentId,
             ShippingMethodId = shipment.ShippingMethodId
         }).ToList(),
         BillingAddress = new AddressModel
         {
             Email = "*****@*****.**"
         }
     });
 }
예제 #5
0
        public async Task <ActionResult> Index(CheckoutPage currentPage)
        {
            if (CartIsNullOrEmpty())
            {
                return(View("EmptyCart"));
            }

            IPaymentMethodViewModel <PaymentMethodBase> paymentMethod = null;
            var selectedPaymentMethod = Request["paymentMethod"];

            if (!string.IsNullOrEmpty(selectedPaymentMethod))
            {
                paymentMethod            = PaymentMethodViewModelResolver.Resolve(selectedPaymentMethod);
                paymentMethod.SystemName = selectedPaymentMethod;
            }

            var viewModel = CreateCheckoutViewModel(currentPage, paymentMethod);

            Cart.Currency = _currencyService.GetCurrentCurrency();

            if (User.Identity.IsAuthenticated)
            {
                _checkoutService.UpdateShippingAddresses(Cart, viewModel);
            }

            _checkoutService.UpdateShippingMethods(Cart, viewModel.Shipments);
            _checkoutService.ApplyDiscounts(Cart);
            _orderRepository.Save(Cart);

            if (viewModel.Payment.SystemName.Equals(Klarna.Payments.Constants.KlarnaPaymentSystemKeyword))
            {
                await _klarnaPaymentsService.CreateOrUpdateSession(Cart);

                (viewModel.Payment as KlarnaPaymentsViewModel)?.InitializeValues();
            }
            if (viewModel.Payment.SystemName.Equals(Klarna.Checkout.Constants.KlarnaCheckoutSystemKeyword))
            {
                _klarnaCheckoutService.CreateOrUpdateOrder(Cart);
                (viewModel.Payment as KlarnaCheckoutViewModel)?.InitializeValues();
            }
            return(View(viewModel.ViewName, viewModel));
        }
예제 #6
0
        protected virtual async Task <IPaymentMethodViewModel> IsSavedCardUsedInRecurringOrders(
            IPaymentMethodViewModel methodViewModel,
            CultureInfo cultureInfo,
            Guid customerId,
            string scope)
        {
            if (methodViewModel is SavedCreditCardPaymentMethodViewModel vm)
            {
                vm.IsUsedInRecurringOrders = await RecurringOrderTemplatesViewService.GetIsPaymentMethodUsedInRecurringOrders(new GetIsPaymentMethodUsedInRecurringOrdersRequest
                {
                    CultureInfo     = cultureInfo,
                    CustomerId      = customerId,
                    PaymentMethodId = methodViewModel.Id.ToString(),
                    ScopeId         = scope
                }).ConfigureAwait(false);

                return(vm);
            }
            return(methodViewModel);
        }
예제 #7
0
        /// <summary>
        /// Returns the fist payment non voided.
        /// </summary>
        protected virtual PaymentViewModel GetPaymentViewModel(
            List <Payment> payments,
            Address shippingAddress,
            Dictionary <string, string> paymentMethodDisplayNames,
            CultureInfo cultureInfo)
        {
            if (payments == null)
            {
                return(BuildEmptyPaymentViewModel());
            }

            var validPayments = payments.Where(x => !x.IsVoided()).ToList();

            if (!validPayments.Any())
            {
                return(BuildEmptyPaymentViewModel());
            }

            var payment = validPayments.First();

            IPaymentMethodViewModel paymentMethodViewModel = null;

            if (payment.PaymentMethod != null)
            {
                paymentMethodViewModel = GetPaymentMethodViewModel(payment.PaymentMethod, paymentMethodDisplayNames, cultureInfo);
            }

            var billingAddressViewModel = GetBillingAddressViewModel(payment.BillingAddress, shippingAddress, cultureInfo);

            return(new PaymentViewModel
            {
                Id = payment.Id,
                IsLocked = payment.PaymentStatus != PaymentStatus.New && payment.PaymentStatus != PaymentStatus.PendingVerification,
                PaymentMethod = paymentMethodViewModel,
                PaymentStatus = payment.PaymentStatus,
                BillingAddress = billingAddressViewModel
            });
        }
예제 #8
0
 private CheckoutViewModel CreateCheckoutViewModel(CheckoutPage currentPage, IPaymentMethodViewModel <PaymentMethodBase> paymentViewModel = null)
 {
     return(_checkoutViewModelFactory.CreateCheckoutViewModel(Cart, currentPage, paymentViewModel));
 }
예제 #9
0
 private ViewResult View(CheckoutViewModel checkoutViewModel, IPaymentMethodViewModel <PaymentMethodBase> paymentViewModel)
 {
     return(View(checkoutViewModel.ViewName, CreateCheckoutViewModel(checkoutViewModel.CurrentPage, paymentViewModel)));
 }
예제 #10
0
        public ActionResult Purchase(CheckoutViewModel checkoutViewModel, IPaymentMethodViewModel <PaymentMethodBase> paymentViewModel)
        {
            if (CartIsNullOrEmpty())
            {
                return(Redirect(Url.ContentUrl(ContentReference.StartPage)));
            }

            if (User.Identity.IsAuthenticated)
            {
                // load billing and shipping address from address book
                _addressBookService.LoadAddress(checkoutViewModel.BillingAddress);

                foreach (var shipment in checkoutViewModel.Shipments)
                {
                    _addressBookService.LoadAddress(shipment.Address);
                }

                // Because address is selected from drop down, so remove validation for fields
                foreach (var state in ModelState.Where(x => (x.Key.StartsWith("BillingAddress")) || x.Key.StartsWith("Shipments")).ToArray())
                {
                    ModelState.Remove(state);
                }
            }

            if (checkoutViewModel.UseBillingAddressForShipment)
            {
                // If only the billing address is of interest we need to remove any existing error related to the
                // other shipping addresses.
                if (!User.Identity.IsAuthenticated)
                {
                    foreach (var state in ModelState.Where(x => x.Key.StartsWith("Shipments")).ToArray())
                    {
                        ModelState.Remove(state);
                    }
                }

                checkoutViewModel.Shipments.Single().Address = checkoutViewModel.BillingAddress;
            }

            ValidateBillingAddress(checkoutViewModel);

            HandleValidationIssues(_cartService.ValidateCart(Cart));

            if (!ModelState.IsValid)
            {
                return(View(checkoutViewModel, paymentViewModel));
            }

            // Since the payment property is marked with an exclude binding attribute in the CheckoutViewModel
            // it needs to be manually re-added again.
            checkoutViewModel.Payment = paymentViewModel;

            ValidateShippingAddress(checkoutViewModel);

            HandleValidationIssues(_cartService.RequestInventory(Cart));

            if (!ModelState.IsValid)
            {
                return(View(checkoutViewModel, paymentViewModel));
            }

            UpdateAddressNames(checkoutViewModel);

            SetShipmentAddresses(checkoutViewModel.Shipments);

            CreatePayment(checkoutViewModel.Payment, checkoutViewModel.BillingAddress);

            var            startpage        = _contentRepository.Get <StartPage>(ContentReference.StartPage);
            var            confirmationPage = _contentRepository.GetFirstChild <OrderConfirmationPage>(checkoutViewModel.CurrentPage.ContentLink);
            IPurchaseOrder purchaseOrder    = null;

            try
            {
                purchaseOrder = PlaceOrder(checkoutViewModel);
            }
            catch (PaymentException)
            {
                ModelState.AddModelError("", _localizationService.GetString("/Checkout/Payment/Errors/ProcessingPaymentFailure"));
                return(View(checkoutViewModel, paymentViewModel));
            }

            var queryCollection = new NameValueCollection
            {
                { "contactId", _customerContext.CurrentContactId.ToString() },
                { "orderNumber", purchaseOrder.OrderLink.OrderGroupId.ToString(CultureInfo.CurrentCulture) }
            };

            SendConfirmationEmail(checkoutViewModel.BillingAddress.Email, startpage.OrderConfirmationMail, confirmationPage.Language.Name, queryCollection);

            return(Redirect(new UrlBuilder(confirmationPage.LinkURL)
            {
                QueryCollection = queryCollection
            }.ToString()));
        }
예제 #11
0
        public ActionResult Update(CheckoutPage currentPage, UpdateShippingMethodViewModel shipmentViewModel, IPaymentMethodViewModel <PaymentMethodBase> paymentViewModel)
        {
            ModelState.Clear();

            UpdateShippingMethodIds(Cart, shipmentViewModel.Shipments);
            _orderRepository.Save(Cart);

            var viewModel = CreateCheckoutViewModel(currentPage, paymentViewModel);

            return(PartialView("Partial", viewModel));
        }
 private CheckoutViewModel CreateCheckoutViewModelWithAddressIds(CheckoutPage currentPage, IPaymentMethodViewModel <PaymentMethodBase> paymentMethodViewModel, bool useBillingAddressForShipment)
 {
     return(new CheckoutViewModel
     {
         CurrentPage = currentPage,
         Payment = paymentMethodViewModel,
         UseBillingAddressForShipment = useBillingAddressForShipment,
         Shipments = _cart.Forms.SelectMany(x => x.Shipments).Select(shipment => new ShipmentViewModel
         {
             ShipmentId = shipment.ShipmentId,
             ShippingMethodId = shipment.ShippingMethodId,
             Address = new AddressModel()
             {
                 AddressId = Guid.NewGuid().ToString()
             }
         }).ToList(),
         BillingAddress = new AddressModel
         {
             AddressId = Guid.NewGuid().ToString(),
             Email = "*****@*****.**"
         }
     });
 }
예제 #13
0
 protected virtual void IsCreditCardPaymentMethod(IPaymentMethodViewModel paymentMethod)
 {
     paymentMethod.IsCreditCardPaymentMethod = paymentMethod.PaymentProviderType == "MonerisCanadaPaymentProvider";
 }
 private CheckoutViewModel CreateCheckoutViewModelWithAddressIds(CheckoutPage currentPage, IPaymentMethodViewModel<PaymentMethodBase> paymentMethodViewModel, bool useBillingAddressForShipment)
 {
     return new CheckoutViewModel
     {
         CurrentPage = currentPage,
         Payment = paymentMethodViewModel,
         UseBillingAddressForShipment = useBillingAddressForShipment,
         Shipments = _cart.Forms.SelectMany(x => x.Shipments).Select(shipment => new ShipmentViewModel
         {
             ShipmentId = shipment.ShipmentId,
             ShippingMethodId = shipment.ShippingMethodId,
             Address = new AddressModel()
             {
                 AddressId = Guid.NewGuid().ToString()                        
             }
         }).ToList(),
         BillingAddress = new AddressModel
         {
             AddressId = Guid.NewGuid().ToString(),
             Email = "*****@*****.**"
         }
     };
 }
예제 #15
0
        public ActionResult Update(CheckoutPage currentPage, CheckoutViewModel viewModel, IPaymentMethodViewModel <IPaymentOption> paymentViewModel)
        {
            // Since the payment property is marked with an exclude binding attribute in the CheckoutViewModel
            // it needs to be manually re-added again.
            viewModel.Payment = paymentViewModel;

            InitializeCheckoutViewModel(currentPage, viewModel);

            IEnumerable <ShippingAddress> shippingAddresses = (viewModel.UseBillingAddressForShipment) ? new ShippingAddress[] { viewModel.BillingAddress } : viewModel.ShippingAddresses;

            foreach (var shippingAddress in shippingAddresses)
            {
                var shipment               = _checkoutService.CreateShipment();
                var shippingMethods        = _checkoutService.GetShippingRates(shipment);
                var selectedShippingMethod = shippingMethods.FirstOrDefault(x => x.Id == shippingAddress.ShippingMethodId) ?? shippingMethods.First();

                _checkoutService.UpdateShipment(shipment, selectedShippingMethod);
            }

            _cartService.RunWorkflow(OrderGroupWorkflowManager.CartValidateWorkflowName);
            _cartService.SaveCart();

            // Clearing the ModelState will remove any unwanted input validation errors in the new view.
            ModelState.Clear();

            return(PartialView("Partial", viewModel));
        }
예제 #16
0
        public async Task <ActionResult> Update(CheckoutPage currentPage, UpdateShippingMethodViewModel shipmentViewModel, IPaymentMethodViewModel <PaymentMethodBase> paymentViewModel, CheckoutViewModel inputModel)
        {
            ModelState.Clear();

            _checkoutService.UpdateShippingMethods(Cart, shipmentViewModel.Shipments);
            _checkoutService.ApplyDiscounts(Cart);
            _orderRepository.Save(Cart);

            var viewModel = CreateCheckoutViewModel(currentPage, paymentViewModel);

            await _klarnaPaymentsService.CreateOrUpdateSession(Cart);

            return(PartialView("Partial", viewModel));
        }
        public virtual CheckoutViewModel CreateCheckoutViewModel(ICart cart, CheckoutPage currentPage, IPaymentMethodViewModel<PaymentMethodBase> paymentViewModel = null)
        {
            if (cart == null)
            {
                return CreateEmptyCheckoutViewModel(currentPage);
            }

            var shipments = _shipmentViewModelFactory.CreateShipmentsViewModel(cart).ToList();

            var viewModel = new CheckoutViewModel
            {
                CurrentPage = currentPage,
                Shipments = shipments,
                BillingAddress = CreateBillingAddressModel(),
                UseBillingAddressForShipment = shipments.Count == 1 && _addressBookService.UseBillingAddressForShipment(),
                StartPage = _contentLoader.Get<StartPage>(ContentReference.StartPage),
                AppliedCouponCodes = cart.GetFirstForm().CouponCodes.Distinct(),
                AvailableAddresses = new List<AddressModel>(),
                ReferrerUrl = GetReferrerUrl(),
                Payment = paymentViewModel,
            };

            UpdatePayment(viewModel);
                        
            var availableAddresses = GetAvailableAddresses();

            if (availableAddresses.Any())
            {
                viewModel.AvailableAddresses.Add(new AddressModel { Name = _localizationService.GetString("/Checkout/MultiShipment/SelectAddress") });
                
                foreach (var address in availableAddresses)
                {
                    viewModel.AvailableAddresses.Add(address);
                }
            }
            else
            {
                viewModel.AvailableAddresses.Add(new AddressModel { Name = _localizationService.GetString("/Checkout/MultiShipment/NoAddressFound") });
            }

            SetDefaultShipmentAddress(viewModel);

            _addressBookService.LoadAddress(viewModel.BillingAddress);
            PopulateCountryAndRegions(viewModel);

            return viewModel;
        }
예제 #18
0
        protected virtual async Task <CheckoutPaymentViewModel> MapCheckoutPaymentViewModel(
            Overture.ServiceModel.Orders.Cart cart,
            List <IPaymentMethodViewModel> paymentMethodViewModels,
            CultureInfo cultureInfo,
            bool isAuthenticated)
        {
            var payment = GetActivePayment(cart);

            if (payment == null)
            {
                return(null);
            }

            var paymentId = payment.Id;

            IPaymentMethodViewModel activePaymentMethodVm = null;
            ActivePaymentViewModel  activePaymentVm       = null;

            if (payment.PaymentMethod != null)
            {
                activePaymentMethodVm = paymentMethodViewModels.FirstOrDefault(pm =>
                                                                               pm.Id == payment.PaymentMethod.Id &&
                                                                               pm.PaymentProviderName == payment.PaymentMethod.PaymentProviderName &&
                                                                               pm.IsValid
                                                                               );
            }

            if (activePaymentMethodVm != null)
            {
                var provider = PaymentProviderFactory.ResolveProvider(payment.PaymentMethod.PaymentProviderName);

                activePaymentVm = GetActivePaymentViewModel(new GetActivePaymentViewModelParam
                {
                    Cart            = cart,
                    CultureInfo     = cultureInfo,
                    PaymentProvider = provider,
                    IsAuthenticated = isAuthenticated
                });
            }
            else
            {
                // If active payment is set to soemthing that doesn't exists anymore
                // Select the first payment method available...
                var validPaymentMethods = paymentMethodViewModels.Where(pm => pm.IsValid);
                activePaymentMethodVm = validPaymentMethods.FirstOrDefault(pm => pm.Default) ?? validPaymentMethods.FirstOrDefault();

                activePaymentVm = await UpdateActivePaymentMethodAsync(new UpdatePaymentMethodParam
                {
                    CartName            = cart.Name,
                    CultureInfo         = cultureInfo,
                    CustomerId          = cart.CustomerId,
                    IsAuthenticated     = isAuthenticated,
                    Scope               = cart.ScopeId,
                    PaymentId           = paymentId,
                    PaymentMethodId     = activePaymentMethodVm.Id,
                    PaymentProviderName = activePaymentMethodVm.PaymentProviderName,
                }).ConfigureAwait(false);

                if (activePaymentVm != null)
                {
                    paymentId = activePaymentVm.Id;
                }
            }

            if (activePaymentMethodVm != null)
            {
                activePaymentMethodVm.IsSelected = true;
            }

            var vm = new CheckoutPaymentViewModel
            {
                PaymentId              = paymentId,
                PaymentMethods         = paymentMethodViewModels,
                ActivePaymentViewModel = activePaymentVm
            };

            return(vm);
        }
예제 #19
0
        public ActionResult Purchase(CheckoutPage currentPage, CheckoutViewModel checkoutViewModel, IPaymentMethodViewModel <IPaymentOption> paymentViewModel)
        {
            // Since the payment property is marked with an exclude binding attribute in the CheckoutViewModel
            // it needs to be manually re-added again.
            checkoutViewModel.Payment = paymentViewModel;

            if (String.IsNullOrEmpty(checkoutViewModel.BillingAddress.Email))
            {
                ModelState.AddModelError("BillingAddress.Email", _localizationService.GetString("/Shared/Address/Form/Empty/Email"));
            }

            if (checkoutViewModel.UseBillingAddressForShipment)
            {
                // If only the billing address is of interest we need to remove any existing error related to the
                // other shipping addresses.
                foreach (var state in ModelState.Where(x => x.Key.StartsWith("ShippingAddresses")).ToArray())
                {
                    ModelState.Remove(state);
                }
            }

            if (!ModelState.IsValid)
            {
                InitializeCheckoutViewModel(currentPage, checkoutViewModel);
                return(View("Index", checkoutViewModel));
            }

            _checkoutService.ClearOrderAddresses();

            // If the shipping address should be the same as the billing address, replace all existing shipping addresses to
            // be the same as the billing address instead.
            if (checkoutViewModel.UseBillingAddressForShipment)
            {
                checkoutViewModel.ShippingAddresses = new ShippingAddress[] { checkoutViewModel.BillingAddress };
            }

            SaveBillingAddress(checkoutViewModel);

            SaveShippingAddresses(checkoutViewModel);

            _cartService.RunWorkflow(OrderGroupWorkflowManager.CartPrepareWorkflowName);
            _cartService.SaveCart();

            try
            {
                _paymentService.ProcessPayment(checkoutViewModel.Payment.PaymentMethod);
            }
            catch (PreProcessException)
            {
                ModelState.AddModelError("PaymentMethod", _localizationService.GetString("/Checkout/Payment/Errors/PreProcessingFailure"));
            }

            if (!ModelState.IsValid)
            {
                InitializeCheckoutViewModel(currentPage, checkoutViewModel);
                return(View("Index", checkoutViewModel));
            }

            return(Finish(currentPage));
        }
 private CheckoutViewModel CreateCheckoutViewModel(CheckoutPage currentPage, IPaymentMethodViewModel<PaymentMethodBase> paymentMethodViewModel)
 {
     return new CheckoutViewModel
     {
         CurrentPage = currentPage,
         Payment = paymentMethodViewModel,
         UseBillingAddressForShipment = true,
         Shipments = _cart.Forms.SelectMany(x => x.Shipments).Select(shipment => new ShipmentViewModel
         {
             ShipmentId = shipment.ShipmentId,
             ShippingMethodId = shipment.ShippingMethodId
         }).ToList(),
         BillingAddress = new AddressModel
         {
             Email = "*****@*****.**"
         }
     };
 }