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