public static SalesByDateGraphViewModel Build(IUnitOfWork db, PeriodType periodType, ValueType valueType)
        {
            var result = new SalesByDateGraphViewModel();
            var items  = db.Items.GetSalesInfoByDayAndMarket().ToList();

            var             labels      = new List <string>();
            IList <int>     unitSeries  = new List <int>();
            IList <decimal> priceSeries = new List <decimal>();

            var startDate = DateHelper.GetAppNowTime().Date;

            if (periodType == PeriodType.Day)
            {
                startDate = DateHelper.GetAppNowTime().Date;
            }
            if (periodType == PeriodType.Week)
            {
                startDate = startDate.AddDays(-7);
            }
            if (periodType == PeriodType.Month)
            {
                startDate = startDate.AddDays(-31);
            }

            var periodItems = items.Where(it => it.Date >= startDate).ToList();

            periodItems.Where(pi => pi.Market == (int)MarketType.eBay).ToList().ForEach(pi => pi.MarketplaceId = null);

            var byMarket = periodItems.GroupBy(i => new { i.Market, i.MarketplaceId })
                           .Select(i => new
            {
                Market        = i.Key.Market,
                MarketplaceId = i.Key.MarketplaceId,
                Price         = i.Sum(j => j.Price),
                Quantity      = i.Sum(j => j.Quantity)
            });

            foreach (var item in byMarket)
            {
                labels.Add(MarketHelper.GetMarketName(item.Market, item.MarketplaceId));
                unitSeries.Add(item.Quantity);
                priceSeries.Add(item.Price);
            }
            result.PriceSeries = new [] { priceSeries };
            result.UnitSeries  = new [] { unitSeries };
            result.Labels      = new[] { labels };
            return(result);
        }
        public static SalesByDateGraphViewModel Build(IUnitOfWork db, PeriodType periodType, ValueType valueType)
        {
            var result = new SalesByDateGraphViewModel();
            var items  = db.Items.GetSalesInfoByDayAndItemStyle().ToList();

            var             labels      = new List <string>();
            IList <int>     unitSeries  = new List <int>();
            IList <decimal> priceSeries = new List <decimal>();

            var startDate = DateHelper.GetAppNowTime().Date;

            if (periodType == PeriodType.Day)
            {
                startDate = DateHelper.GetAppNowTime().Date;
            }
            if (periodType == PeriodType.Week)
            {
                startDate = startDate.AddDays(-7);
            }
            if (periodType == PeriodType.Month)
            {
                startDate = startDate.AddDays(-31);
            }

            var periodItems = items.Where(it => it.Date >= startDate).ToList();

            var byMarket = periodItems.GroupBy(i => new { i.ItemStyle })
                           .Select(i => new
            {
                ItemStyle = i.Key.ItemStyle,
                Price     = i.Sum(j => j.Price),
                Quantity  = i.Sum(j => j.Quantity < 0 ? 0 : j.Quantity)
            });

            foreach (var item in byMarket)
            {
                labels.Add(String.IsNullOrEmpty(item.ItemStyle) ? "n/a" : item.ItemStyle);
                unitSeries.Add(item.Quantity);
                priceSeries.Add(item.Price);
            }
            result.PriceSeries = new [] { priceSeries };
            result.UnitSeries  = new [] { unitSeries };
            result.Labels      = new [] { labels };
            return(result);
        }
        public static SalesByDateGraphViewModel Build(IUnitOfWork db, PeriodType periodType, ValueType valueType)
        {
            var result = new SalesByDateGraphViewModel();

            var statusListToExclude = valueType == ValueType.FBAOrder ? OrderStatusEnumEx.AllUnshippedWithShipped.ToList() : new List <string>();
            var items = OrderValueTypes.Contains(valueType) ? db.Orders.GetSalesInfoByDayAndMarket(statusListToExclude).ToList() :  db.Items.GetSalesInfoByDayAndMarket().ToList();

            IList <string>  labelSeries1       = new List <string>();
            IList <string>  labelSeries2       = new List <string>();
            IList <int>     unitSeries1        = new List <int>();
            IList <int>     unitSeries2        = new List <int>();
            IList <decimal> priceSeries1       = new List <decimal>();
            IList <decimal> priceSeries2       = new List <decimal>();
            IList <string>  generalLabelSeries = new List <string>();

            var startDate = DateHelper.GetAppNowTime().Date;

            if (periodType == PeriodType.Day)
            {
                var dayCount = 7 + 5;

                //decimal coefficient = 1.3M;
                decimal coefficient = 0;
                for (var i = 0; i <= 7; i++)
                {
                    var date             = startDate.AddDays(-i - 1);    //Exclude today
                    var prevDate         = date.AddYears(-1).AddDays(1); //Task: lets do weekly and 3 month comparison to be be compared to previous year.
                    var dateItems        = items.Where(it => it.Date == date).ToList();
                    var prevDateItems    = items.Where(it => it.Date == prevDate).ToList();
                    var currentPeriodSum = dateItems.Sum(d => d.Quantity);
                    var prevPeriodSum    = prevDateItems.Sum(d => d.Quantity);
                    if (prevPeriodSum != 0)
                    {
                        coefficient += (currentPeriodSum - prevPeriodSum) / (decimal)prevPeriodSum;
                    }
                }
                coefficient = 1 + coefficient / 7;

                startDate = startDate.AddDays(5);
                for (int i = dayCount - 1; i >= 0; i--)
                {
                    var date          = startDate.AddDays(-i - 1);    //Exclude today
                    var prevDate      = date.AddYears(-1).AddDays(1); //Task: lets do weekly and 3 month comparison to be be compared to previous year.
                    var dateItems     = items.Where(it => it.Date == date).ToList();
                    var prevDateItems = items.Where(it => it.Date == prevDate).ToList();

                    if (i >= 5)
                    {
                        priceSeries1.Add(dateItems.Sum(d => d.Price));
                    }
                    else
                    {
                        priceSeries1.Add(prevDateItems.Sum(d => d.Price) * coefficient);
                    }
                    priceSeries2.Add(prevDateItems.Sum(d => d.Price));

                    if (i >= 5)
                    {
                        unitSeries1.Add(dateItems.Sum(d => d.Quantity));
                    }
                    else
                    {
                        unitSeries1.Add((int)((decimal)prevDateItems.Sum(d => d.Quantity) * coefficient));
                    }
                    unitSeries2.Add(prevDateItems.Sum(d => d.Quantity));

                    labelSeries1.Add(date.ToString("MM/dd/yyyy"));
                    labelSeries2.Add(prevDate.ToString("MM/dd/yyyy"));
                    generalLabelSeries.Add(date.ToString("MM/dd"));
                }
            }

            if (periodType == PeriodType.Week)
            {
                var weekCount = 12;
                for (int i = weekCount - 1; i >= 0; i--)
                {
                    var dateTo        = startDate.AddDays(-i * 7 - 1); //Exclude today
                    var dateFrom      = dateTo.AddDays(-7);
                    var prevDateTo    = dateTo.AddYears(-1);           //Task: lets do weekly and 3 month comparison to be be compared to previous year.
                    var prevDateFrom  = prevDateTo.AddDays(-7);
                    var dateItems     = items.Where(it => it.Date < dateTo && it.Date >= dateFrom).OrderBy(x => x.Date).ToList();
                    var prevDateItems = items.Where(it => it.Date < prevDateTo && it.Date >= prevDateFrom).ToList();

                    priceSeries1.Add(dateItems.Sum(d => d.Price));
                    priceSeries2.Add(prevDateItems.Sum(d => d.Price));

                    unitSeries1.Add(dateItems.Sum(d => d.Quantity));
                    unitSeries2.Add(prevDateItems.Sum(d => d.Quantity));

                    labelSeries1.Add(dateFrom.ToString("yyyy") + ": " + dateFrom.ToString("MM/dd") + "-" + dateTo.ToString("MM/dd"));
                    labelSeries2.Add(prevDateFrom.ToString("yyyy") + ": " + prevDateFrom.ToString("MM/dd") + "-" + prevDateTo.ToString("MM/dd"));
                    generalLabelSeries.Add(dateFrom.ToString("MM/dd") + "-" + dateTo.ToString("MM/dd"));
                }
            }

            if (periodType == PeriodType.Month)
            {
                var monthCount = 12;
                for (int i = monthCount; i > 0; i--)
                {
                    var date          = startDate.AddMonths(-i);
                    var prevDate      = date.AddMonths(-monthCount);
                    var dateItems     = items.Where(it => it.Date.Month == date.Month && it.Date.Year == date.Year).ToList();
                    var prevDateItems = items.Where(it => it.Date.Month == prevDate.Month && it.Date.Year == prevDate.Year).ToList();

                    priceSeries1.Add(dateItems.Sum(d => d.Price));
                    priceSeries2.Add(prevDateItems.Sum(d => d.Price));

                    unitSeries1.Add(dateItems.Sum(d => d.Quantity));
                    unitSeries2.Add(prevDateItems.Sum(d => d.Quantity));

                    labelSeries1.Add(date.ToString("MM/yyyy"));
                    labelSeries2.Add(prevDate.ToString("MM/yyyy"));
                    generalLabelSeries.Add(date.ToString("MM/yyyy"));
                }
            }


            result.PriceSeries = new[] { priceSeries1, priceSeries2 };
            result.UnitSeries  = new[] { unitSeries1, unitSeries2 };
            result.Labels      = new[] { labelSeries1, labelSeries2, generalLabelSeries };

            foreach (var series in result.PriceSeries)
            {
                for (var i = 0; i < series.Count; i++)
                {
                    series[i] = Math.Round(series[i]);
                }
            }

            return(result);
        }