public async Task <ActionResult <int> > Count([FromBody] CustomerReport_CustomerReportFilterDTO filter)
        {
            if (UnAuthorization)
            {
                return(Forbid());
            }
            var query = DataContext.Customer.Where(p => !p.DeletedAt.HasValue);

            //from q in DataContext.Customer select q;
            if (filter.Code != null)
            {
                query = query.Where(p => p.Code, filter.Code);
            }
            if (filter.Name != null)
            {
                query = query.Where(p => p.Name, filter.Name);
            }
            if (filter.CreatedAt != null)
            {
                query = query.Where(p => p.CreatedAt, filter.CreatedAt);
            }
            if (filter.CustomerTypeId != null)
            {
                query = query.Where(p => p.CustomerTypeId, filter.CustomerTypeId);
            }

            return(query.Count());
        }
        public async Task <ActionResult <object> > List([FromBody] CustomerReport_CustomerReportFilterDTO filter)
        {
            if (UnAuthorization)
            {
                return(Forbid());
            }
            var query = DataContext.Customer.Where(p => !p.DeletedAt.HasValue);

            //from q in DataContext.Customer select q;
            if (filter.Code != null)
            {
                query = query.Where(p => p.Code, filter.Code);
            }
            if (filter.Name != null)
            {
                query = query.Where(p => p.Name, filter.Name);
            }
            if (filter.CreatedAt != null)
            {
                query = query.Where(p => p.CreatedAt, filter.CreatedAt);
            }
            if (filter.CustomerTypeId != null)
            {
                query = query.Where(p => p.CustomerTypeId, filter.CustomerTypeId);
            }

            return(query.Skip(filter.Skip).Take(filter.Take).Select(p => new
            {
                Code = p.Code,
                Name = p.Name,
                CustomerTypeName = p.CustomerType == null ? null : p.CustomerType.Name,
                CountTicket = p.Tickets.Count(),
                CountCallLog = DataContext.CallLog.Where(x =>
                                                         x.EntityReferenceId == Enums.EntityReferenceEnum.CUSTOMER_RETAIL.Id ||
                                                         x.EntityReferenceId == Enums.EntityReferenceEnum.CUSTOMER_AGENT.Id ||
                                                         x.EntityReferenceId == Enums.EntityReferenceEnum.CUSTOMER_PROJECT.Id ||
                                                         x.EntityReferenceId == Enums.EntityReferenceEnum.CUSTOMER_EXPORT.Id
                                                         ).Count(),
                CountOpportunity = 0,
                CountOrderQuote = 0,
                CountOrder = DataContext.CustomerSalesOrder.Where(p => p.CustomerId == p.Id).Count()
                             + DataContext.DirectSalesOrder.Where(p => p.BuyerStoreId == p.Id).Count(),
                RevenueOrder = DataContext.CustomerSalesOrder.Where(p => p.CustomerId == p.Id).Sum(p => p.Total)
                               + DataContext.DirectSalesOrder.Where(p => p.BuyerStoreId == p.Id).Sum(p => p.Total),
                CountContract = p.Contracts.Count(),
                RevenueContract = p.Contracts.Sum(p => p.Total),
            }).ToList());
        }
        public async Task <ActionResult> Export([FromBody] CustomerReport_CustomerReportFilterDTO filter)
        {
            if (UnAuthorization)
            {
                return(Forbid());
            }
            var info_vn = System.Globalization.CultureInfo.GetCultureInfo("vi-VN");
            var query   = DataContext.Customer.Where(p => !p.DeletedAt.HasValue);

            //from q in DataContext.Customer select q;
            if (filter.Code != null)
            {
                query = query.Where(p => p.Code, filter.Code);
            }
            if (filter.Name != null)
            {
                query = query.Where(p => p.Name, filter.Name);
            }
            if (filter.CreatedAt != null)
            {
                query = query.Where(p => p.CreatedAt, filter.CreatedAt);
            }
            if (filter.CustomerTypeId != null)
            {
                query = query.Where(p => p.CustomerTypeId, filter.CustomerTypeId);
            }
            var data = query.Select(p => new CustomerReportExport
            {
                Code             = p.Code,
                Name             = p.Name,
                CustomerTypeName = p.CustomerType == null ? null : p.CustomerType.Name,
                CountTicket      = p.Tickets.Count().ToString(),
                CountCallLog     = DataContext.CallLog.Where(x =>
                                                             x.EntityReferenceId == Enums.EntityReferenceEnum.CUSTOMER_RETAIL.Id ||
                                                             x.EntityReferenceId == Enums.EntityReferenceEnum.CUSTOMER_AGENT.Id ||
                                                             x.EntityReferenceId == Enums.EntityReferenceEnum.CUSTOMER_PROJECT.Id ||
                                                             x.EntityReferenceId == Enums.EntityReferenceEnum.CUSTOMER_EXPORT.Id
                                                             ).Count().ToString(),
                CountOpportunity = "0",
                CountOrderQuote  = "0",
                CountOrder       = (DataContext.CustomerSalesOrder.Where(p => p.CustomerId == p.Id).Count()
                                    + DataContext.DirectSalesOrder.Where(p => p.BuyerStoreId == p.Id).Count()).ToString(),
                RevenueOrder = (DataContext.CustomerSalesOrder.Where(p => p.CustomerId == p.Id).Sum(p => p.Total)
                                + DataContext.DirectSalesOrder.Where(p => p.BuyerStoreId == p.Id).Sum(p => p.Total)).ToString(),
                CountContract   = p.Contracts.Count().ToString(),
                RevenueContract = p.Contracts.Sum(p => p.Total).ToString(),
                CreatedAt       = p.CreatedAt
            }).ToList();

            var maxDate = data.Max(p => p.CreatedAt).HasValue ? data.Max(p => p.CreatedAt).Value : default(DateTime);
            var minDate = data.Min(p => p.CreatedAt).HasValue ? data.Min(p => p.CreatedAt).Value : default(DateTime);

            DateTime Start = filter.CreatedAt?.GreaterEqual == null ?
                             minDate :
                             filter.CreatedAt.GreaterEqual.Value;

            DateTime End = filter.CreatedAt?.LessEqual == null ?
                           maxDate :
                           filter.CreatedAt.LessEqual.Value;

            long STT = 0;

            foreach (var item in data)
            {
                item.STT = STT + 1;
                STT++;
            }
            string path = "Templates/CustomerReport.xlsx";

            byte[]       arr    = System.IO.File.ReadAllBytes(path);
            MemoryStream input  = new MemoryStream(arr);
            MemoryStream output = new MemoryStream();
            dynamic      Data   = new ExpandoObject();

            Data.NOW   = StaticParams.DateTimeNow.ToString("dd-MM-yyyy");
            Data.Start = Start.AddHours(CurrentContext.TimeZone).ToString("dd-MM-yyyy");
            Data.End   = End.AddHours(CurrentContext.TimeZone).ToString("dd-MM-yyyy");
            Data.data  = data;

            using (var document = StaticParams.DocumentFactory.Open(input, output, "xlsx"))
            {
                document.Process(Data);
            };
            return(File(output.ToArray(), "application/octet-stream", "BaoCaoKhachHang.xlsx"));
        }