Exemple #1
0
        /// <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 NopException("Discount requirement is not set");
            }

            if (request.DiscountRequirement.SpentAmount == decimal.Zero)
            {
                return(true);
            }

            if (request.Customer == null || request.Customer.IsGuest())
            {
                return(false);
            }

            var     orders      = request.Customer.Orders.Where(o => !o.Deleted && o.OrderStatus == OrderStatus.Complete);
            decimal spentAmount = orders.Sum(o => o.OrderTotal);

            return(spentAmount > request.DiscountRequirement.SpentAmount);
        }
        public override bool CheckRequirement(CheckDiscountRequirementRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException("request");
            }

            if (request.DiscountRequirement == null)
            {
                throw new SmartException("Discount requirement is not set");
            }

            if (request.Customer == null)
            {
                return(false);
            }

            if (request.Customer.BillingAddress == null)
            {
                return(false);
            }

            if (request.DiscountRequirement.BillingCountryId == 0)
            {
                return(false);
            }

            bool result = request.Customer.BillingAddress.CountryId == request.DiscountRequirement.BillingCountryId;

            return(result);
        }
        /// <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 NopException("Discount requirement is not set");
            }

            if (request.Customer == null)
            {
                return(false);
            }

            if (!request.DiscountRequirement.RestrictedToCustomerRoleId.HasValue)
            {
                return(false);
            }

            foreach (var customerRole in request.Customer.CustomerRoles.Where(cr => cr.Active).ToList())
            {
                if (request.DiscountRequirement.RestrictedToCustomerRoleId == customerRole.Id)
                {
                    return(true);
                }
            }

            return(false);
        }
Exemple #4
0
        private bool CheckTotalHistoryRequirement(CheckDiscountRequirementRequest request)
        {
            if (request.Customer.IsGuest())
            {
                return(false);
            }

            var orders = _orderService.SearchOrders(
                request.Store.Id,
                request.Customer.Id,
                null,
                null,
                new int[] { (int)OrderStatus.Complete },
                null,
                null,
                null,
                null,
                null,
                0,
                int.MaxValue);

            decimal spentAmount = orders.Sum(o => o.OrderTotal);

            return(spentAmount >= request.DiscountRequirement.SpentAmount);
        }
Exemple #5
0
        public override bool CheckRequirement(CheckDiscountRequirementRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException("request");
            }

            if (request.DiscountRequirement == null)
            {
                throw new SmartException("Discount requirement is not set");
            }

            if (request.DiscountRequirement.SpentAmount == decimal.Zero)
            {
                return(true);
            }

            if (request.Customer == null)
            {
                return(false);
            }

            var settings = DeserializeSettings(request.DiscountRequirement.ExtraData);

            if (settings.LimitToCurrentBasketSubTotal)
            {
                return(CheckCurrentSubTotalRequirement(request));
            }
            else
            {
                return(CheckTotalHistoryRequirement(request));
            }
        }
        /// <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 SmartException("Discount requirement is not set");
            }

            if (request.Customer == null)
            {
                return(false);
            }

            var storeId = request.DiscountRequirement.RestrictedToStoreId ?? 0;

            if (storeId == 0)
            {
                return(false);
            }

            bool result = request.Store.Id == storeId;

            return(result);
        }
Exemple #7
0
        /// <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 NopException("Discount requirement is not set");

            if (String.IsNullOrWhiteSpace(request.DiscountRequirement.RestrictedProductVariantIds))
                return true;

            if (request.Customer == null)
                return false;

            var restrictedProductVariantIds = new List<int>();
            try
            {
                restrictedProductVariantIds = request.DiscountRequirement.RestrictedProductVariantIds
                    .Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                    .Select(x => Convert.ToInt32(x))
                    .ToList();
            }
            catch
            {
                //error parsing
                return false;
            }
            if (restrictedProductVariantIds.Count == 0)
                return false;

            //purchased products
            var purchasedProductVariants = _orderService.GetAllOrderProductVariants(0,
                request.Customer.Id, null, null, OrderStatus.Complete, null, null);
            
            bool allFound = true;
            foreach (var restrictedPvId in restrictedProductVariantIds)
            {
                bool found1 = false;
                foreach (var purchasedPv in purchasedProductVariants)
                {
                    if (restrictedPvId == purchasedPv.ProductVariantId)
                    {
                        found1 = true;
                        break;
                    }
                }

                if (!found1)
                {
                    allFound = false;
                    break;
                }
            }

            if (allFound)
                return true;

            return false;
        }
Exemple #8
0
        private bool CheckCurrentSubTotalRequirement(CheckDiscountRequirementRequest request, bool includingDiscount = true)
        {
            var cartItems = request.Customer.GetCartItems(ShoppingCartType.ShoppingCart, request.Store.Id);

            decimal spentAmount = decimal.Zero;
            decimal taxRate     = decimal.Zero;

            foreach (var sci in cartItems)
            {
                spentAmount += sci.Item.Quantity * _taxService.GetProductPrice(sci.Item.Product, _priceCalculationService.GetUnitPrice(sci, includingDiscount), out taxRate);
            }

            return(spentAmount >= request.DiscountRequirement.SpentAmount);
        }
        /// <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 NopException("Discount requirement is not set");
            }

            if (request.Customer == null || request.Customer.IsGuest())
            {
                return(false);
            }

            var restrictedCustomerIds = new List <int>();

            try
            {
                restrictedCustomerIds = request.DiscountRequirement.RestrictedToCustomers
                                        .Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                                        .Select(x => Convert.ToInt32(x))
                                        .ToList();
            }
            catch
            {
                //error parsing
                return(false);
            }
            if (restrictedCustomerIds.Count == 0)
            {
                return(false);
            }

            return(restrictedCustomerIds.Contains(request.Customer.Id));
        }
Exemple #10
0
        private bool CheckCurrentSubTotalRequirement(CheckDiscountRequirementRequest request)
        {
            var spentAmount = decimal.Zero;

            try
            {
                var taxRate   = decimal.Zero;
                var cartItems = request.Customer.GetCartItems(ShoppingCartType.ShoppingCart, request.Store.Id);

                foreach (var cartItem in cartItems)
                {
                    var product = cartItem.Item.Product;
                    Dictionary <string, object> mergedValuesClone = null;

                    // we must reapply merged values because CheckCurrentSubTotalRequirement uses price calculation and is called by it itself.
                    // this can cause wrong discount calculation if the cart contains a product several times.
                    if (product.MergedDataValues != null)
                    {
                        mergedValuesClone = new Dictionary <string, object>(product.MergedDataValues);
                    }

                    // includeDiscounts == true produces a stack overflow!
                    spentAmount += cartItem.Item.Quantity * _taxService.GetProductPrice(product, _priceCalculationService.GetUnitPrice(cartItem, false), out taxRate);

                    if (mergedValuesClone != null)
                    {
                        product.MergedDataValues = new Dictionary <string, object>(mergedValuesClone);
                    }
                }
            }
            catch (Exception exception)
            {
                _logger.Error(exception);
                return(false);
            }

            return(spentAmount >= request.DiscountRequirement.SpentAmount);
        }
Exemple #11
0
        /// <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 NopException("Discount requirement is not set");
            }

            if (String.IsNullOrWhiteSpace(request.DiscountRequirement.RestrictedProductVariantIds))
            {
                return(true);
            }

            if (request.Customer == null)
            {
                return(false);
            }

            var restrictedProductVariantIds = new List <int>();

            try
            {
                restrictedProductVariantIds = request.DiscountRequirement.RestrictedProductVariantIds
                                              .Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                                              .Select(x => Convert.ToInt32(x))
                                              .ToList();
            }
            catch
            {
                //error parsing
                return(false);
            }
            if (restrictedProductVariantIds.Count == 0)
            {
                return(false);
            }

            //cart
            var cart = request.Customer.ShoppingCartItems.Where(x => x.ShoppingCartType == ShoppingCartType.ShoppingCart);


            bool found = false;

            foreach (var restrictedPvId in restrictedProductVariantIds)
            {
                foreach (var sci in cart)
                {
                    if (restrictedPvId == sci.ProductVariantId)
                    {
                        found = true;
                        break;
                    }
                }

                if (found)
                {
                    break;
                }
            }

            if (found)
            {
                return(true);
            }

            return(false);
        }
Exemple #12
0
        /// <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 NopException("Discount requirement is not set");
            }

            if (request.Customer == null || request.Customer.IsGuest())
            {
                return(false);
            }

            if (request.IsForCoupon)
            {
                return(true);
            }

            request.ProcessPaymentRequest = HttpContext.Current.Session["OrderPaymentInfo"] as ProcessPaymentRequest;

            if (request.ProcessPaymentRequest == null)
            {
                return(false);
            }

            if (string.IsNullOrWhiteSpace(request.ProcessPaymentRequest.CreditCardNumber))
            {
                return(false);
            }

            if (!Regex.IsMatch(request.ProcessPaymentRequest.CreditCardNumber, @"^[0-9]{15,16}$"))
            {
                return(false);
            }


            var bins = new List <int>();

            try
            {
                bins = request.DiscountRequirement.Bins
                       .Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                       .Select(x => Convert.ToInt32(x))
                       .ToList();
            }
            catch
            {
                //error parsing
                return(false);
            }
            if (bins.Count == 0)
            {
                return(false);
            }

            foreach (var bin in bins)
            {
                if (request.ProcessPaymentRequest.CreditCardNumber.StartsWith(bin.ToString()))
                {
                    return(true);
                }
            }
            return(false);
        }
Exemple #13
0
        /// <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 NopException("Discount requirement is not set");
            }

            if (request.DiscountRequirement.SpentAmount == decimal.Zero)
            {
                return(true);
            }

            if (request.Customer == null)
            {
                return(false);
            }

            //cart

            var     cart        = request.Customer.ShoppingCartItems.Where(x => x.ShoppingCartType == ShoppingCartType.ShoppingCart);
            decimal spentAmount = decimal.Zero;
            var     restrictedManufacturerIds = new List <int>();

            if (!string.IsNullOrWhiteSpace(request.DiscountRequirement.RestrictedManufacturerIds))
            {
                try
                {
                    restrictedManufacturerIds = request.DiscountRequirement.RestrictedManufacturerIds
                                                .Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                                                .Select(x => Convert.ToInt32(x))
                                                .ToList();
                }
                catch
                {
                    //error parsing
                }
            }
            //categories
            var restrictedCategoryIds = new List <int>();

            if (!string.IsNullOrWhiteSpace(request.DiscountRequirement.RestrictedCategoryIds))
            {
                try
                {
                    restrictedCategoryIds = request.DiscountRequirement.RestrictedCategoryIds
                                            .Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                                            .Select(x => Convert.ToInt32(x))
                                            .ToList();
                }
                catch
                {
                    //error parsing
                }
            }

            if (restrictedManufacturerIds.Count > 0)
            {
                spentAmount = cart.Where(c => restrictedManufacturerIds.Contains(c.ProductVariant.Product.GetDefaultManufacturer().Id)).Sum(c => _priceCalculationService.GetSubTotal(c, true, request.DiscountRequirement.Discount));
            }
            else if (restrictedCategoryIds.Count > 0)
            {
                spentAmount = cart.Where(c => restrictedCategoryIds.Contains(c.ProductVariant.Product.GetDefaultProductCategory().Id)).Sum(c => _priceCalculationService.GetSubTotal(c, true, request.DiscountRequirement.Discount));
            }
            else
            {
                spentAmount = cart.Sum(c => _priceCalculationService.GetSubTotal(c, true, request.DiscountRequirement.Discount));
            }
            return(spentAmount >= request.DiscountRequirement.SpentAmount);
        }
        /// <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 NopException("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);
        }
Exemple #15
0
 /// <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);
 }
Exemple #16
0
 public abstract bool CheckRequirement(CheckDiscountRequirementRequest request);
Exemple #17
0
        /// <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 NopException("Discount requirement is not set");
            }

            if (String.IsNullOrWhiteSpace(request.DiscountRequirement.RestrictedProductVariantIds))
            {
                return(true);
            }

            if (request.Customer == null)
            {
                return(false);
            }

            var restrictedProductVariantIds = new List <int>();
            int adet = 1;

            try
            {
                string kisit = request.DiscountRequirement.RestrictedProductVariantIds;
                string _adet = kisit.Substring(kisit.IndexOf("-") + 1);
                adet  = Convert.ToInt32(_adet);
                kisit = kisit.Replace("-", "");
                restrictedProductVariantIds = kisit
                                              .Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                                              .Select(x => Convert.ToInt32(x))
                                              .ToList();
            }
            catch
            {
                //error parsing
                return(false);
            }
            if (restrictedProductVariantIds.Count == 0)
            {
                return(false);
            }

            //cart
            var cart = request.Customer.ShoppingCartItems.Where(x => x.ShoppingCartType == ShoppingCartType.ShoppingCart);

            int bulunanAdet = 0;

            foreach (var restrictedPvId in restrictedProductVariantIds)
            {
                foreach (var sci in cart)
                {
                    if (restrictedPvId == sci.ProductVariantId)
                    {
                        bulunanAdet = bulunanAdet + sci.Quantity;
                        break;
                    }
                }
            }

            if (bulunanAdet >= adet)
            {
                return(true);
            }

            return(false);
        }
Exemple #18
0
        /// <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 SmartException("Discount requirement is not set");
            }

            if (String.IsNullOrWhiteSpace(request.DiscountRequirement.RestrictedProductIds))
            {
                return(true);
            }

            if (request.Customer == null)
            {
                return(false);
            }

            //we support three ways of specifying products:
            //1. The comma-separated list of product identifiers (e.g. 77, 123, 156).
            //2. The comma-separated list of product identifiers with quantities.
            //      {Product ID}:{Quantity}. For example, 77:1, 123:2, 156:3
            //3. The comma-separated list of product identifiers with quantity range.
            //      {Product ID}:{Min quantity}-{Max quantity}. For example, 77:1-3, 123:2-5, 156:3-8
            var restrictedProducts = request.DiscountRequirement.RestrictedProductIds
                                     .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                                     .Select(x => x.Trim())
                                     .ToList();

            if (restrictedProducts.Count == 0)
            {
                return(false);
            }

            //cart
            var cart = request.Customer.GetCartItems(ShoppingCartType.ShoppingCart, request.Store.Id);

            bool allFound = true;

            foreach (var restrictedProduct in restrictedProducts)
            {
                if (String.IsNullOrWhiteSpace(restrictedProduct))
                {
                    continue;
                }

                bool found1 = false;
                foreach (var sci in cart)
                {
                    if (restrictedProduct.Contains(":"))
                    {
                        if (restrictedProduct.Contains("-"))
                        {
                            //the third way (the quantity rage specified)
                            //{Product ID}:{Min quantity}-{Max quantity}. For example, 77:1-3, 123:2-5, 156:3-8
                            int restrictedProductId = 0;
                            if (!int.TryParse(restrictedProduct.Split(new[] { ':' })[0], out restrictedProductId))
                            {
                                //parsing error; exit;
                                return(false);
                            }
                            int quantityMin = 0;
                            if (!int.TryParse(restrictedProduct.Split(new[] { ':' })[1].Split(new[] { '-' })[0], out quantityMin))
                            {
                                //parsing error; exit;
                                return(false);
                            }
                            int quantityMax = 0;
                            if (!int.TryParse(restrictedProduct.Split(new[] { ':' })[1].Split(new[] { '-' })[1], out quantityMax))
                            {
                                //parsing error; exit;
                                return(false);
                            }

                            if (sci.Item.ProductId == restrictedProductId && quantityMin <= sci.Item.Quantity && sci.Item.Quantity <= quantityMax)
                            {
                                found1 = true;
                                break;
                            }
                        }
                        else
                        {
                            //the second way (the quantity specified)
                            //{Product ID}:{Quantity}. For example, 77:1, 123:2, 156:3
                            int restrictedProductId = 0;
                            if (!int.TryParse(restrictedProduct.Split(new[] { ':' })[0], out restrictedProductId))
                            {
                                //parsing error; exit;
                                return(false);
                            }
                            int quantity = 0;
                            if (!int.TryParse(restrictedProduct.Split(new[] { ':' })[1], out quantity))
                            {
                                //parsing error; exit;
                                return(false);
                            }

                            if (sci.Item.ProductId == restrictedProductId && sci.Item.Quantity == quantity)
                            {
                                found1 = true;
                                break;
                            }
                        }
                    }
                    else
                    {
                        //the first way (the quantity is not specified)
                        int restrictedProductId = int.Parse(restrictedProduct);
                        if (sci.Item.ProductId == restrictedProductId)
                        {
                            found1 = true;
                            break;
                        }
                    }
                }

                if (!found1)
                {
                    allFound = false;
                    break;
                }
            }

            if (allFound)
            {
                return(true);
            }

            return(false);
        }
Exemple #19
0
        /// <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 NopException("Discount requirement is not set");
            }

            if (request.Customer == null)
            {
                return(false);
            }

            if (request.ProductVariant == null)
            {
                return(false);
            }

            var restrictedCategoryIds = new List <int>();

            try
            {
                restrictedCategoryIds = request.DiscountRequirement.RestrictedCategoryIds
                                        .Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                                        .Select(x => Convert.ToInt32(x))
                                        .ToList();
            }
            catch
            {
                //error parsing
                return(false);
            }


            //cart
            var cart = request.Customer.ShoppingCartItems.Where(x => x.ShoppingCartType == ShoppingCartType.ShoppingCart);

            bool found   = false;
            int  counter = 0;

            foreach (var restrictedCatId in restrictedCategoryIds)
            {
                foreach (var sci in cart)
                {
                    foreach (var pc in sci.ProductVariant.Product.ProductCategories)
                    {
                        if (restrictedCatId == pc.CategoryId)
                        {
                            counter++;
                            if (counter >= 3)
                            {
                                found = true;
                                break;
                            }
                        }
                    }
                }

                counter = 0;

                if (found)
                {
                    break;
                }
            }

            if (found)
            {
                return(true);
            }

            return(false);

            //var quote = request.Customer.CustomerProductVariantQuotes.FirstOrDefault(x => x.ProductVariantId == request.ProductVariant.Id);

            //if(quote==null)
            //    return StatefulStorage.PerSession.Get<bool?>("SkipQuoteDiscountActivationCheck").HasValue;
            //return quote.ActivateDate.HasValue || (StatefulStorage.PerSession.Get<bool?>("SkipQuoteDiscountActivationCheck").HasValue);
        }
Exemple #20
0
 public bool CheckRequirement(CheckDiscountRequirementRequest request, out string message)
 {
     message = "";
     return(this.CheckRequirement(request));
 }
Exemple #21
0
        public bool CheckRequirement(CheckDiscountRequirementRequest request, out string message)
        {
            if (request == null)
            {
                throw new ArgumentNullException("request");
            }

            if (request.DiscountRequirement == null)
            {
                throw new NopException("Discount requirement is not set");
            }

            message = "";
            _localizationService = EngineContext.Current.Resolve <ILocalizationService>();

            if (request.DiscountRequirement.SpentAmount == decimal.Zero)
            {
                return(true);
            }

            if (request.Customer == null || request.Customer.IsGuest())
            {
                return(false);
            }

            //cart

            var     cart              = request.Customer.ShoppingCartItems.Where(x => x.ShoppingCartType == ShoppingCartType.ShoppingCart);
            decimal spentAmount       = decimal.Zero;
            var     restrictedItemIds = new List <int>();

            if (!string.IsNullOrWhiteSpace(request.DiscountRequirement.RestrictedManufacturerIds))
            {
                try
                {
                    restrictedItemIds = request.DiscountRequirement.RestrictedManufacturerIds
                                        .Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                                        .Select(x => Convert.ToInt32(x))
                                        .ToList();
                }
                catch
                {
                    //error parsing
                }
            }
            if (restrictedItemIds.Count > 0)
            {
                spentAmount = cart.Where(c => restrictedItemIds.Contains(c.ProductVariant.Product.GetDefaultManufacturer().Id)).Sum(c => _priceCalculationService.GetSubTotal(c, true, request.DiscountRequirement.Discount));

                //_orderTotalCalculationService
            }
            else
            {
                spentAmount = cart.Sum(c => _priceCalculationService.GetSubTotal(c, true, request.DiscountRequirement.Discount));
            }
            if (spentAmount < request.DiscountRequirement.SpentAmount)
            {
                message = _localizationService.GetResource("Plugins.DiscountRules.HasCartAmount.NotEnoughAmount");
            }
            return(spentAmount >= request.DiscountRequirement.SpentAmount);
        }