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)); }
/// <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); }