/// <summary>
        ///  Creates a copy of an <see cref="AnalyticValueDriverGroup"/>.
        /// </summary>
        public static AnalyticValueDriverGroup Copy(this AnalyticValueDriverGroup source)
        {
            var copy = new AnalyticValueDriverGroup();

            copy.Id         = source.Id;
            copy.Value      = source.Value;
            copy.MinOutlier = source.MinOutlier;
            copy.MaxOutlier = source.MaxOutlier;
            copy.Sort       = source.Sort;

            return(copy);
        }
        /// <summary>
        /// Creates a copy of an <see cref="AnalyticValueDriverMode"/>.
        /// </summary>
        public static AnalyticValueDriverMode Copy(this AnalyticValueDriverMode source)
        {
            var copy = new AnalyticValueDriverMode();

            copy.Key        = source.Key;
            copy.Name       = source.Name;
            copy.Title      = source.Title;
            copy.Sort       = source.Sort;
            copy.IsSelected = source.IsSelected;

            foreach (AnalyticValueDriverGroup driverGroup in source.Groups)
            {
                AnalyticValueDriverGroup driverGroupCopy = driverGroup.Copy();
                copy.Groups.Add(driverGroupCopy);
            }

            return(copy);
        }
        private static List <AnalyticValueDriver> GetAnalyticDrivers()
        {
            var result = new List <AnalyticValueDriver>();

            string[] driverNames = { "Markup", "Movement", "Days On Hand" };

            AnalyticValueDriver driver;

            for (int driverIndex = 0; driverIndex < driverNames.Length; driverIndex++)
            {
                var analyticResults = GetAnalyticResults(driverNames[driverIndex]);

                AnalyticValueDriverGroup group;
                driver = new AnalyticValueDriver {
                    Id = driverIndex + 21, Name = driverNames[driverIndex], Sort = (short)driverIndex, Results = analyticResults
                };
                //Auto generated
                var mode = new AnalyticValueDriverMode
                {
                    Name       = "Auto Generated groups",
                    Key        = 29,
                    Sort       = 0,
                    IsSelected = true
                };
                int minOutlier = 0;
                for (int groupIndex = 1; groupIndex <= 3; groupIndex++)
                {
                    minOutlier += 1;
                    group       = new AnalyticValueDriverGroup {
                        Id = groupIndex, Value = (short)groupIndex, MinOutlier = minOutlier, MaxOutlier = minOutlier + 1, Sort = (short)groupIndex
                    };
                    mode.Groups.Add(group);
                }
                driver.Modes.Add(mode);

                //User defined
                mode = new AnalyticValueDriverMode
                {
                    Name       = "User defined groups",
                    Key        = 30,
                    Sort       = 1,
                    IsSelected = false
                };
                minOutlier = 0;
                for (int groupIndex = 1; groupIndex <= 5; groupIndex++)
                {
                    minOutlier += 1;
                    group       = new AnalyticValueDriverGroup {
                        Id = groupIndex, Value = (short)groupIndex, MinOutlier = minOutlier, MaxOutlier = minOutlier + 1, Sort = (short)groupIndex
                    };
                    mode.Groups.Add(group);
                }
                driver.Modes.Add(mode);

                //Simulate mode and driver selections.
                driver.SelectedMode = driver.Modes[driverIndex % 2];
                driver.IsSelected   = (driverIndex % 2 == 0);

                result.Add(driver);
            }

            //Add in disabled "teaser" drivers for demo only.
            driver = new AnalyticValueDriver {
                Id = 97, Key = 37, Name = "Days Lead Time", IsDisplayOnly = true, Sort = 5
            };
            result.Add(driver);

            driver = new AnalyticValueDriver {
                Id = 99, Key = 38, Name = "In Stock Ratio", IsDisplayOnly = true, Sort = 6
            };
            result.Add(driver);

            driver = new AnalyticValueDriver {
                Id = 99, Key = 39, Name = "Trend", IsDisplayOnly = true, Sort = 7
            };
            result.Add(driver);

            return(result);
        }