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;
 }
예제 #3
0
 public FulfillmentInfo GetFirstFulfillment(FulfillmentStatus status)
 {
     using (var context = GetContext())
     {
         return context.FulfillmentInfoes.FirstOrDefault(i => i.FulfillmentStatusId == (byte)status);
     }
 }
 public BuyXFromCategoryGetProductForFreeResult(FulfillmentStatus status, string description, VariationContent variation, OrderGroup group)
 {
     this.Status = status;
     this.Description = description;
     this._variation = variation;
     this._orderGroup = group;
 }
예제 #5
0
        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);
        }
예제 #6
0
 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.");
        }
예제 #8
0
        public void GivenAFulfillmentStatus_WhenRemove_ThenThrowException()
        {
            var expected = new FulfillmentStatus {
                Id = 1, Name = "New"
            };

            Target.ExpectException <NotSupportedException>(() => Target.Remove(expected));
        }
예제 #9
0
 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");
        }
예제 #12
0
        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
                       ));
        }
예제 #13
0
        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)));
        }
예제 #16
0
        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)
 {
 }
예제 #19
0
 // may want to customize
 protected override RewardDescription NotFulfilledRewardDescription(FreeItemPromotion promotionData, PromotionProcessorContext context, FulfillmentStatus fulfillmentStatus)
 {
     return(base.NotFulfilledRewardDescription(promotionData, context, fulfillmentStatus));
 }
 public BuyXFromCategoryGetProductForFreeResult(FulfillmentStatus status, string description) : this(status, description, null, null)
 {
 }
        /* 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