예제 #1
0
        public virtual async Task <CartViewModel> UpdateRecurringOrderCartShippingMethodAsync(UpdateRecurringOrderCartShippingMethodParam param)
        {
            if (!RecurringOrdersSettings.Enabled)
            {
                return(new CartViewModel());
            }

            if (param == null)
            {
                throw new ArgumentNullException(nameof(param));
            }

            var cart = await CartRepository.GetCartAsync(new GetCartParam
            {
                BaseUrl     = param.BaseUrl,
                Scope       = param.Scope,
                CultureInfo = param.CultureInfo,
                CustomerId  = param.CustomerId,
                CartName    = param.CartName
            }).ConfigureAwait(false);

            var shipment = cart.Shipments?.FirstOrDefault() ?? throw new InvalidOperationException("No shipment was found in the cart.");

            var fulfillmentMethods = await FulfillmentMethodRepository.GetCalculatedFulfillmentMethods(new GetShippingMethodsParam
            {
                CartName    = param.CartName,
                CultureInfo = param.CultureInfo,
                CustomerId  = param.CustomerId,
                Scope       = param.Scope
            });

            if (fulfillmentMethods == null)
            {
                throw new InvalidOperationException($"No fulfillmentMethods was found for the cart name ({param.CartName}).");
            }

            var fulfillmentMethod = fulfillmentMethods.SingleOrDefault(f => f.ShippingProviderId == param.ShippingProviderId.ToGuid() &&
                                                                       string.Equals(f.Name, param.ShippingMethodName, StringComparison.InvariantCultureIgnoreCase));

            shipment.FulfillmentMethod = fulfillmentMethod
                                         ?? throw new InvalidOperationException($"The fulfillmentMethod ({param.ShippingProviderId}) was not found.");

            var updatedCart = await CartRepository.UpdateCartAsync(UpdateCartParamFactory.Build(cart));

            var vm = await RecurringOrderCartsViewService.CreateCartViewModelAsync(new CreateRecurringOrderCartViewModelParam
            {
                Cart        = updatedCart,
                CultureInfo = new CultureInfo(updatedCart.CultureName),
                IncludeInvalidCouponsMessages = false,
                BaseUrl = param.BaseUrl,
            });

            return(vm);
        }
예제 #2
0
        public virtual async Task <CartViewModel> UpdateRecurringOrderCartPaymentMethodAsync(UpdatePaymentMethodParam param, string baseUrl)
        {
            if (param == null)
            {
                throw new ArgumentNullException(nameof(param));
            }
            if (string.IsNullOrWhiteSpace(param.CartName))
            {
                throw new ArgumentException(ArgumentNullMessageFormatter.FormatErrorMessage("CartName"), nameof(param));
            }
            if (string.IsNullOrWhiteSpace(param.PaymentProviderName))
            {
                throw new ArgumentException(ArgumentNullMessageFormatter.FormatErrorMessage("PaymentProviderName"), nameof(param));
            }
            if (string.IsNullOrWhiteSpace(param.Scope))
            {
                throw new ArgumentException(ArgumentNullMessageFormatter.FormatErrorMessage("Scope"), nameof(param));
            }
            if (param.CultureInfo == null)
            {
                throw new ArgumentException(ArgumentNullMessageFormatter.FormatErrorMessage("CultureInfo"), nameof(param));
            }
            if (param.CustomerId == default(Guid))
            {
                throw new ArgumentException(ArgumentNullMessageFormatter.FormatErrorMessage("CustomerId"), nameof(param));
            }
            if (param.PaymentId == default(Guid))
            {
                throw new ArgumentException(ArgumentNullMessageFormatter.FormatErrorMessage("PaymentId"), nameof(param));
            }
            if (param.PaymentMethodId == default(Guid))
            {
                throw new ArgumentException(ArgumentNullMessageFormatter.FormatErrorMessage("PaymentMethodId"), nameof(param));
            }

            var activePayment = await PaymentRepository.GetPaymentAsync(new GetPaymentParam {
                CartName    = param.CartName,
                CultureInfo = param.CultureInfo,
                CustomerId  = param.CustomerId,
                Scope       = param.Scope,
                PaymentId   = param.PaymentId
            }).ConfigureAwait(false);

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

            if (activePayment.ShouldInvokePrePaymentSwitch())
            {
                activePayment = await PreparePaymentSwitch(param, activePayment);

                param.PaymentId = activePayment.Id;
            }

            var validatePaymentMethodParam = new ValidatePaymentMethodParam()
            {
                CartName        = param.CartName,
                CultureInfo     = param.CultureInfo,
                CustomerId      = param.CustomerId,
                IsAuthenticated = param.IsAuthenticated,
                ProviderName    = param.PaymentProviderName,
                Scope           = param.Scope,
                PaymentMethodId = param.PaymentMethodId
            };

            var isPaymentMethodValid = await ValidatePaymentMethod(validatePaymentMethodParam);

            if (!isPaymentMethodValid)
            {
                throw new Exception($"Payment method for provider name /'{param.PaymentProviderName}/' not valid. Credit card has probably expired.");
            }

            Overture.ServiceModel.Orders.Cart cart = await PaymentRepository.UpdatePaymentMethodAsync(param);

            var initParam       = BuildInitializePaymentParam(cart, param);
            var paymentProvider = ObtainPaymentProvider(param.PaymentProviderName);

            cart = await paymentProvider.InitializePaymentAsync(cart, initParam);

            var vm = await RecurringOrderCartsViewService.CreateCartViewModelAsync(new CreateRecurringOrderCartViewModelParam
            {
                Cart        = cart,
                CultureInfo = param.CultureInfo,
                IncludeInvalidCouponsMessages = false,
                BaseUrl = baseUrl
            });

            return(vm);
        }