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));
            }
        }
Example #3
0
        /// <summary>
        /// This is done for calculating a discounted price on "Customer Pricing" prices
        /// By default the "DefaultPrice is used"
        /// </summary>
        public override IOrderGroup CreateInMemoryOrderGroup(
            ContentReference entryLink
            , IMarket market
            , Currency marketCurrency)
        {
            // this is where you can reference your own pricing calculator to retrieve...
            // ..."the right" sale price
            var theEntry   = _contentLoader.Get <EntryContentBase>(entryLink);
            var orderGroup = new InMemoryOrderGroup(market, marketCurrency);
            //IPriceValue price = BestPricingCalculatorEver.GetSalePrice(entryLink);
            IPriceValue price = _myPriceCalculator.GetSalePrice(theEntry, 1);

            if (price != null && price.UnitPrice.Amount != 0)
            {
                orderGroup.Forms.First().Shipments.First().LineItems.Add(new InMemoryLineItem
                {
                    Quantity    = 1,
                    Code        = price.CatalogKey.CatalogEntryCode,
                    PlacedPrice = price.UnitPrice.Amount
                });
            }

            return(orderGroup);
        }
Example #4
0
        public override IOrderGroup CreateInMemoryOrderGroup(
            ContentReference entryLink,
            IMarket market,
            Mediachase.Commerce.Currency marketCurrency)
        {
            InMemoryOrderGroup memoryOrderGroup = new InMemoryOrderGroup(market, marketCurrency);

            memoryOrderGroup.CustomerId = PrincipalInfo.CurrentPrincipal.GetContactId();
            string      code  = this._referenceConverter.GetCode(entryLink);
            IPriceValue price = PriceCalculationService.GetSalePrice(code, market.MarketId, marketCurrency);

            if (price != null && price.UnitPrice != null)
            {
                decimal priceAmount = price.UnitPrice.Amount;
                memoryOrderGroup.Forms.First <IOrderForm>().Shipments.First <IShipment>().LineItems.Add((ILineItem) new InMemoryLineItem()
                {
                    Quantity    = 1M,
                    Code        = code,
                    PlacedPrice = priceAmount
                });
            }

            return((IOrderGroup)memoryOrderGroup);
        }