/// <summary> /// Attempts to add a coupon offer to the sale. /// </summary> /// <param name="offerCode"> /// The offer code. /// </param> /// <returns> /// The <see cref="ICouponRedemptionResult"/>. /// </returns> public ICouponRedemptionResult RedeemCouponOffer(string offerCode) { var couponAttempt = this.GetCouponAttempt(offerCode); if (!couponAttempt) { return(new CouponRedemptionResult(couponAttempt.Exception)); } var coupon = couponAttempt.Result; var validationItems = this.PrepareInvoice(); var result = TryApplyOffer <ILineItemContainer, ILineItem>(LineItemExtensions.CreateNewItemCacheLineItemContainer(validationItems.Items.Where(x => x.LineItemType != LineItemType.Tax)), offerCode).AsCouponRedemptionResult(coupon); if (!result.Success) { return(result); } // check if there are any previously added coupons and if so revalidate them with the new coupon added. // Use case: First coupon added has the "not usable with other coupons constraint" and then a second coupon is added. // In this case the first coupon needs to be revalidated. If the attempt to apply the coupon again fails, the one currently // being added needs to fail. if (OfferCodes.Any()) { // Now we have to revalidate any existing coupon offers to make sure the newly approved ones will still be valid. var clone = this.CreateNewLineContainer(ItemCache.Items.Where(x => x.LineItemType != LineItemType.Discount)); _couponManager.Value.SafeAddCouponAttemptContainer <ItemCacheLineItem>(clone, result); ICouponRedemptionResult redemption = new CouponRedemptionResult(result.Award, result.Messages); foreach (var oc in OfferCodes) { redemption = DoTryApplyOffer <ILineItemContainer, ILineItem>(clone, oc).AsCouponRedemptionResult(coupon); if (!redemption.Success) { if (redemption.Messages.Any()) { result.AddMessage(redemption.Messages); } result.Exception = redemption.Exception; result.Success = false; break; } _couponManager.Value.SafeAddCouponAttemptContainer <ItemCacheLineItem>(clone, result); } if (!redemption.Success) { return(redemption); } } this.SaveOfferCode(offerCode); return(result); }
/// <summary> /// Removes an offer code from the OfferCodes collection. /// </summary> /// <param name="offerCode"> /// The offer code. /// </param> public void RemoveOfferCode(string offerCode) { if (OfferCodes.Contains(offerCode)) { _offerCodeTempData.Value.Remove(offerCode); this.SaveOfferCodes(); } }
/// <summary> /// Saves offer code. /// </summary> /// <param name="offerCode"> /// The offer code. /// </param> /// <returns> /// The <see cref="bool"/>. /// </returns> protected bool SaveOfferCode(string offerCode) { if (!OfferCodes.Contains(offerCode)) { _offerCodeTempData.Value.Add(offerCode); this.SaveOfferCodes(); return(true); } return(false); }