protected override RewardDescription Evaluate( Free2 promotionData , PromotionProcessorContext context) { // RequiredQty & FreeItem in the model IOrderForm orderForm = context.OrderGroup.GetFirstForm(); IEnumerable <ILineItem> lineItems = context.OrderGroup.GetFirstForm().GetAllLineItems(); ContentReference freeItem = promotionData.FreeItem.Items.First(); // Using "First()" just to show string freeItemCode = _referenceConverter.GetCode(freeItem); FulfillmentStatus status = promotionData.RequiredQty.GetFulfillmentStatus( orderForm, _collectionTargetEvaluator, _fulfillmentEvaluator); IList <string> applicableEntryCodes = _collectionTargetEvaluator.GetApplicableCodes( lineItems, promotionData.RequiredQty.Items, false); string description = promotionData.Description; return(RewardDescription.CreateFreeItemReward( status , GetRedemptionDescriptions(promotionData, context, applicableEntryCodes) , promotionData , description + " : " + freeItemCode)); // description, just to show }
public BuyXFromCategoryGetProductForFreeResult(FulfillmentStatus status, string description, VariationContent variation, OrderGroup group) { this.Status = status; this.Description = description; this._variation = variation; this._orderGroup = group; }
public FulfillmentInfo GetFirstFulfillment(FulfillmentStatus status) { using (var context = GetContext()) { return context.FulfillmentInfoes.FirstOrDefault(i => i.FulfillmentStatusId == (byte)status); } }
private IPromotionResult PromotionResult(IOrderGroup orderGroup, BuyXFromCategoryGetProductForFree promotion, FulfillmentStatus fulfillment) { BuyXFromCategoryGetProductForFreeResult result = null; switch (fulfillment) { case FulfillmentStatus.NotFulfilled: result = new BuyXFromCategoryGetProductForFreeResult(fulfillment, "The promotion is not fulfilled."); break; case FulfillmentStatus.PartiallyFulfilled: result = new BuyXFromCategoryGetProductForFreeResult(fulfillment, "The promotion is somewhat fulfilled."); break; case FulfillmentStatus.Fulfilled: { VariationContent content = _contentLoader.Get <VariationContent>(promotion.FreeProduct); result = new BuyXFromCategoryGetProductForFreeResult(fulfillment, string.Format("The promotion is fulfilled and it has been applied to item {0}", content.Name), content, orderGroup as OrderGroup); break; } } return(result); }
private bool ValidateStatusTransition(FulfillmentStatus statusInDb, FulfillmentStatus statusToUpdate) { switch (statusInDb) { case FulfillmentStatus.Ready: if (statusToUpdate == FulfillmentStatus.Failed || statusToUpdate == FulfillmentStatus.InProgress) return true; break; case FulfillmentStatus.Fulfilled: if (statusToUpdate == FulfillmentStatus.Completed) return true; break; case FulfillmentStatus.Failed: if (statusToUpdate == FulfillmentStatus.Ready || statusToUpdate == FulfillmentStatus.Fulfilled) return true; break; case FulfillmentStatus.InProgress: if (statusToUpdate == FulfillmentStatus.Fulfilled || statusToUpdate == FulfillmentStatus.Failed) return true; break; } return false; }
// previously used, get it back in protected virtual string CreateCustomRewardDescriptionText( IEnumerable <RewardDescription> rewardDescriptions , FulfillmentStatus fulfillmentStatus , MyPercentagePromotion promotion , IOrderGroup orderGroup) { /*var contentNames = GetContentNames(affectedItems); // local method*/ string contentNames = String.Empty; IEnumerable <ILineItem> lineItems = orderGroup.GetAllLineItems(); if (fulfillmentStatus == FulfillmentStatus.Fulfilled) { return(String.Format(CultureInfo.InvariantCulture, "{0}% discount has been given for the items '{1}'!" , promotion.PercentageDiscount, contentNames)); } if (fulfillmentStatus == FulfillmentStatus.PartiallyFulfilled) // have 3 items in cart --> gets this { //var remainingQuantity = promotion.MinNumberOfItems - rewardDescriptions.Sum(x => x.or.Quantity); var remainingQuantity = promotion.MinNumberOfItems.RequiredQuantity - lineItems.Count(); return(String.Format(CultureInfo.InvariantCulture, "Buy {0} more items and get a {1}% discount!" , remainingQuantity, promotion.PercentageDiscount)); } return("The promotion is not applicable for the current order."); }
public void GivenAFulfillmentStatus_WhenRemove_ThenThrowException() { var expected = new FulfillmentStatus { Id = 1, Name = "New" }; Target.ExpectException <NotSupportedException>(() => Target.Remove(expected)); }
public List<FulfillmentInfo> GetFulfillments(FulfillmentStatus status, DateTime? modifiedFromUtc = null) { using (var context = GetContext()) { IQueryable<FulfillmentInfo> query = context.FulfillmentInfoes .Where(info => info.FulfillmentStatusId == (byte)status); if (modifiedFromUtc != null) query = query.Where(f => f.ModifiedDateUtc > modifiedFromUtc.Value); return query.ToList(); } }
protected override RewardDescription Evaluate( FreeItemPromotion data, PromotionProcessorContext ctx) { // is this used IEnumerable <ContentReference> targetItems = data.DiscountTargets.Items.ToList(); // get which LI this promo is for var targets = data.DiscountTargets; var freeItem = data.FreeItem.Items.First().ToReferenceWithoutVersion(); //var freeItemCode = ServiceLocator.Current.GetInstance<ReferenceConverter>().GetCode(freeItem); var freeItemCode = _refConv.Service.GetCode(freeItem); // Have RefConv. below IOrderForm form = ctx.OrderForm; var lineItems = form.GetAllLineItems(); //var lineItems = GetLineItems(ctx.OrderForm.get); // not anymore var matchRecursive = false; // mandatory var skuCodes = _targetEvaluator.GetApplicableCodes( lineItems, targets.Items, targets.MatchRecursive); // get one if kicked in, 0 if not FulfillmentStatus status = data.RequiredQty.GetFulfillmentStatus(form, _targetEvaluator, _fulfillmentEvaluator); List <RewardDescription> rewardDescriptions = new List <RewardDescription>(); List <RedemptionDescription> redemptionDescriptions = new List <RedemptionDescription>(); // GetAllAffectedItems is the only method - name was changed var affectedItems = _targetEvaluator.GetApplicableCodes(lineItems, targetItems, matchRecursive); // only a single method to use on the "FulfillmentEvaluator" - out commented //var status = FulfillmentEvaluator.GetStatusForBuyQuantityPromotion(affectedItems.Select(x => x.LineItem) // , data.RequiredQty,0); // "Required" in the model // This way (demo) of using it is maybe not the intended, thought of like "buy 5 - get one for free" // ...have to load the gift and add it to the cart // ...have "Money" and "Percentage" return(RewardDescription.CreateFreeItemReward( status , GetRedemptions(skuCodes, data, ctx) , data , data.Description + " : " + freeItemCode //status, //affectedItems, //data //GetRewardDescriptionText(tagets, status, data) )); }
public override RewardDescription Evaluate(IOrderForm orderForm, BuyXFromCategoryGetProductForFree promotionData, PromotionProcessorContext context) { IEnumerable <ILineItem> items = GetLineItemsInOrder(orderForm); List <AffectedItem> affectedItems = new List <AffectedItem>(); var lineItemCategories = items.Select(i => new { Quantity = i.Quantity, NodesForEntry = GetNodesForEntry(i.Code), Code = i.Code, LineItem = i }); decimal numberOfItemsInPromotionCategory = 0; NodeContent category = _contentLoader.Get <NodeContent>(promotionData.Category); foreach (var lineItemCategory in lineItemCategories) { if (lineItemCategory.NodesForEntry.Contains(category.Code)) { numberOfItemsInPromotionCategory += lineItemCategory.Quantity; // TODO: This has not yet been implemented //affectedItems.Add( // new AffectedItem( // _referenceConverter.GetContentLink(lineItemCategory.Code), // lineItemCategory.LineItem, // lineItemCategory.Quantity)); } } FulfillmentStatus fulfillment = this.GetFulfillment(numberOfItemsInPromotionCategory, promotionData.Threshold); // context.OrderGroup //if(fulfillment == FulfillmentStatus.Fulfilled) //{ // affectedItems.Add( // new AffectedItem( // promotionData // _referenceConverter.GetContentLink(lineItemCategory.Code), // lineItemCategory.LineItem, // lineItemCategory.Quantity)); //} return(RewardDescription.CreateFreeItemReward(fulfillment, affectedItems, promotionData, "Got something for free")); // return new RewardDescription(fulfillment, affectedItems, promotionData, 0, 0, RewardType.Free, "Got something for free"); }
Injected <ReferenceConverter> _refConv; // lazy dev - fix protected override RewardDescription Evaluate( FreeItemPromotion data, PromotionProcessorContext ctx) { // is this used IEnumerable <ContentReference> targetItems = data.DiscountTargets.Items.ToList(); // get which LI this promo is for // data - the promotion itself, and the custom model provided // ctx - gives OrderGroup, OrderForm, Prices (PriceMatrix) & some calc var targets = data.DiscountTargets; var freeItem = data.FreeItem.Items.First().ToReferenceWithoutVersion(); // just to show some var freeItemCode = _refConv.Service.GetCode(freeItem); // Have RefConv. injected below IOrderForm form = ctx.OrderForm; var lineItems = form.GetAllLineItems(); //var lineItems = GetLineItems(ctx.OrderForm.get); // not anymore var matchRecursive = false; // mandatory IList <string> skuCodes = _targetEvaluator.GetApplicableCodes( lineItems, targets.Items, targets.MatchRecursive); // get one if kicked in, 0 if not FulfillmentStatus status = data.RequiredQty.GetFulfillmentStatus( form, _targetEvaluator, _fulfillmentEvaluator); // extension method List <RewardDescription> rewardDescriptions = new List <RewardDescription>(); List <RedemptionDescription> redemptionDescriptions = new List <RedemptionDescription>(); // GetAllAffectedItems is the only method - name was changed var affectedItems = _targetEvaluator.GetApplicableCodes(lineItems, targetItems, matchRecursive); // "FulfillmentEvaluator" - not used much here - gives different statuses //_fulfillmentEvaluator.GetStatusForSpendAmountPromotion() //... as an example // This way (demo) of using it is maybe not the intended, thought of like // "buy 5 - get one for free" // ...have to load the gift and add it to the cart // ...have "Money", "Percentage", GiftItem, FreeItem etc. return(RewardDescription.CreateFreeItemReward( status , GetRedemptions(skuCodes, data, ctx) // explanation below , data , data.Description + " : " + freeItemCode )); }
public override IPromotionResult Evaluate(IOrderGroup orderGroup, BuyXFromCategoryGetProductForFree promotion) { IEnumerable <ILineItem> items = GetLineItemsInOrder(orderGroup); var lineItemCategories = items.Select(i => new { i.Quantity, NodesForEntry = GetNodesForEntry(i.Code) }); decimal numberOfItemsInPromotionCategory = 0; NodeContent category = _contentLoader.Get <NodeContent>(promotion.Category); foreach (var lineItemCategory in lineItemCategories) { if (lineItemCategory.NodesForEntry.Contains(category.Code)) { numberOfItemsInPromotionCategory += lineItemCategory.Quantity; } } FulfillmentStatus fulfillment = this.GetFulfillment(numberOfItemsInPromotionCategory, promotion.Threshold); return(PromotionResult(orderGroup, promotion, fulfillment)); }
protected virtual string CreateCustomRewardDescriptionText(FulfillmentStatus fulfillmentStatus, FreeStuffPromotion promotionData) { string freeItemCode = _referenceConverter.GetCode(promotionData.FreeItem[0]); if (fulfillmentStatus == FulfillmentStatus.PartiallyFulfilled) { List <string> codes = new List <string>(); int numItems = promotionData.RequiredQty.Items.Count; foreach (var item in promotionData.RequiredQty.Items) { codes.Add(_referenceConverter.GetCode(item)); } return($"Buy at least {promotionData.RequiredQty.RequiredQuantity} " + $"of {string.Join(",", codes)} and get a free {freeItemCode}!"); } if (fulfillmentStatus == FulfillmentStatus.Fulfilled) { return($"Congratulations! You get a free {freeItemCode}"); } return("This promotion is not applicable for the current order."); }
protected override RewardDescription Evaluate(FreeStuffPromotion promotionData, PromotionProcessorContext context) { var condition = promotionData.RequiredQty; var lineItems = context.OrderForm.GetAllLineItems(); IList <string> skuCodes = _collectionTargetEvaluator.GetApplicableCodes(lineItems, condition.Items, false); FulfillmentStatus status = promotionData.RequiredQty .GetFulfillmentStatus(context.OrderForm, _collectionTargetEvaluator, _fulfillmentEvaluator); List <RedemptionDescription> redemptions = new List <RedemptionDescription>(); if (status == FulfillmentStatus.Fulfilled) { AffectedEntries entries = _giftItemFactory.CreateGiftItems(promotionData.FreeItem, context); redemptions.Add(CreateRedemptionDescription(entries)); } return(RewardDescription.CreateGiftItemsReward(status, redemptions, promotionData, CreateCustomRewardDescriptionText(status, promotionData))); }
public Task <UpdateDropsEntitlementsResponse> UpdateDropsEntitlementsAsync(string[] entitlementIds, FulfillmentStatus fulfillmentStatus, string accessToken) { var body = new { entitlement_ids = entitlementIds, fulfillment_status = fulfillmentStatus.ToString() }; return(TwitchPatchGenericAsync <UpdateDropsEntitlementsResponse>("/entitlements/drops", ApiVersion.Helix, JsonConvert.SerializeObject(body), null, accessToken)); }
public void Update(FulfillmentStatus item) { throw new NotSupportedException("Update is not supported in this repository"); }
public BuyXFromCategoryGetProductForFreeResult(FulfillmentStatus status, string description) : this(status, description, null, null) { }
// may want to customize protected override RewardDescription NotFulfilledRewardDescription(FreeItemPromotion promotionData, PromotionProcessorContext context, FulfillmentStatus fulfillmentStatus) { return(base.NotFulfilledRewardDescription(promotionData, context, fulfillmentStatus)); }
/* RewardDescription is "checking" whether the promotion was fulfilled (or not, or partially), * ...which items the promotion was applied to... * ...the fake-cart is taken care of) * PromotionProcessorBase has one abstract method to be implemented, Evaluate. * ...the method is supplied with a PromotionData, and a PromotionProcessorContext object * ...that contains information about the current order/fakeCart. */ protected override RewardDescription Evaluate( // note: it's OrderForm now... MyPercentagePromotion promotionData // the model --> look in the UI to see the properties , PromotionProcessorContext context) { /* A reward description contains information about if and how a reward is applied. * ...some properties are: * - A list of redemption descriptions, one for each of the maximum amount of redemptions * ...that could be applied to the current order. * This does not have to take redemption limits into consideration, that is handled by the * promotion engine. * - A reward type. Depending on the type, the promotion value is read from the properties * UnitDiscount, Percentage or Quantity. * - A status flag. Indicates if a promotion is not, partially, or fully fulfilled. * - A saved amount. The amount by which this reward reduces the order cost. * Is set by the promotion engine; should not be set in the promotion processor*/ IOrderForm orderForm = context.OrderForm; // OrderForm now pops in with the context //context. // lots of things IEnumerable <ILineItem> lineItemsCheck = orderForm.GetAllLineItems(); IEnumerable <ILineItem> lineItems = GetLineItems(context.OrderForm); #region Just Checking //var e = _contentLoader.Get<EntryContentBase>(item0); //should check if it's applicable... at all //var li = _orderFactory.Service.CreateLineItem(e.Code); //li.Quantity = 1; //li.PlacedPrice = 15; //orderForm.Shipments.First().LineItems.Add(li); #endregion // GetFulfillmentStatus - extension method FulfillmentStatus status = promotionData.MinNumberOfItems.GetFulfillmentStatus( orderForm, _targetEvaluator, _fulfillmentEvaluator); List <RewardDescription> rewardDescriptions = new List <RewardDescription>(); List <RedemptionDescription> redemptionDescriptions = new List <RedemptionDescription>(); #region NewStuff // The below does not see the cart, it's for landing pages for the Promotion itself (rendering) PromotionItems promoItems = GetPromotionItems(promotionData); // gets null var condition = promotionData.PercentageDiscount; // ...in the model var targets = promotionData.DiscountTargets; // get one in any case, points to what's at "promo" var skuCodes = _targetEvaluator.GetApplicableCodes( lineItems, targets.Items, targets.MatchRecursive); // get one if kicked in, 0 if not var fulfillmentStatus = _fulfillmentEvaluator.GetStatusForBuyQuantityPromotion( skuCodes , lineItems , promotionData.MinNumberOfItems.RequiredQuantity , promotionData.PartialFulfillmentNumberOfItems); // Just checking // The promotion engine creates a "price matrix" for all items in the order form. // OrderFormPriceMatrix, is accessible through the EntryPrices property // of the PromotionProcessorContext object. // PromotionProcessorContext is passed to the Evaluate method as one of the arguments. // ...the matrix holds "codes" and quantity // The second ExtractEntries call starts to receive entries where the first call ended. // ... makes it easy to create several redemptions by calling ExtractEntries in a loop, // ... and create one RedemptionDescription inside the loop. // The price matrix has one public method (ExtractEntries) // ... two overloads, both overloads takes entry codes and quantity as parameters. // ... one contains an action for getting the entries in a specific order. // ... if no specific order is specified, MostExpensiveFirst is used. var affectedEntries = context.EntryPrices.ExtractEntries( skuCodes, 1); // get one if it kicks in, null if not if (affectedEntries != null) { IEnumerable <PriceEntry> priceEntries = affectedEntries.PriceEntries; foreach (var item in priceEntries) { var qty = item.Quantity; var price = item.Price; var calc = item.CalculatedTotal; // involves the Qty var actuals = item.ActualTotal; // includes rounding } } // could have a look here switch (fulfillmentStatus) { case FulfillmentStatus.NotFulfilled: break; case FulfillmentStatus.PartiallyFulfilled: break; case FulfillmentStatus.Fulfilled: break; case FulfillmentStatus.CouponCodeRequired: break; case FulfillmentStatus.Excluded: break; case FulfillmentStatus.VisitorGroupRequired: break; case FulfillmentStatus.RedemptionLimitReached: break; case FulfillmentStatus.NoMoneySaved: break; case FulfillmentStatus.InvalidCoupon: break; case FulfillmentStatus.InvalidCombination: break; case FulfillmentStatus.MissingVisitorGroup: break; case FulfillmentStatus.NoRedemptionRemaining: break; case FulfillmentStatus.Ineffective: break; default: break; } // ... an extension method return(RewardDescription.CreatePercentageReward( fulfillmentStatus , GetRedemptions(skuCodes, promotionData, context) , promotionData , promotionData.PercentageDiscount.Percentage //, fulfillmentStatus.GetRewardDescriptionText() , fulfillmentStatus.GetRewardDescriptionText() + " : " + promotionData.Description + " : " )); #endregion #region Older stuff and debug - no show #region Older not in use //RewardDescription rewardDescription = new RewardDescription(); //var codes = _targetEvaluator.GetApplicableCodes(lineItems,) //_fulfillmentEvaluator.GetStatusForBuyQuantityPromotion( // ) #endregion // new stuff #region Previous version //if (status.HasFlag(FulfillmentStatus.Fulfilled)) //{ // return RewardDescription.CreateMoneyOrPercentageRewardDescription( // status, // redemptionDescriptions, // promotionData, // promotionData.PercentageDiscount, // context.OrderGroup.Currency, // "Custom promotion fulfilled"); // should have a more flexible way... GetDescription() //} //else //{ // return RewardDescription.CreateNotFulfilledDescription( // promotionData, FulfillmentStatus.NotFulfilled); //} #endregion #region Debug //RedemptionDescription rFirst; //redemptionDescriptions.Add(CreateRedemptionDescriptionText(orderForm)); // below "if-construct" is for debug //if (promotionData.PercentageDiscount <= 0) // ... return "sorry, no discount" //{ // return RewardDescription.CreatePercentageReward( // FulfillmentStatus.NotFulfilled, // redemptionDescriptions, // promotionData, // 0, // CreateRewardDescriptionText(redemptionDescriptions.First(), FulfillmentStatus.NotFulfilled, promotionData)); // /*RewardDescription.CreateMoneyOrPercentageRewardDescription(FulfillmentStatus.NotFulfilled,r,promotionData,null);*/ //} //IEnumerable<ContentReference> targetItems = promotionData.DiscountTargets.Items.ToList(); // set by the Promo-UI //bool matchRecursive = true; // walking down the catalog hierarchy //var lineItems = GetLineItems(orderForm); // "GetLineItems" - in the base class (PromotionProcessorBase) //var affectedItems = _targetEvaluator.GetApplicableItems(lineItems, targetItems, matchRecursive); // in CollectionTargetEvaluator //var affectedItems = _targetEvaluator.GetApplicableCodes(orderForm.GetAllLineItems(), targetItems, false); // small class --> just to get the status by the settings //var status = FulfillmentEvaluator.GetStatusForBuyQuantityPromotion(affectedItems.Select(x => x.LineItem) // , promotionData.MinNumberOfItems, promotionData.PartialFulfillmentNumberOfItems); // in the model //var s = FulfillmentEvaluator. //FulfillmentEvaluator ff = new FulfillmentEvaluator(); //if (rewardDescriptions.Any()) //{ // return rewardDescriptions.First(); //} //else //{ // return null; //} /*return RewardDescription.CreateMoneyOrPercentageRewardDescription( * status, * affectedItems, * promotionData, * promotionData.PercentageDiscount, * GetRewardDescriptionText(affectedItems, status, promotionData));*/ #endregion #endregion } // end RewardDescription