コード例 #1
0
        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));
        }
コード例 #2
0
 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())));
 }
コード例 #3
0
 protected HashSet <CartItemData> GetItems(T application, CheckLimitationsResult checkLimitationsResult, CartModel cart)
 {
     if (application.CartItemsFromLimitations)
     {
         return(checkLimitationsResult.CartItems);
     }
     return(_getCartItemBasedApplicationProducts.Get(application, cart));
 }
コード例 #4
0
        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(""));
        }
コード例 #5
0
 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)));
 }
コード例 #6
0
        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")));
        }
コード例 #7
0
        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>()));
        }
コード例 #8
0
        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")));
        }
コード例 #9
0
 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")));
 }
コード例 #10
0
        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")));
        }
コード例 #11
0
        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>()));
        }
コード例 #12
0
        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>()));
        }
コード例 #13
0
        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))
            });
        }
コード例 #14
0
 public override DiscountApplicationInfo Apply(FreeShipping application, CartModel cart, CheckLimitationsResult checkLimitationsResult)
 {
     return(new DiscountApplicationInfo
     {
         ShippingDiscount = cart.ShippingTotalPreDiscount
     });
 }
コード例 #15
0
        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)
            });
        }
コード例 #16
0
 public abstract DiscountApplicationInfo Apply(DiscountApplication application, CartModel cart, CheckLimitationsResult checkLimitationsResult);
コード例 #17
0
 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))
     };
 }
コード例 #18
0
 public override DiscountApplicationInfo Apply(OrderTotalFixedAmount application, CartModel cart, CheckLimitationsResult checkLimitationsResult)
 {
     return(new DiscountApplicationInfo
     {
         OrderTotalDiscount = application.DiscountAmount
     });
 }
コード例 #19
0
 public override DiscountApplicationInfo Apply(XPercentFromOrder application, CartModel cart, CheckLimitationsResult checkLimitationsResult)
 {
     return(new DiscountApplicationInfo
     {
         OrderTotalDiscount =
             Math.Round(cart.TotalPreDiscount * (application.DiscountPercent / 100m), 2,
                        MidpointRounding.AwayFromZero)
     });
 }