Exemple #1
0
        public Kart Scan(Kart kart, Sku sku, int items)
        {
            var skuInStock         = skus.Find(sku.ItemName);
            var checkedOutSkuUnits = kart.GetSkuUnits(sku);
            var noOfferPrice       = sku.Price * items;

            decimal offerPrice             = 0;
            bool    offerApplies           = false;
            int     existingSkuItemsInKart = 0;

            kart.Cart.TryGetValue(sku, out existingSkuItemsInKart);

            // Get all offers that contains current added sku
            var applicableOffers = offers.Where(o => o.Condition.FirstOrDefault(su => su.Sku == sku) != null);

            foreach (var offer in applicableOffers)
            {
                var applicableOfferExisting = offer.Condition.SingleOrDefault(su => su.Sku == sku);
                // Check if adding current sku items triggers offer
                if (applicableOfferExisting == null)
                {
                    continue; // Offer does not apply
                }
                if (applicableOfferExisting.Units > existingSkuItemsInKart + items)
                {
                    continue; // Offer does not applu
                }

                //Current added sku can trigger offer, now check other skus that make up offer
                var applicableOfferOther = offer.Condition.Where(su => su.Sku != sku);

                // Check other skus already in kart will trigger offer.
                if (applicableOfferOther.All(o => kart.Cart.ContainsKey(o.Sku)) == false)
                {
                    continue;
                }

                // Check other skus already in kart has enough items to trigger offer.
                foreach (var other in applicableOfferOther)
                {
                    if (other.Units > kart.Cart[other.Sku])
                    {
                        continue;
                    }
                }

                // Finally, we know offer applies
                if (offerPrice > offer.OfferPrice)
                {
                    offerPrice = offer.OfferPrice;
                }
                offerApplies = true;
            }

            kart.AddOrUpdate(sku, items);
            if (offerApplies)
            {
                kart.Total += Math.Min(noOfferPrice, offerPrice);
            }
            else
            {
                kart.Total += noOfferPrice;
            }
            return(kart);
        }