public static VmRecommendationProjection Build(SmRecommendationSummary recommendation, SmRecommendationProjectionSummary model, int index)
        {
            if (model == null)
            {
                return(null);
            }

            var isMarkdown = (recommendation.ScheduleMask & (1 << index)) != 0;

            var isCsp     = true;
            var isPadding = true;

            if (recommendation.ScheduleId > 0)
            {
                var bits = recommendation.ScheduleId.GetBitIndexes().ToList();
                isCsp     = index < bits.First();
                isPadding = index > bits.Last();
            }

            return(new VmRecommendationProjection
            {
                Week = model.Week,
                Discount = model.Discount,
                Price = model.Price,
                Quantity = model.Quantity,
                IsCsp = isCsp,
                IsPadding = isPadding,
                IsMarkdown = isMarkdown
            });
        }
        public void RecommendationProjection_Correctly_Identifies_CSP_From_Schedule_Id()
        {
            var expected = new List <int> {
                1
            };

            // No markdown in week 5
            var scheduleMask = Convert.ToInt32("11101111", 2);

            // 5 markdowns, starting with CSP
            var scheduleId = Convert.ToInt32("10101110", 2);

            var recommendation = new SmRecommendationSummary
            {
                ScheduleId   = scheduleId,
                ScheduleMask = scheduleMask
            };

            var projections = new List <SmRecommendationProjectionSummary>
            {
                new SmRecommendationProjectionSummary {
                    Week = 1, Discount = 0
                },
                new SmRecommendationProjectionSummary {
                    Week = 2, Discount = 0.1M
                },
                new SmRecommendationProjectionSummary {
                    Week = 3, Discount = 0.2M
                },
                new SmRecommendationProjectionSummary {
                    Week = 4, Discount = 0.3M
                },
                new SmRecommendationProjectionSummary {
                    Week = 5, Discount = 0.3M
                },
                new SmRecommendationProjectionSummary {
                    Week = 6, Discount = 0.4M
                },
                new SmRecommendationProjectionSummary {
                    Week = 7, Discount = 0.4M
                },
                new SmRecommendationProjectionSummary {
                    Week = 8, Discount = 0.5M
                },
            };

            var result = VmRecommendationProjection.Build(recommendation, projections);

            result
            .Where(x => x.IsCsp)
            .Select(x => x.Week)
            .ShouldAllBeEquivalentTo(expected);
        }
 public static List <VmRecommendationProjection> Build(SmRecommendationSummary recommendation, List <SmRecommendationProjectionSummary> models)
 {
     return(recommendation == null || models == null ? new List <VmRecommendationProjection>() : models.Select((x, i) => Build(recommendation, x, i)).ToList());
 }