public CheckLimitationsResult CheckLimitations(Discount discount, CartModel cart) { var limitations = _session.QueryOver <DiscountLimitation>() .Where(limitation => limitation.Discount.Id == discount.Id) .Cacheable() .List(); var results = new CheckLimitationsResult[limitations.Count]; for (var i = 0; i < limitations.Count; i++) { var limitation = limitations[i]; var fullName = limitation.GetType().FullName; if (LimitationCheckerTypes.ContainsKey(fullName)) { var checker = _kernel.Get(LimitationCheckerTypes[fullName]) as DiscountLimitationChecker; if (checker != null) { results[i] = checker.CheckLimitations(limitation, cart); continue; } } results[i] = CheckLimitationsResult.CurrentlyInvalid("Limitation cannot be checked"); } return(CheckLimitationsResult.Combine(results)); }
public override CheckLimitationsResult CheckLimitations(CartTotalGreaterThanX limitation, CartModel cart) { return(cart.TotalPreDiscount > limitation.CartTotalGreaterThanValue ? CheckLimitationsResult.Successful(Enumerable.Empty <CartItem>()) : CheckLimitationsResult.CurrentlyInvalid( _stringResourceProvider.GetValue("Order total does not reach the threshold of " + limitation.CartTotalGreaterThanValue.ToCurrencyFormat()))); }
protected HashSet <CartItemData> GetItems(T application, CheckLimitationsResult checkLimitationsResult, CartModel cart) { if (application.CartItemsFromLimitations) { return(checkLimitationsResult.CartItems); } return(_getCartItemBasedApplicationProducts.Get(application, cart)); }
public override CheckLimitationsResult CheckLimitations(ItemBrandIsNot limitation, CartModel cart, IList <Discount> allDiscounts) { var cartItems = _getCartItemsBySKUList.GetNonExcudedBrandCartItems(cart, limitation.Brands); return(cartItems.Any() ? CheckLimitationsResult.Successful(cartItems) : CheckLimitationsResult.NeverValid("")); }
public override CheckLimitationsResult CheckLimitations(CartHasAtLeastXItems limitation, CartModel cart) { return(cart.ItemQuantity >= limitation.NumberOfItems ? CheckLimitationsResult.Successful(Enumerable.Empty <CartItem>()) : CheckLimitationsResult.CurrentlyInvalid( string.Format( _stringResourceProvider.GetValue("You need at least {0} items to apply this discount"), limitation.NumberOfItems))); }
public override CheckLimitationsResult CheckLimitations(ItemIsInCategory limitation, CartModel cart, IList <Discount> allDiscounts) { var categoryIds = limitation.CategoryIds; var cartItems = _getCartItemsByCategoryIdList.GetCartItems(cart, categoryIds); return(cartItems.Any() ? CheckLimitationsResult.Successful(cartItems) : CheckLimitationsResult.CurrentlyInvalid(_stringResourceProvider.GetValue("You don't have the required item(s) in your cart for this discount"))); }
public override CheckLimitationsResult CheckLimitations(SingleUsage limitation, CartModel cart) { var discountId = limitation.Discount.Id; var anyUsages = _session.QueryOver <DiscountUsage>().Where(usage => usage.Discount.Id == discountId).Cacheable().Any(); return(anyUsages ? CheckLimitationsResult.NeverValid(_stringResourceProvider.GetValue("This discount has already been used.")) : CheckLimitationsResult.Successful(Enumerable.Empty <CartItem>())); }
public override CheckLimitationsResult CheckLimitations(ItemHasSKU limitation, CartModel cart) { var cartItems = _getCartItemsBySKUList.GetCartItems(cart, limitation.SKUs); return(cartItems.Any() ? CheckLimitationsResult.Successful(cartItems) : CheckLimitationsResult.CurrentlyInvalid( _stringResourceProvider.GetValue( "You don't have the required item(s) in your cart for this discount"))); }
public override CheckLimitationsResult CheckLimitations(ShippingCountryIs limitation, CartModel cart) { if (cart.ShippingAddress == null) { return (CheckLimitationsResult.CurrentlyInvalid(_stringResourceProvider.GetValue("Shipping address is not yet set"))); } return(cart.ShippingAddress.CountryCode == limitation.ShippingCountryCode ? CheckLimitationsResult.Successful(Enumerable.Empty <CartItem>()) : CheckLimitationsResult.CurrentlyInvalid( _stringResourceProvider.GetValue("Shipping country is not valid for this discount"))); }
public override CheckLimitationsResult CheckLimitations(ShippingPostcodeStartsWith limitation, CartModel cart) { if (cart.ShippingAddress == null) { return (CheckLimitationsResult.CurrentlyInvalid(_stringResourceProvider.GetValue("Shipping address is not yet set"))); } var postcodes = (limitation.ShippingPostcode ?? string.Empty).Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries) .Select(s => s.Trim().ToUpper()) .ToHashSet(); var postcode = cart.ShippingAddress.FormattedPostcode(); return(postcodes.Any(postcode.StartsWith) ? CheckLimitationsResult.Successful(Enumerable.Empty <CartItem>()) : CheckLimitationsResult.CurrentlyInvalid( _stringResourceProvider.GetValue("Shipping postcode is not valid for this discount"))); }
public override CheckLimitationsResult CheckLimitations(OnlyByItself limitation, CartModel cart, IList <Discount> allDiscounts) { var discount = limitation.Discount; if (discount == null) { return(CheckLimitationsResult.NeverValid( _stringResourceProvider.GetValue("This limitation has no discount."))); } if (allDiscounts.Any(x => x != discount)) { return(CheckLimitationsResult.CurrentlyInvalid( _stringResourceProvider.GetValue("This discount cannot be combined."))); } return(CheckLimitationsResult.Successful(Enumerable.Empty <CartItemData>())); }
public override CheckLimitationsResult CheckLimitations(SingleUsagePerCustomer limitation, CartModel cart) { var user = _getCurrentUser.Get(); if (user == null) { return(CheckLimitationsResult.NeverValid(_stringResourceProvider.GetValue("This discount requires an account."))); } var discountId = limitation.Discount.Id; var anyUsages = _session.Query <DiscountUsage>() .Where(usage => usage.Discount.Id == discountId && usage.Order.User.Id == user.Id) .Cacheable() .Any(); return(anyUsages ? CheckLimitationsResult.NeverValid(_stringResourceProvider.GetValue("This discount has already been used.")) : CheckLimitationsResult.Successful(Enumerable.Empty <CartItem>())); }
public override DiscountApplicationInfo Apply(BuyXGetYFree application, CartModel cart, CheckLimitationsResult checkLimitationsResult) { IEnumerable <CartItem> cartItems = GetItems(application, checkLimitationsResult, cart); var prices = new List <ItemPrice>(); foreach (CartItem cartItem in cartItems) { for (int i = 0; i < cartItem.Quantity; i++) { prices.Add(new ItemPrice { Id = cartItem.Id, UnitPrice = cartItem.UnitPrice }); } } var numberFree = (prices.Count / (application.BuyAmount + application.FreeAmount)) * application.FreeAmount; var itemPrices = prices.OrderBy(x => x.UnitPrice).Take(numberFree); return(new DiscountApplicationInfo { ItemDiscounts = itemPrices.GroupBy(x => x.Id).ToDictionary(cartItem => cartItem.Key, item => item.Sum(x => x.UnitPrice)) }); }
public override DiscountApplicationInfo Apply(FreeShipping application, CartModel cart, CheckLimitationsResult checkLimitationsResult) { return(new DiscountApplicationInfo { ShippingDiscount = cart.ShippingTotalPreDiscount }); }
public override DiscountApplicationInfo Apply(XPercentFromItems application, CartModel cart, CheckLimitationsResult checkLimitationsResult) { var cartItems = GetItems(application, checkLimitationsResult, cart); return(new DiscountApplicationInfo { ItemPercentages = cartItems.ToDictionary(cartItem => cartItem.Id, item => application.DiscountPercent) }); }
public abstract DiscountApplicationInfo Apply(DiscountApplication application, CartModel cart, CheckLimitationsResult checkLimitationsResult);
public override DiscountApplicationInfo Apply(XPercentFromItems application, CartModel cart, CheckLimitationsResult checkLimitationsResult) { var cartItems = GetItems(application, checkLimitationsResult, cart); return new DiscountApplicationInfo { ItemDiscounts = cartItems.ToDictionary(cartItem => cartItem.Id, item => item.PricePreDiscount*(application.DiscountPercent/100m)) }; }
public override DiscountApplicationInfo Apply(OrderTotalFixedAmount application, CartModel cart, CheckLimitationsResult checkLimitationsResult) { return(new DiscountApplicationInfo { OrderTotalDiscount = application.DiscountAmount }); }
public override DiscountApplicationInfo Apply(XPercentFromOrder application, CartModel cart, CheckLimitationsResult checkLimitationsResult) { return(new DiscountApplicationInfo { OrderTotalDiscount = Math.Round(cart.TotalPreDiscount * (application.DiscountPercent / 100m), 2, MidpointRounding.AwayFromZero) }); }