public static ValidatedPromo Create(PromoDetail promo, IQueryable<ProductMappingItem> mappings, List<KeyValuePair<string, string>> basketCriteriaChecks, IQueryable<ProductPromotionMapping> productPromoMappings)
        {
            // Reload the XML into the Integration object, so that we can make use of its validation routines.
            // We also use this for the available times.
            var integrationPromo = Qixol.Promo.Integration.Lib.Export.ExportPromotionDetailsItem.RetrieveFromXml(promo.PromoXml);
            // the Xml only has the TIME for the valid from / to, and then only if the promotion starts/expires on that day.
            // for completeness, reset these to the full datetime (or min/max if not present)
            integrationPromo.ValidFrom = promo.ValidFrom.HasValue ? promo.ValidFrom.Value : DateTime.MinValue;
            integrationPromo.ValidTo = promo.ValidTo.HasValue ? promo.ValidTo.Value : DateTime.MaxValue;
            if (integrationPromo.ValidTo.CompareTo(DateTime.MinValue) == 0)
                integrationPromo.ValidTo = DateTime.MaxValue;

            List<IGrouping<int, ProductPromotionMapping>> requiredQuantities = null;
            List<IGrouping<decimal, ProductPromotionMapping>> requiredSpend = null;
            List<IGrouping<bool, ProductPromotionMapping>> multipleProductRestrictions = null;
            List<IGrouping<string, ProductPromotionMapping>> matchingRestrictions = null;

            if(productPromoMappings != null)
            {
                requiredQuantities = productPromoMappings.GroupBy(gb => gb.RequiredQty).ToList();
                requiredSpend = productPromoMappings.GroupBy(gb => gb.RequiredSpend).ToList();
                multipleProductRestrictions = productPromoMappings.GroupBy(gb => gb.MultipleProductRestrictions).ToList();
                matchingRestrictions = productPromoMappings.GroupBy(gb => gb.MatchingRestrictions).ToList();            
            }

            var returnItem = new ValidatedPromo()
            {
                // Set basic details
                PromotionId = promo.PromoId,
                Title = promo.PromoName,
                PromoType = promo.PromoTypeName,
                Description = string.IsNullOrEmpty(promo.DisplayText) ? promo.PromoName : promo.DisplayText,
                ValidFrom = promo.ValidFrom,
                ValidTo = promo.ValidTo,
                MinimumSpend = promo.MinimumSpend,
                DiscountAmount = promo.DiscountAmount,
                DiscountPercent = promo.DiscountPercent,
                YourReference = promo.YourReference,

                HasMultipleRequiredQty = requiredQuantities != null && requiredQuantities.Count > 1,
                HasMultipleRequiredSpend = requiredSpend != null && requiredSpend.Count > 1,
                HasMultipleMatchingRestrictions = matchingRestrictions != null && matchingRestrictions.Count > 1,
                HasMultipleRequireAdditionalItems = multipleProductRestrictions != null && multipleProductRestrictions.Count > 1,

                RequiredItemQty = (requiredQuantities != null && requiredQuantities.Count == 1) ? requiredQuantities.FirstOrDefault().First().RequiredQty : default(int?),
                RequiredItemSpend = (requiredSpend != null && requiredSpend.Count == 1) ? requiredSpend.FirstOrDefault().First().RequiredSpend : default(decimal?),
                RequireAdditionalItems = (multipleProductRestrictions != null && multipleProductRestrictions.Count == 1) ? multipleProductRestrictions.FirstOrDefault().First().MultipleProductRestrictions : false,
                MatchingRestriction = (matchingRestrictions != null && matchingRestrictions.Count == 1) ? matchingRestrictions.FirstOrDefault().First().MatchingRestrictions : string.Empty,

                // Revalidate the Criteria and Time restrictions for this promo.
                ValidForCriteria = integrationPromo.ValidateUnmatchedCriteria(basketCriteriaChecks),
                ValidForTime = integrationPromo.ValidateForTime(DateTime.UtcNow),

                // Where timebands are specified, return them
                Availability = (integrationPromo.AvailableTimes != null && integrationPromo.AvailableTimes.Count > 0) ?
                                    integrationPromo.AvailableTimes.Select(a => new ValidatedPromoAvailability() { Start = a.StartTime, End = a.EndTime }).ToList()
                                    : null,

            };

            if (mappings != null && productPromoMappings != null)
            {
                // Check to see whether all variants for the product are valid for this promo.
                returnItem.ForAllVariants = mappings.Count() == 1 ? true
                                    : (mappings.Count() == productPromoMappings.Where(ppm => ppm.PromotionId == promo.PromoId).Count());

            }

            return returnItem;
        }
 public void Delete(PromoDetail itemToDelete)
 {
     _repository.Delete(itemToDelete);
     _eventPublisher.EntityDeleted<PromoDetail>(itemToDelete);
 }
        private PromoDetail GetPromotionDetail(ExportPromotionDetailsItem promotion)
        {
            var newPromoDetails = new PromoDetail()
            {
                PromoId = promotion.Id,
                PromoName = promotion.PromotionName,
                PromoTypeName = promotion.PromotionType,
                YourReference = promotion.YourReference,
                ReportingCode = promotion.ReportingCode,
                DiscountAmount = promotion.DiscountAmount,
                DiscountPercent = promotion.DiscountPercent,
                BundlePrice = promotion.BundlePrice,
                MinimumSpend = promotion.MinimumSpend,
                BasketRestrictions = promotion.HasAdditionalBasketRestrictions,
                CouponRestrictions = promotion.HasCouponRestrictions,
                ValidFrom = DateTime.Compare(promotion.ValidFrom, DateTime.MinValue) == 0 ? default(DateTime?) : promotion.ValidFrom,
                ValidTo = DateTime.Compare(promotion.ValidTo, DateTime.MinValue) == 0 ? default(DateTime?) : promotion.ValidTo,
                DisplayText = promotion.DisplayText,
                AppliesToItems = true,
                AppliesToBasket = false,
                AppliesToDelivery = false,
                PromoXml = promotion.AllXml,
                CreatedDate = DateTime.Now
            };

            return newPromoDetails;
        }
 public void Insert(PromoDetail itemToInsert)
 {
     _repository.Insert(itemToInsert);
     _eventPublisher.EntityInserted<PromoDetail>(itemToInsert);
 }