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)); } }
/// <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); }
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); }