// GET api/values
        public IHttpActionResult Get(int page = 1, int pageSize = 20)
        {
            var list = svc.GetAll();

            IPagedList<Customer> pagedList = list.OrderBy(x => x.Name)
                .ToPagedList(page, pageSize);

            var paginationHeader = new
            {
                TotalCount = pagedList.TotalItemCount,
                TotalPages = pagedList.PageCount
            };

            System.Web.HttpContext.Current.Response.Headers.Add("X-Pagination",
        Newtonsoft.Json.JsonConvert.SerializeObject(paginationHeader));

            return Ok(pagedList.ToList());
        }
        /// <summary>
        /// filter inovice by data range and status
        /// </summary>
        /// <param name="dateRange">AnyTime|ThisYear|ThisMonth|Last3Month|Last7Days|Last365Days</param>
        /// <param name="page"></param>
        /// <param name="pageSize"></param>
        /// <param name="status">All|Unpaid|Partial|Overdue|Paid</param>
        /// <returns></returns>
        //[Route("/{dateRange}")]
        public IHttpActionResult Get(string dateRange , [FromUri]List<string> status, int page = 1, int pageSize = 20)
        {
            DateRange.DateRangeFilter drFilter = 
                (DateRange.DateRangeFilter)Enum.Parse(typeof(DateRange.DateRangeFilter), dateRange);
            //DateRange.DateRangeFilter drFilter =(DateRange.DateRangeFilter)dateRange;

            List<Order.StatusOptions> statusList = new List<Order.StatusOptions>();
            if (status != null)
            {
                foreach (var item in status)
                {
                    Order.StatusOptions _status;

                    //Order.StatusOptions _status =
                    //(Order.StatusOptions)Enum.Parse(typeof(Order.StatusOptions), item);

                    if (Enum.TryParse(item, out _status))
                    {
                        statusList.Add(_status);
                    }
                }
            }
            else
            {
                statusList.Add(Order.StatusOptions.Unpaid);
            }

            IPagedList<Invoice> pagedList = svc.GetByFilter(statusList, null, drFilter)
               .ToPagedList(page, pageSize);

            var paginationHeader = new
            {
                TotalCount = pagedList.TotalItemCount,
                TotalPages = pagedList.PageCount
            };

            System.Web.HttpContext.Current.Response.Headers.Add("X-Pagination",
        Newtonsoft.Json.JsonConvert.SerializeObject(paginationHeader));

            return Ok(pagedList.ToList());
        }
        public IHttpActionResult Get()
        {
            InvoiceSvc svc = new InvoiceSvc();

            List<Order.StatusOptions> Open = new List<Order.StatusOptions> {
                Order.StatusOptions.Unpaid,
                Order.StatusOptions.Partial,
                Order.StatusOptions.Overdue,
            };

            List<Order.StatusOptions> Closed = new List<Order.StatusOptions> {
                Order.StatusOptions.Paid
            };

            List<Invoice> OpenInvoicesLastYear = svc.GetByFilter(Open, null, common.Helper.DateRange.DateRangeFilter.Last365Days).ToList();
            decimal OpenInvOutstandingAmount = OpenInvoicesLastYear == null ? 0 : OpenInvoicesLastYear.Sum(i => i.AmountOutstanding);
            int TotalNumOfOpenInv = OpenInvoicesLastYear == null ? 0 : OpenInvoicesLastYear.Count();

            
            decimal ReceivedAmount = svc.GetByFilter(Closed, null, common.Helper.DateRange.DateRangeFilter.Last3Month)
                .Select(c => c.AmountPaid)
                .DefaultIfEmpty()
                .Sum();
            int TotalNumOfPaidInv = svc.GetByFilter(Closed, null, common.Helper.DateRange.DateRangeFilter.Last3Month)
                .Count();


            var dashModel = new
            {
                OpenInvOutstandingAmount = OpenInvOutstandingAmount,
                TotalNumOfOpenInv = TotalNumOfOpenInv,
                ReceivedAmount = ReceivedAmount,
                TotalNumOfPaidInv = TotalNumOfPaidInv
            };
            return Ok(dashModel);
        }
        public IHttpActionResult GetYearlyTopSalesman(int year)
        {
            DateTime _yearStart = new DateTime(year, 1, 1);
            DateTime _yearEnd = new DateTime(year, 12, 31);

            var summary = from s in svc.GetAll().Where(i => i.OrderDate >= _yearStart && i.OrderDate <= _yearEnd)
                          group s by new { salesman = s.Salesman.Name } into g
                          orderby g.Key.salesman
                          select new
                          {
                              salesman = g.Key.salesman,
                              total = g.Sum(x => x.TotalAmount)
                          };

            var json = from s in summary.OrderByDescending(s => s.total).Take(10).ToList()
                       select new
                       {
                           salesman = s.salesman.TruncateLongString(20),
                           total = Decimal.Round(s.total, 0)
                       };

            decimal others_total = 0;
            if (summary.OrderByDescending(s => s.total).Skip(10).Any())
            {
                others_total = summary.OrderByDescending(s => s.total).Skip(10).Sum(s => s.total);
            }



            var others = new[]
            {
                new 
                {
                    salesman = "Others",
                    total = Decimal.Round(others_total,0)
                }
            };

            json = json.Concat(others);

            return Ok(json);
        }