예제 #1
0
        public Task <DiscountValidationResult> ValidateAsync(string promoCode)
        {
            var discount = _discounts.FirstOrDefault(disc => disc.PromoCode == promoCode);
            var isValid  = discount != null;

            var result = new DiscountValidationResult
            {
                Discount     = discount,
                IsValid      = isValid,
                ErrorMessage = isValid ? string.Empty : "Invalid promo code supplied"
            };

            return(Task.FromResult(result));
        }
예제 #2
0
        /// <summary>
        /// Validate discount
        /// </summary>
        /// <param name="discount">Discount</param>
        /// <param name="customer">Customer</param>
        /// <param name="currency">Currency</param>
        /// <param name="couponCodesToValidate">Coupon codes</param>
        /// <returns>Discount validation result</returns>
        public virtual async Task <DiscountValidationResult> ValidateDiscount(Discount discount, Customer customer, Currency currency, string[] couponCodesToValidate)
        {
            if (discount == null)
            {
                throw new ArgumentNullException(nameof(discount));
            }

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

            var result = new DiscountValidationResult();

            //is enabled and use the same currency
            if (!discount.IsEnabled || discount.CurrencyCode != currency.CurrencyCode)
            {
                return(result);
            }

            //do not allow use discount in the current store
            if (discount.LimitedToStores && !discount.Stores.Any(x => _workContext.CurrentStore.Id == x))
            {
                result.UserError = _translationService.GetResource("ShoppingCart.Discount.CannotBeUsedInStore");
                return(result);
            }

            //check coupon code
            if (discount.RequiresCouponCode)
            {
                if (couponCodesToValidate == null || !couponCodesToValidate.Any())
                {
                    return(result);
                }
                var exists = false;
                foreach (var item in couponCodesToValidate)
                {
                    if (discount.Reused)
                    {
                        if (await ExistsCodeInDiscount(item, discount.Id, null))
                        {
                            result.CouponCode = item;
                            exists            = true;
                        }
                    }
                    else
                    {
                        if (await ExistsCodeInDiscount(item, discount.Id, false))
                        {
                            result.CouponCode = item;
                            exists            = true;
                        }
                    }
                }
                if (!exists)
                {
                    return(result);
                }
            }

            if (discount.DiscountTypeId == DiscountType.AssignedToOrderSubTotal ||
                discount.DiscountTypeId == DiscountType.AssignedToOrderTotal)
            {
                var cart = customer.ShoppingCartItems
                           .Where(sci => sci.ShoppingCartTypeId == ShoppingCartType.ShoppingCart)
                           .ToList();

                var hasGiftVouchers = cart.Any(x => x.IsGiftVoucher);
                if (hasGiftVouchers)
                {
                    result.UserError = _translationService.GetResource("ShoppingCart.Discount.CannotBeUsedWithGiftVouchers");
                    return(result);
                }
            }
            //time range check
            DateTime now = DateTime.UtcNow;

            if (discount.StartDateUtc.HasValue)
            {
                DateTime startDate = DateTime.SpecifyKind(discount.StartDateUtc.Value, DateTimeKind.Utc);
                if (startDate.CompareTo(now) > 0)
                {
                    result.UserError = _translationService.GetResource("ShoppingCart.Discount.NotStartedYet");
                    return(result);
                }
            }
            if (discount.EndDateUtc.HasValue)
            {
                DateTime endDate = DateTime.SpecifyKind(discount.EndDateUtc.Value, DateTimeKind.Utc);
                if (endDate.CompareTo(now) < 0)
                {
                    result.UserError = _translationService.GetResource("ShoppingCart.Discount.Expired");
                    return(result);
                }
            }

            //discount limitation - n times and n times per user
            switch (discount.DiscountLimitationId)
            {
            case DiscountLimitationType.NTimes:
            {
                var usedTimes = await GetAllDiscountUsageHistory(discount.Id, null, null, false, 0, 1);

                if (usedTimes.TotalCount >= discount.LimitationTimes)
                {
                    return(result);
                }
            }
            break;

            case DiscountLimitationType.NTimesPerUser:
            {
                var usedTimes = await GetAllDiscountUsageHistory(discount.Id, customer.Id, null, false, 0, 1);

                if (usedTimes.TotalCount >= discount.LimitationTimes)
                {
                    result.UserError = _translationService.GetResource("ShoppingCart.Discount.CannotBeUsedAnymore");
                    return(result);
                }
            }
            break;

            case DiscountLimitationType.Nolimits:
            default:
                break;
            }

            //discount requirements
            var requirements = discount.DiscountRules.ToList();

            foreach (var req in requirements)
            {
                //load a plugin
                var discountRequirementPlugin = LoadDiscountProviderBySystemName(req.DiscountRequirementRuleSystemName);

                if (discountRequirementPlugin == null)
                {
                    continue;
                }

                if (!discountRequirementPlugin.IsAuthenticateStore(_workContext.CurrentStore))
                {
                    continue;
                }

                var ruleRequest = new DiscountRuleValidationRequest
                {
                    DiscountRequirementId = req.Id,
                    DiscountId            = req.DiscountId,
                    Customer = customer,
                    Store    = _workContext.CurrentStore
                };

                var singleRequirementRule = discountRequirementPlugin.GetRequirementRules().Single(x => x.SystemName == req.DiscountRequirementRuleSystemName);
                var ruleResult            = await singleRequirementRule.CheckRequirement(ruleRequest);

                if (!ruleResult.IsValid)
                {
                    result.UserError = ruleResult.UserError;
                    return(result);
                }
            }

            result.IsValid = true;
            return(result);
        }