Example #1
0
        public ActionResult EvalPromos(DemoPromoViewModel viewModel)
        {
            var market          = _currentMarket.GetCurrentMarket();
            var inMemOrderGroup = new InMemoryOrderGroup(market, market.DefaultCurrency);

            foreach (var item in viewModel.CatalogItems)
            {
                if (item.Quantity > 0)
                {
                    var inMemLineItem = new InMemoryLineItem
                    {
                        Code     = item.Code,
                        Quantity = item.Quantity
                    };
                    inMemOrderGroup.GetFirstShipment().LineItems.Add(inMemLineItem);
                }
            }

            var promoSettings = new PromotionEngineSettings(RequestFulfillmentStatus.All, true);

            viewModel.Rewards = _promoEngine.Run(inMemOrderGroup, promoSettings);

            viewModel.CartItems = inMemOrderGroup.GetFirstShipment().LineItems;
            if (inMemOrderGroup.GetFirstForm().Promotions.Count > 0)
            {
                viewModel.PromoItems = inMemOrderGroup.GetFirstForm().Promotions.First().Entries;
            }

            return(View("Index", viewModel));
        }
        private Money GetDiscountedPrice(string code, decimal placedPrice, IMarket market)
        {
            var inMemoryOrderGroup = new InMemoryOrderGroup(market, market.DefaultCurrency);

            inMemoryOrderGroup.AddLineItem(new InMemoryLineItem
            {
                Quantity    = decimal.One,
                PlacedPrice = placedPrice,
                Code        = code
            });

            // calculate discounts
            var settings = new PromotionEngineSettings()
            {
                ApplyReward       = false,
                RequestedStatuses = RequestFulfillmentStatus.Fulfilled
            };
            var rewardDescriptions = _promotionEngine
                                     .Run(inMemoryOrderGroup, settings);

            var affectedEntries = rewardDescriptions
                                  .SelectMany(rd => rd.Redemptions)
                                  .Where(r => r.AffectedEntries != null)
                                  .SelectMany(r => r.AffectedEntries.PriceEntries);

            var affectedEntry = affectedEntries.FirstOrDefault(ae => ae.ParentItem.Code.Equals(code, StringComparison.OrdinalIgnoreCase));

            if (affectedEntry != null)
            {
                var savedAmount   = affectedEntry.OriginalTotal - affectedEntry.CalculatedTotal;
                var discountPrice = new PriceValue();
                return(new Money(affectedEntry.CalculatedTotal, market.DefaultCurrency));
            }
            else
            {
                var priceValue = new PriceValue();
                return(new Money(placedPrice, market.DefaultCurrency));
            }
        }