/// <summary> /// Check discount requirement /// </summary> /// <param name="request">Object that contains all information required to check the requirement (Current customer, discount, etc)</param> /// <returns>true - requirement is met; otherwise, false</returns> public bool CheckRequirement(CheckDiscountRequirementRequest request) { if (request == null) throw new ArgumentNullException("request"); if (request.DiscountRequirement == null) throw new NasException("Discount requirement is not set"); var spentAmountRequirement = _settingService.GetSettingByKey<decimal>(string.Format("DiscountRequirement.HadSpentAmount-{0}", request.DiscountRequirement.Id)); if (spentAmountRequirement == decimal.Zero) return true; if (request.Customer == null || request.Customer.IsGuest()) return false; var orders = _orderService.SearchOrders(request.Store.Id, 0, request.Customer.Id, null, null, OrderStatus.Complete, null, null, null, null, 0, int.MaxValue); decimal spentAmount = orders.Sum(o => o.OrderTotal); return spentAmount > spentAmountRequirement; }
/// <summary> /// Check discount requirement /// </summary> /// <param name="request">Object that contains all information required to check the requirement (Current customer, discount, etc)</param> /// <returns>true - requirement is met; otherwise, false</returns> public bool CheckRequirement(CheckDiscountRequirementRequest request) { if (request == null) throw new ArgumentNullException("request"); if (request.DiscountRequirement == null) throw new NasException("Discount requirement is not set"); if (request.Customer == null) return false; var restrictedToCustomerRoleId = _settingService.GetSettingByKey<int>(string.Format("DiscountRequirement.MustBeAssignedToCustomerRole-{0}", request.DiscountRequirement.Id)); if (restrictedToCustomerRoleId == 0) return false; foreach (var customerRole in request.Customer.CustomerRoles.Where(cr => cr.Active).ToList()) if (restrictedToCustomerRoleId == customerRole.Id) return true; return false; }
/// <summary> /// Check discount requirements /// </summary> /// <param name="discount">Discount</param> /// <param name="customer">Customer</param> /// <param name="couponCodeToValidate">Coupon code to validate</param> /// <returns>true - requirement is met; otherwise, false</returns> public virtual bool IsDiscountValid(Discount discount, Customer customer, string couponCodeToValidate) { if (discount == null) { throw new ArgumentNullException("discount"); } //check coupon code if (discount.RequiresCouponCode) { if (String.IsNullOrEmpty(discount.CouponCode)) { return(false); } if (!discount.CouponCode.Equals(couponCodeToValidate, StringComparison.InvariantCultureIgnoreCase)) { return(false); } } //check date range DateTime now = DateTime.UtcNow; if (discount.StartDateUtc.HasValue) { DateTime startDate = DateTime.SpecifyKind(discount.StartDateUtc.Value, DateTimeKind.Utc); if (startDate.CompareTo(now) > 0) { return(false); } } if (discount.EndDateUtc.HasValue) { DateTime endDate = DateTime.SpecifyKind(discount.EndDateUtc.Value, DateTimeKind.Utc); if (endDate.CompareTo(now) < 0) { return(false); } } if (!CheckDiscountLimitations(discount, customer)) { return(false); } //discount requirements var requirements = discount.DiscountRequirements; foreach (var req in requirements) { var requirementRule = LoadDiscountRequirementRuleBySystemName(req.DiscountRequirementRuleSystemName); if (requirementRule == null) { continue; } var request = new CheckDiscountRequirementRequest() { DiscountRequirement = req, Customer = customer, Store = _storeContext.CurrentStore }; if (!requirementRule.CheckRequirement(request)) { return(false); } } return(true); }
/// <summary> /// Check discount requirement /// </summary> /// <param name="request">Object that contains all information required to check the requirement (Current customer, discount, etc)</param> /// <returns>true - requirement is met; otherwise, false</returns> public bool CheckRequirement(CheckDiscountRequirementRequest request) { if (request == null) throw new ArgumentNullException("request"); if (request.DiscountRequirement == null) throw new NasException("Discount requirement is not set"); var restrictedProductVariantIds = _settingService.GetSettingByKey<string>(string.Format("DiscountRequirement.RestrictedProductVariantIds-{0}", request.DiscountRequirement.Id)); if (String.IsNullOrWhiteSpace(restrictedProductVariantIds)) return true; if (request.Customer == null) return false; //we support three ways of specifying product variants: //1. The comma-separated list of product variant identifiers (e.g. 77, 123, 156). //2. The comma-separated list of product variant identifiers with quantities. // {Product variant ID}:{Quantity}. For example, 77:1, 123:2, 156:3 //3. The comma-separated list of product variant identifiers with quantity range. // {Product variant ID}:{Min quantity}-{Max quantity}. For example, 77:1-3, 123:2-5, 156:3-8 var restrictedProductVariants = restrictedProductVariantIds .Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries) .Select(x => x.Trim()) .ToList(); if (restrictedProductVariants.Count == 0) return false; //group products in the cart by product variant ID //it could be the same product variant with distinct product attributes //that's why we get the total quantity of this product variant var cartQuery = from sci in request.Customer.ShoppingCartItems where sci.ShoppingCartType == ShoppingCartType.ShoppingCart && sci.StoreId == request.Store.Id group sci by sci.ProductVariantId into g select new { ProductVariantId = g.Key, TotalQuantity = g.Sum(x => x.Quantity) }; var cart = cartQuery.ToList(); bool allFound = true; foreach (var restrictedPv in restrictedProductVariants) { if (String.IsNullOrWhiteSpace(restrictedPv)) continue; bool found1 = false; foreach (var sci in cart) { if (restrictedPv.Contains(":")) { if (restrictedPv.Contains("-")) { //the third way (the quantity rage specified) //{Product variant ID}:{Min quantity}-{Max quantity}. For example, 77:1-3, 123:2-5, 156:3-8 int restrictedPvId = 0; if (!int.TryParse(restrictedPv.Split(new[] { ':' })[0], out restrictedPvId)) //parsing error; exit; return false; int quantityMin = 0; if (!int.TryParse(restrictedPv.Split(new[] { ':' })[1].Split(new[] { '-' })[0], out quantityMin)) //parsing error; exit; return false; int quantityMax = 0; if (!int.TryParse(restrictedPv.Split(new[] { ':' })[1].Split(new[] { '-' })[1], out quantityMax)) //parsing error; exit; return false; if (sci.ProductVariantId == restrictedPvId && quantityMin <= sci.TotalQuantity && sci.TotalQuantity <= quantityMax) { found1 = true; break; } } else { //the second way (the quantity specified) //{Product variant ID}:{Quantity}. For example, 77:1, 123:2, 156:3 int restrictedPvId = 0; if (!int.TryParse(restrictedPv.Split(new[] { ':' })[0], out restrictedPvId)) //parsing error; exit; return false; int quantity = 0; if (!int.TryParse(restrictedPv.Split(new[] { ':' })[1], out quantity)) //parsing error; exit; return false; if (sci.ProductVariantId == restrictedPvId && sci.TotalQuantity == quantity) { found1 = true; break; } } } else { //the first way (the quantity is not specified) int restrictedPvId = int.Parse(restrictedPv); if (sci.ProductVariantId == restrictedPvId) { found1 = true; break; } } } if (!found1) { allFound = false; break; } } if (allFound) return true; return false; }
/// <summary> /// Check discount requirement /// </summary> /// <param name="request">Object that contains all information required to check the requirement (Current customer, discount, etc)</param> /// <returns>true - requirement is met; otherwise, false</returns> public bool CheckRequirement(CheckDiscountRequirementRequest request) { return true; }
/// <summary> /// Check discount requirements /// </summary> /// <param name="discount">Discount</param> /// <param name="customer">Customer</param> /// <param name="couponCodeToValidate">Coupon code to validate</param> /// <returns>true - requirement is met; otherwise, false</returns> public virtual bool IsDiscountValid(Discount discount, Customer customer, string couponCodeToValidate) { if (discount == null) throw new ArgumentNullException("discount"); //check coupon code if (discount.RequiresCouponCode) { if (String.IsNullOrEmpty(discount.CouponCode)) return false; if (!discount.CouponCode.Equals(couponCodeToValidate, StringComparison.InvariantCultureIgnoreCase)) return false; } //check date range DateTime now = DateTime.UtcNow; if (discount.StartDateUtc.HasValue) { DateTime startDate = DateTime.SpecifyKind(discount.StartDateUtc.Value, DateTimeKind.Utc); if (startDate.CompareTo(now) > 0) return false; } if (discount.EndDateUtc.HasValue) { DateTime endDate = DateTime.SpecifyKind(discount.EndDateUtc.Value, DateTimeKind.Utc); if (endDate.CompareTo(now) < 0) return false; } if (!CheckDiscountLimitations(discount, customer)) return false; //discount requirements var requirements = discount.DiscountRequirements; foreach (var req in requirements) { var requirementRule = LoadDiscountRequirementRuleBySystemName(req.DiscountRequirementRuleSystemName); if (requirementRule == null) continue; var request = new CheckDiscountRequirementRequest() { DiscountRequirement = req, Customer = customer, Store = _storeContext.CurrentStore }; if (!requirementRule.CheckRequirement(request)) return false; } return true; }