protected virtual async Task UpdateShippingAddress(Overture.ServiceModel.Orders.Cart cart, AddressViewModel addressViewModel) { if (addressViewModel == null) { return; } var shipment = cart.Shipments.FirstOrDefault(); if (shipment == null) { return; } var newAddress = CreateAddressFromViewModel(addressViewModel); var isShippingChanged = shipment.Address == null || !IsEqual(shipment.Address, newAddress); shipment.Address = newAddress; await ShippingMethodViewService.EstimateShippingAsync(new EstimateShippingParam { Cart = cart, CultureInfo = CultureInfo.GetCultureInfo(cart.CultureName), //TODO: Fix me ForceUpdate = isShippingChanged }).ConfigureAwait(false); }
public async Task WHEN_NoFulfillmentMethod_SHOULD_choose_cheapest_shippingMethod() { //Arrange var cart = new Overture.ServiceModel.Orders.Cart { Shipments = new List <Shipment> { new Shipment() } }; var methods = (await Container.Get <IFulfillmentMethodRepository>() .GetCalculatedFulfillmentMethods(new GetShippingMethodsParam())).OrderBy(fm => fm.Cost); var sut = Container.CreateInstance <ShippingMethodViewService>(); //Act var vm = await sut.EstimateShippingAsync(new EstimateShippingParam { Cart = cart, CultureInfo = CultureInfo.InvariantCulture, ForceUpdate = GetRandom.Boolean() }); //Assert vm.Should().NotBeNull(); vm.CostDouble.Should().Be(methods.First().Cost); cart.Shipments.First().FulfillmentMethod.Should().NotBeNull(); Container.Verify((IFulfillmentMethodRepository repo) => repo.GetCalculatedFulfillmentMethods(It.IsNotNull <GetShippingMethodsParam>())); }
protected virtual async Task UpdateShippingMethod(Overture.ServiceModel.Orders.Cart cart, ShippingMethodViewModel shippingMethodViewModel) { if (string.IsNullOrEmpty(shippingMethodViewModel?.Name)) { return; } var shipment = cart.Shipments.FirstOrDefault(); if (shipment == null) { return; } if (shipment.PickUpLocationId.HasValue) { shipment.PickUpLocationId = null; shipment.Address = null; var fulfillmentLocation = await InventoryLocationProvider.GetFulfillmentLocationAsync(new GetFulfillmentLocationParam { Scope = cart.ScopeId }).ConfigureAwait(false); shipment.FulfillmentLocationId = fulfillmentLocation.Id; } shipment.FulfillmentMethod = await GetFulfillmentMethodAsync(cart, shippingMethodViewModel); }
protected virtual string GetShippingFee(Overture.ServiceModel.Orders.Cart cart, CultureInfo cultureInfo) { if (!cart.GetActiveShipments().Any()) { return(GetFreeShippingPriceLabel(cultureInfo)); } if (cart.FulfillmentCost.HasValue) { return(GetShippingPrice(cart.FulfillmentCost.Value, cultureInfo)); } var shippingMethodParam = new GetShippingMethodsParam { CartName = cart.Name, CultureInfo = cultureInfo, CustomerId = cart.CustomerId, Scope = cart.ScopeId }; //TODO: Remove the repository and pass the list of fulfillmentMethods in params var fulfillmentMethods = FulfillmentMethodRepository.GetCalculatedFulfillmentMethods(shippingMethodParam).Result; if (fulfillmentMethods == null || !fulfillmentMethods.Any()) { return(GetFreeShippingPriceLabel(cultureInfo)); } var cheapestShippingCost = fulfillmentMethods.Min(s => (decimal)s.Cost); var price = GetShippingPrice(cheapestShippingCost, cultureInfo); return(price); }
protected virtual async Task <FulfillmentMethod> GetFulfillmentMethodAsync(Overture.ServiceModel.Orders.Cart cart, ShippingMethodViewModel shippingMethodViewModel) { var param = new GetShippingMethodsParam { CartName = cart.Name, CustomerId = cart.CustomerId, CultureInfo = new CultureInfo(cart.CultureName), Scope = cart.ScopeId }; var fulfillmentMethods = await FulfillmentMethodRepository.GetCalculatedFulfillmentMethods(param); var fulfillmentMethod = fulfillmentMethods.FirstOrDefault(method => method.Name == shippingMethodViewModel.Name && method.ShippingProviderId == shippingMethodViewModel.ShippingProviderId); if (fulfillmentMethod == null) { throw new ComposerException(new ErrorViewModel { ErrorCode = "", ErrorMessage = "Unable to find any shipment provider matching the provided parameters." }); } return(fulfillmentMethod); }
protected virtual CheckoutRedirectActionViewModel GetCheckoutRedirectAction(Overture.ServiceModel.Orders.Cart cart) { var checkoutRedirectAction = new CheckoutRedirectActionViewModel(); object lastCheckoutStep; if (cart.PropertyBag != null && cart.PropertyBag.TryGetValue(CartConfiguration.CartPropertyBagLastCheckoutStep, out lastCheckoutStep)) { checkoutRedirectAction.LastCheckoutStep = (int)lastCheckoutStep; } //If there is no lineitem in the cart the checkout step is 0 (edit cart page). if (!cart.GetActiveShipments().Any() || !cart.GetActiveShipments().SelectMany(x => x.LineItems).Any()) { checkoutRedirectAction.LastCheckoutStep = 0; return(checkoutRedirectAction); } //If there is lineitem in the cart lastCheckoutStep can't be 0 but 1 (step 1). if (checkoutRedirectAction.LastCheckoutStep == 0) { checkoutRedirectAction.LastCheckoutStep = 1; } return(checkoutRedirectAction); }
/// <summary> /// Maps a single shipment. /// </summary> /// <param name="shipment">Shipment to map.</param> /// <param name="cultureInfo">Culture Info.</param> /// <param name="imageInfo">Information about images</param> /// <param name="baseUrl">The request base url</param> /// <param name="cartVm">VM in which to map the shipment to.</param> /// <param name="cart">Cart being mapped.</param> protected virtual void MapOneShipment( Shipment shipment, CultureInfo cultureInfo, ProductImageInfo imageInfo, string baseUrl, CartViewModel cartVm, Overture.ServiceModel.Orders.Cart cart) { cartVm.CurrentShipmentId = shipment.Id; cartVm.Rewards = RewardViewModelFactory.CreateViewModel(shipment.Rewards, cultureInfo, RewardLevel.FulfillmentMethod, RewardLevel.Shipment).ToList(); cartVm.OrderSummary.Taxes = TaxViewModelFactory.CreateTaxViewModels(shipment.Taxes, cultureInfo).ToList(); cartVm.ShippingAddress = GetAddressViewModel(shipment.Address, cultureInfo); cartVm.LineItemDetailViewModels = LineItemViewModelFactory.CreateViewModel(new CreateListOfLineItemDetailViewModelParam { Cart = cart, LineItems = shipment.LineItems, CultureInfo = cultureInfo, ImageInfo = imageInfo, BaseUrl = baseUrl }).ToList(); MapLineItemQuantifiers(cartVm); cartVm.OrderSummary.IsShippingEstimatedOrSelected = IsShippingEstimatedOrSelected(shipment); cartVm.ShippingMethod = GetShippingMethodViewModel(shipment.FulfillmentMethod, cultureInfo); #pragma warning disable 618 MapShipmentAdditionalFees(shipment, cartVm.OrderSummary, cultureInfo); #pragma warning restore 618 }
public static List <string> GetAllShipmentStatuses(this Overture.ServiceModel.Orders.Cart cart) { if (cart == null || cart.Shipments == null) { return(new List <string>()); } return(cart.Shipments.Select(item => item.Status).ToList()); }
protected virtual void SetCustomerType(bool isGuest, Overture.ServiceModel.Orders.Cart cart) { if (cart.Customer == null) { cart.Customer = new CustomerSummary(); } cart.Customer.Type = isGuest ? CustomerType.Guest : CustomerType.Registered; }
private static void SetCustomerType(bool isGuest, Overture.ServiceModel.Orders.Cart cart) { if (cart.Customer == null || !isGuest) { cart.Customer = new CustomerSummary(); } cart.Customer.Type = isGuest ? CustomerType.Guest : CustomerType.Registered; }
/// <summary> /// Gets the active shipments. /// </summary> /// <param name="cart">The cart.</param> /// <returns>All shipment that are not Canceled.</returns> public static IEnumerable <Shipment> GetActiveShipments(this Overture.ServiceModel.Orders.Cart cart) { if (cart == null || cart.Shipments == null) { return(Enumerable.Empty <Shipment>()); } return(cart.Shipments.Where(s => s != null && s.IsActive())); }
protected virtual async Task UpdateRegisteredBillingAddress(Overture.ServiceModel.Orders.Cart cart, RegisteredBillingAddressViewModel registeredBillingAddressViewModel) { if (registeredBillingAddressViewModel == null) { return; } var payment = cart.Payments.FirstOrDefault(); if (payment == null) { return; } if (registeredBillingAddressViewModel.UseShippingAddress) { var shipment = cart.Shipments.FirstOrDefault(); if (shipment?.Address == null) { return; } var isBillingChanged = payment.BillingAddress == null || !IsEqual(payment.BillingAddress, shipment.Address); if (isBillingChanged) { payment.BillingAddress = shipment.Address.Clone(); payment.BillingAddress.Id = Guid.Empty; } } else { if (registeredBillingAddressViewModel.BillingAddressId == Guid.Empty) { return; } var newAddress = await AddressRepository.GetAddressByIdAsync(registeredBillingAddressViewModel.BillingAddressId).ConfigureAwait(false); if (newAddress == null) { return; } var isBillingChanged = payment.BillingAddress == null || !IsEqual(payment.BillingAddress, newAddress); if (isBillingChanged) { payment.BillingAddress = newAddress; payment.BillingAddress.PropertyBag[AddressBookIdPropertyBagKey] = newAddress.Id; payment.BillingAddress.Id = Guid.Empty; } } }
/// <summary> /// Initializes the payment based on the PaymentProvider logic. /// </summary> /// <param name="cart">Cart.</param> /// <param name="param">Parameters used to make the request.</param> /// <returns></returns> public Task <Overture.ServiceModel.Orders.Cart> InitializePaymentAsync(Overture.ServiceModel.Orders.Cart cart, InitializePaymentParam param) { if (!string.IsNullOrWhiteSpace(param.PaymentType) && Enum.TryParse(param.PaymentType, out PaymentMethodType paymentMethodType)) { if (paymentMethodType == PaymentMethodType.SavedCreditCard) { return(Task.FromResult(cart)); } } return(PaymentRepository.InitializePaymentAsync(param)); }
protected virtual Shipment GetShipment(Overture.ServiceModel.Orders.Cart cart) { var shipment = cart.Shipments.FirstOrDefault(); if (shipment == null) { throw new InvalidDataException("No shipment was found in Cart."); } return(shipment); }
protected virtual Payment GetPayment(Overture.ServiceModel.Orders.Cart cart) { var payments = cart.Payments; if (payments == null || payments.All(payment => payment.IsVoided())) { throw new InvalidOperationException("No valid payment was found in the cart."); } return(payments.First(payment => !payment.IsVoided())); }
/// <summary> /// Setting free price for a gift item, avoiding reward info /// </summary> /// <param name="cart"></param> public static void PrepareGiftLineItems(Overture.ServiceModel.Orders.Cart cart) { if (cart?.Shipments == null || cart.Shipments.Count == 0) { return; } foreach (Shipment shipment in cart.Shipments) { if (shipment?.LineItems == null || shipment.LineItems.Count == 0) { continue; } foreach (LineItem lineitem in shipment.LineItems) { if (lineitem == null || !lineitem.IsGiftItem) { continue; } if (lineitem.DiscountAmount != null) { if (cart.DiscountTotal != null) { cart.DiscountTotal -= lineitem.DiscountAmount; } cart.LineItemLevelDiscount -= (decimal)lineitem.DiscountAmount; cart.SubTotalDiscount -= (decimal)lineitem.DiscountAmount; } #pragma warning disable CS0618 // Type or member is obsolete lineitem.ListPrice = lineitem.DefaultListPrice = lineitem.CurrentPrice = lineitem.RegularPrice = lineitem.DefaultPrice = lineitem.DiscountAmount = lineitem.Total = lineitem.TotalWithoutDiscount = 0; #pragma warning restore CS0618 // Type or member is obsolete if (lineitem?.Rewards == null || lineitem.Rewards.Count == 0) { continue; } foreach (Reward lineitemReward in lineitem.Rewards) { Reward shipmentReward = shipment.Rewards.Find(x => x.Id == lineitemReward.Id); shipment.Rewards.Remove(shipmentReward); } lineitem.Rewards = new List <Reward>(); } } }
/// <summary> /// Builds an instance of <see cref="InitializePaymentParam"/> that will be used to make the request to the repository. /// </summary> /// <param name="cart">Cart previously retrieved from the UpdatePaymentMethodAsync call.</param> /// <param name="updatePaymentMethodParam">Parameters passed to the UpdatePaymentMethodAsync method.</param> /// <returns>Instance of the <see cref="InitializePaymentParam"/> that will be used to make the call.</returns> /// <remarks>It may be useful to override this method to augment the request with AdditionalData or Options for the request.</remarks> protected virtual InitializePaymentParam BuildInitializePaymentParam(Overture.ServiceModel.Orders.Cart cart, UpdatePaymentMethodParam updatePaymentMethodParam) { var param = new InitializePaymentParam { CartName = updatePaymentMethodParam.CartName, CultureInfo = updatePaymentMethodParam.CultureInfo, CustomerId = updatePaymentMethodParam.CustomerId, PaymentId = updatePaymentMethodParam.PaymentId, Scope = updatePaymentMethodParam.Scope, PaymentType = updatePaymentMethodParam.PaymentType }; return(param); }
private Task UpdateCustomerWithCustomFieldInBag(Overture.ServiceModel.Orders.Cart cart, CustomerSummaryViewModel value) { if (value == null) { return(Task.FromResult(0)); } if (cart.Customer == null) { cart.Customer = new CustomerSummary(); } cart.Customer.Email = value.Email + "-" + value.Bag["CustomField"]; return(Task.FromResult(0)); }
private Task UpdateCustomerCustom(Overture.ServiceModel.Orders.Cart cart, CustomerSummaryViewModel value) { if (value == null) { return(Task.FromResult(0)); } if (cart.Customer == null) { cart.Customer = new CustomerSummary(); } cart.Customer.Email = value.Email; return(Task.FromResult(0)); }
protected virtual void UpdateStepInfo(Overture.ServiceModel.Orders.Cart cart, int lastCompletedCheckoutStep) { if (cart.PropertyBag == null) { cart.PropertyBag = new PropertyBag(); } if (cart.PropertyBag.ContainsKey(CartConfiguration.CartPropertyBagLastCheckoutStep)) { cart.PropertyBag[CartConfiguration.CartPropertyBagLastCheckoutStep] = lastCompletedCheckoutStep; } else { cart.PropertyBag.Add(CartConfiguration.CartPropertyBagLastCheckoutStep, lastCompletedCheckoutStep); } }
public static bool IsCartContainsRecurringOrderItems(Overture.ServiceModel.Orders.Cart cart) { if (cart?.Shipments != null) { foreach (var shipment in cart.Shipments) { foreach (var lineitem in shipment.LineItems ?? Enumerable.Empty <LineItem>()) { if (IsRecurringOrderLineItemValid(lineitem)) { return(true); } } } } return(false); }
protected virtual async Task UpdatePickUpAddress(Overture.ServiceModel.Orders.Cart cart, PickUpAddressViewModel pickUpAddressViewModel) { if (pickUpAddressViewModel == null || pickUpAddressViewModel.PickUpLocationId == Guid.Empty) { return; } var shipment = cart.Shipments.FirstOrDefault(); if (shipment == null) { return; } shipment.PickUpLocationId = pickUpAddressViewModel.PickUpLocationId; shipment.FulfillmentLocationId = pickUpAddressViewModel.PickUpLocationId; var store = await StoreRepository.GetStoreAsync(new Store.Parameters.GetStoreParam { Id = pickUpAddressViewModel.PickUpLocationId, CultureInfo = new CultureInfo(cart.CultureName), Scope = cart.ScopeId }).ConfigureAwait(false); var storeAddress = store.FulfillmentLocation.Addresses.FirstOrDefault(); var address = new Address { AddressName = store.Name, City = storeAddress.City, CountryCode = storeAddress.CountryCode, FirstName = cart.Customer.FirstName, LastName = cart.Customer.LastName, Line1 = storeAddress.Line1, Line2 = storeAddress.Line2, PhoneNumber = storeAddress.PhoneNumber, PostalCode = storeAddress.PostalCode, RegionCode = storeAddress.RegionCode, PropertyBag = storeAddress.PropertyBag }; shipment.Address = address; }
public static UpdateCartParam Build(Overture.ServiceModel.Orders.Cart cart) { return(new UpdateCartParam { CultureInfo = cart.CultureName != null ? new CultureInfo(cart.CultureName) : null, CustomerId = cart.CustomerId, Scope = cart.ScopeId, CartName = cart.Name, BillingCurrency = cart.BillingCurrency, CartType = cart.CartType, Coupons = cart.Coupons, Customer = cart.Customer, OrderLocation = cart.OrderLocation, PropertyBag = cart.PropertyBag, Shipments = cart.Shipments, Status = cart.Status, Payments = cart.Payments }); }
protected virtual Task UpdateCustomer(Overture.ServiceModel.Orders.Cart cart, CustomerSummaryViewModel customerSummaryViewModel) { if (customerSummaryViewModel == null) { return(Task.FromResult(0)); } if (cart.Customer == null) { cart.Customer = new CustomerSummary(); } cart.Customer.LastName = null; cart.Customer.FirstName = null; cart.Customer.MiddleName = null; cart.Customer.Phone = null; cart.Customer.Email = customerSummaryViewModel.Email; return(Task.FromResult(0)); }
protected virtual async Task UpdateShippingMethod(Overture.ServiceModel.Orders.Cart cart, ShippingMethodViewModel shippingMethodViewModel) { if (shippingMethodViewModel == null) { return; } if (string.IsNullOrEmpty(shippingMethodViewModel.Name)) { return; } var shipment = cart.Shipments.FirstOrDefault(); if (shipment == null) { return; } shipment.FulfillmentMethod = await GetFulfillmentMethodAsync(cart, shippingMethodViewModel); }
protected virtual Task UpdateBillingAddress(Overture.ServiceModel.Orders.Cart cart, BillingAddressViewModel billingAddressViewModel) { if (billingAddressViewModel == null) { return(Task.FromResult(0)); } var payment = GetPayment(cart); if (payment == null) { return(Task.FromResult(0)); } if (billingAddressViewModel.UseShippingAddress) { var shipment = cart.Shipments.FirstOrDefault(); if (shipment?.Address == null) { return(Task.FromResult(0)); } payment.BillingAddress = shipment.Address.Clone(); } else { payment.BillingAddress = CreateAddressFromViewModel(billingAddressViewModel); } if (cart.Customer.Type == CustomerType.Guest) { cart.Customer.FirstName = payment.BillingAddress.FirstName; cart.Customer.LastName = payment.BillingAddress.LastName; cart.Customer.Phone = payment.BillingAddress.PhoneNumber; } return(Task.FromResult(0)); }
public async Task WHEN_ForcingUpdate_SHOULD_choose_cheapest_shippingMethod() { //Arrange var cart = new Overture.ServiceModel.Orders.Cart { Shipments = new List <Shipment> { new Shipment { FulfillmentMethod = new FulfillmentMethod { Id = GetRandom.Guid(), Cost = GetRandom.Double(10.0, 35.0), DisplayName = new LocalizedString() } } } }; var methods = (await Container.Get <IFulfillmentMethodRepository>() .GetCalculatedFulfillmentMethods(new GetShippingMethodsParam())).OrderBy(fm => fm.Cost); var sut = Container.CreateInstance <ShippingMethodViewService>(); //Act var vm = await sut.EstimateShippingAsync(new EstimateShippingParam { Cart = cart, CultureInfo = CultureInfo.InvariantCulture, ForceUpdate = true }); //Assert vm.Should().NotBeNull(); vm.CostDouble.Should().Be(methods.First().Cost); cart.Shipments.First().FulfillmentMethod.Should().NotBeNull(); }
protected virtual async Task UpdateRegisteredShippingAddress(Overture.ServiceModel.Orders.Cart cart, RegisteredShippingAddressViewModel registeredShippingAddressViewModel) { if (registeredShippingAddressViewModel == null) { return; } if (registeredShippingAddressViewModel.ShippingAddressId == Guid.Empty) { return; } var shipment = cart.Shipments.FirstOrDefault(); if (shipment == null) { return; } var newAddress = await AddressRepository.GetAddressByIdAsync(registeredShippingAddressViewModel.ShippingAddressId).ConfigureAwait(false); var isShippingChanged = shipment.Address == null || !IsEqual(shipment.Address, newAddress); if (isShippingChanged) { shipment.Address = newAddress; shipment.Address.PropertyBag[AddressBookIdPropertyBagKey] = newAddress.Id; shipment.Address.Id = Guid.Empty; } //In the case the user didn't do estimate shipping before await ShippingMethodViewService.EstimateShippingAsync(new EstimateShippingParam { Cart = cart, CultureInfo = CultureInfo.GetCultureInfo(cart.CultureName), //TODO: Fix me ForceUpdate = isShippingChanged }).ConfigureAwait(false); }
/// <summary> /// Gets an OrderSummaryViewModel from a Cart. /// </summary> /// <param name="cart"></param> /// <param name="cultureInfo"></param> /// <returns></returns> public virtual OrderSummaryViewModel GetOrderSummaryViewModel( Overture.ServiceModel.Orders.Cart cart, CultureInfo cultureInfo) { var orderSummary = ViewModelMapper.MapTo <OrderSummaryViewModel>(cart, cultureInfo); orderSummary.Shippings = GetShippingsViewModel(cart, cultureInfo); orderSummary.Shipping = GetShippingFee(cart, cultureInfo); orderSummary.IsShippingTaxable = cart.GetActiveShipments().FirstOrDefault().IsShippingTaxable(); //used in the cart/checkout orderSummary.HasReward = cart.DiscountTotal.HasValue && cart.DiscountTotal.Value > 0; orderSummary.CheckoutRedirectAction = GetCheckoutRedirectAction(cart); orderSummary.Rewards = RewardViewModelFactory.CreateViewModel(cart.GetActiveShipments().SelectMany(x => x.Rewards), cultureInfo, RewardLevel.FulfillmentMethod, RewardLevel.Shipment).ToList(); var allLineItems = cart.GetActiveShipments().SelectMany(x => x.LineItems).ToList(); decimal sumAllLineItemsSavings = Math.Abs(allLineItems.Sum( l => decimal.Multiply(decimal.Subtract(l.CurrentPrice.GetValueOrDefault(0), l.DefaultPrice.GetValueOrDefault(0)), Convert.ToDecimal(l.Quantity)))); decimal savingsTotal = decimal.Add(cart.DiscountTotal.GetValueOrDefault(0), sumAllLineItemsSavings); orderSummary.SavingsTotal = savingsTotal.Equals(0) ? string.Empty : LocalizationProvider.FormatPrice(savingsTotal, cultureInfo); return(orderSummary); }
public async Task WHEN_not_forcing_SHOULD_keep_fulfillmentMethod() { //Arrange var fulfillmentMethod = new FulfillmentMethod { Id = GetRandom.Guid(), Cost = GetRandom.Double(10.0, 35.0), DisplayName = new LocalizedString(), Name = GetRandom.String(12) }; var cart = new Overture.ServiceModel.Orders.Cart { Shipments = new List <Shipment> { new Shipment { FulfillmentMethod = fulfillmentMethod } } }; var sut = Container.CreateInstance <ShippingMethodViewService>(); //Act var vm = await sut.EstimateShippingAsync(new EstimateShippingParam { Cart = cart, CultureInfo = CultureInfo.InvariantCulture, ForceUpdate = false }); //Assert vm.Should().NotBeNull(); cart.Shipments.First().FulfillmentMethod.Should().NotBeNull(); cart.Shipments.First().FulfillmentMethod.Id.Should().Be(fulfillmentMethod.Id); }