private IEnumerable<PromotionRecord> CalculateLineItemDiscounts()
		{
			var records = new List<PromotionRecord>();
			foreach (var form in CurrentOrderGroup.OrderForms)
			{
				foreach (var lineItem in form.LineItems)
				{
					var set = new PromotionEntrySet();
					var entry = GetPromotionEntryFromLineItem(lineItem);
					set.Entries.Add(entry);

					// create context 
					var ctx = new Dictionary<string, object> { { PromotionEvaluationContext.TargetSet, set } };

					//1. Prepare marketing context
					var evaluationContext = new PromotionEvaluationContext
						{
							ContextObject = ctx,
							CustomerId = CustomerSessionService.CustomerSession.CustomerId,
							CouponCode = CustomerSessionService.CustomerSession.CouponCode,
							Currency = CustomerSessionService.CustomerSession.Currency,
							PromotionType = PromotionType.CatalogPromotion,
							Store = CustomerSessionService.CustomerSession.StoreId,
							IsRegisteredUser = CustomerSessionService.CustomerSession.IsRegistered,
							IsFirstTimeBuyer = CustomerSessionService.CustomerSession.IsFirstTimeBuyer
						};

					//2. Evaluate 
					var promotions = PromotionEvaluator.EvaluatePromotion(evaluationContext);
					var rewards = promotions.SelectMany(x => x.Rewards);

					records.AddRange(rewards.Select(reward => new PromotionRecord
						{
							AffectedEntriesSet = set,
							TargetEntriesSet = set,
							Reward = reward,
							PromotionType = PromotionType.CatalogPromotion
						}));
				}
			}

			return records.ToArray();
		}
		private PromotionEntrySet GetPromotionEntrySetFromOrderForm(OrderForm form)
		{
			var set = new PromotionEntrySet();

			foreach (var lineItem in form.LineItems)
			{
				var entry = GetPromotionEntryFromLineItem(lineItem);
				set.Entries.Add(entry);
			}

			return set;
		}
		private PromotionEntrySet GetPromotionEntrySetFromItem(Item item, decimal price, Hashtable tags)
		{
			var set = new PromotionEntrySet();
			var populate = new PromotionEntryPopulate();

			var entry = new PromotionEntry(tags ?? new Hashtable()) { CostPerEntry = price };
			populate.Populate(ref entry, item);
			set.Entries.Add(entry);

			return set;
		}