예제 #1
0
        public async Task <StatisticViewModel> ExecuteAsync(DateTime startDate, DateTime endDate)
        {
            startDate = startDate.ChangeTime(0, 0, 0, 0);
            endDate   = endDate.ChangeTime(23, 59, 59, 999);

            DateTime           now            = DateTime.Now;
            DateTime           startTimeToday = now.ChangeTime(0, 0, 0, 0);
            StatisticViewModel result         = new StatisticViewModel(startDate, endDate);

            var numOfNewCustomers = await _getNumOfNewCustomersQuery.ExecuteAsync(startDate, endDate);

            var ordersResult = await _getListOrderQuery.ExecuteAsync(0, 0, null, null, startDate, endDate, null);

            var todayOrdersResult = await _getListOrderQuery.ExecuteAsync(0, 0, null, null, startTimeToday, now, null);

            result.NumOfNewCustomers   = numOfNewCustomers;
            result.NumOfNewOrders      = ordersResult.Items.Count();
            result.NumOfNewInvoices    = ordersResult.Items.Where(n => n.CompletedTime.HasValue).Count();
            result.FeaturedCategories  = GetFeaturedCategories(ordersResult.Items.Where(n => n.CompletedTime.HasValue));
            result.BestSellingProducts = GetBestSellingProducts(ordersResult.Items.Where(n => n.CompletedTime.HasValue));
            result.CurrentOrder        = GetCurrentOrder(todayOrdersResult.Items);
            result.RevenueOverview     = GetRevenueOverview(todayOrdersResult.Items);
            result.LatestOrders        = GetLatestOrders(todayOrdersResult.Items);

            return(result);
        }
예제 #2
0
        public async Task <RevenueByCategoryViewModel> ExecuteAsync(DateTime startDate, DateTime endDate)
        {
            var distanceDays = DateTimeExtension.CountDays(startDate, endDate);
            var result       = new RevenueByCategoryViewModel();
            var ordersResult = await _getListOrderQuery.ExecuteAsync(0, 0, (int)OrderStatus.Completed, null, startDate, endDate, null);

            var ordersInPastResult = await _getListOrderQuery.ExecuteAsync(0, 0, (int)OrderStatus.Completed, null, startDate.AddDays(-distanceDays), endDate.AddDays(-distanceDays), null);

            var orderDetails = ordersResult.Items.SelectMany(n => n.OrderDetails).Where(n => n.CategoryId.HasValue).ToList();
            var totalRevenue = orderDetails.Sum(n => n.Quantity * n.Price);
            var categories   = await _orderDetailsRepository.TableNoTracking
                               .Where(n => n.CategoryId.HasValue)
                               .Select(n => new CategoryViewModel()
            {
                CategoryId   = n.CategoryId ?? 0,
                CategoryName = n.CategoryName
            })
                               .Distinct()
                               .ToListAsync();

            result.StartDate        = startDate;
            result.EndDate          = endDate;
            result.Details          = GetRevenueByCategoryDetail(categories, ordersResult.Items, ordersInPastResult.Items);
            result.CategoryRevenues = orderDetails
                                      .GroupBy(n => n.CategoryId)
                                      .Select(n => new CategoryRevenueViewModel()
            {
                CategoryId   = n.Key ?? 0,
                CategoryName = n.FirstOrDefault()?.CategoryName,
                TotalRevenue = n.Sum(x => x.Quantity * x.Price),
                Percent      = totalRevenue > 0 ? Math.Round(n.Sum(x => x.Quantity * x.Price) / totalRevenue * 100, 2) : 0
            }).ToList();

            return(result);
        }
예제 #3
0
        public async Task <IActionResult> GetListOrderAsync(int page, int pageSize, int?statusCode, int?voucherId,
                                                            DateTime?startTime, DateTime?endTime, string searchString, string storeIds)
        {
            int[] listStoreIds = null;
            if (!string.IsNullOrEmpty(storeIds))
            {
                listStoreIds = storeIds.Split(",").Select(int.Parse).ToArray();
            }

            var result = await _getListOrderQuery.ExecuteAsync(page, pageSize, statusCode, voucherId, startTime, endTime, searchString, listStoreIds);

            return(new ObjectResult(result));
        }
예제 #4
0
        public async Task <RevenueByStoreViewModel> ExecuteAsync(DateTime startDate, DateTime endDate)
        {
            var distanceDays = DateTimeExtension.CountDays(startDate, endDate);
            var result       = new RevenueByStoreViewModel();
            var ordersResult = await _getListOrderQuery.ExecuteAsync(0, 0, (int)OrderStatus.Completed, null, startDate, endDate, null);

            var ordersInPastResult = await _getListOrderQuery.ExecuteAsync(0, 0, (int)OrderStatus.Completed, null, startDate.AddDays(-distanceDays), endDate.AddDays(-distanceDays), null);

            var totalRevenue = ordersResult.Items.Sum(n => n.Total);
            var stores       = await _orderRepository.TableNoTracking
                               .Select(n => new StoreViewModel()
            {
                Id   = n.StoreId,
                Name = n.StoreName
            })
                               .Distinct()
                               .ToListAsync();

            stores = stores.GroupBy(n => n.Id).Select(n => n.First()).ToList();

            result.StartDate     = startDate;
            result.EndDate       = endDate;
            result.Details       = GetRevenueByStoreDetail(stores, ordersResult.Items, ordersInPastResult.Items);
            result.StoreRevenues = ordersResult.Items
                                   .GroupBy(n => n.StoreId)
                                   .Select(n => new StoreRevenueViewModel()
            {
                StoreId      = n.Key,
                StoreName    = n.FirstOrDefault()?.StoreName,
                RevenueByDay = GetStoreRevenueByDay(n, startDate, endDate),
                TotalRevenue = (int)n.Sum(x => x.Total),
                Percent      = totalRevenue > 0 ? Math.Round(n.Sum(x => x.Total) / totalRevenue * 100, 2) : 0
            }).ToList();

            return(result);
        }
예제 #5
0
        public async Task <BestSellingProductsViewModel> ExecuteAsync(DateTime startDate, DateTime endDate)
        {
            var distanceDays = DateTimeExtension.CountDays(startDate, endDate);
            var result       = new BestSellingProductsViewModel();
            var ordersResult = await _getListOrderQuery.ExecuteAsync(0, 0, (int)OrderStatus.Completed, null, startDate, endDate, null);

            var ordersInPastResult = await _getListOrderQuery.ExecuteAsync(0, 0, (int)OrderStatus.Completed, null, startDate.AddDays(-distanceDays), endDate.AddDays(-distanceDays), null);

            var products = await _orderDetailsRepository.TableNoTracking
                           .Select(n => new ProductChartViewModel()
            {
                ProductId   = n.ProductId,
                ProductName = n.ProductName
            })
                           .Distinct()
                           .ToListAsync();

            result.StartDate = startDate;
            result.EndDate   = endDate;
            result.Details   = GetRevenueByProductDetail(products, ordersResult.Items, ordersInPastResult.Items);
            result.CalculateChartData();

            return(result);
        }
예제 #6
0
        public async Task <byte[]> ExecuteAsync(int exportType = 0, string listInvoiceId = "", string search = "")
        {
            try
            {
                byte[]           result;
                string[]         listInvoiceIds;
                List <CsmsOrder> listInvoiceQuery = new List <CsmsOrder>();

                switch (exportType)
                {
                case (int)ExportType.SelectedItems:
                    listInvoiceIds   = !string.IsNullOrEmpty(listInvoiceId) ? listInvoiceId.Split(',') : new string[0];
                    listInvoiceQuery = await GetSelectedInvoice(listInvoiceIds);

                    break;

                case (int)ExportType.SearchResult:
                    string[] searchCondition = search != null?search.Split(';') : new string[0];

                    int?     statusSelected = searchCondition[0].TryConvertToInt();
                    int?     voucherId      = searchCondition[1].TryConvertToInt();
                    DateTime?startDate      = searchCondition[2].TryPrase();
                    DateTime?endDate        = searchCondition[3].TryPrase();

                    int[] storeIds = null;
                    if (!string.IsNullOrEmpty(searchCondition[5]))
                    {
                        storeIds = searchCondition[5].Split(',').Select(int.Parse).ToArray();
                    }

                    var data = await _getListOrderQuery.ExecuteAsync(0, 0, statusSelected, voucherId, startDate, endDate, searchCondition[4], storeIds);

                    listInvoiceQuery = data.Items.ToList();
                    break;
                }

                result = ExportInvoiceList(listInvoiceQuery);
                return(result);
            }
            catch (Exception)
            {
                return(new byte[0]);
            }
        }
예제 #7
0
        public async Task <RevenueOverviewViewModel> ExecuteAsync(DateTime startTime, DateTime endTime)
        {
            RevenueOverviewViewModel result = new RevenueOverviewViewModel();
            var ordersResult = await _getListOrderQuery.ExecuteAsync(0, 0, null, null, startTime, endTime, null);

            result.StartTime           = startTime;
            result.EndTime             = endTime;
            result.TotalProceeds       = ordersResult.Items.Where(n => n.CompletedTime.HasValue).Sum(n => n.Total);
            result.NumOfTransactions   = ordersResult.Items.Where(n => n.CompletedTime.HasValue).Count();
            result.TotalDiscount       = ordersResult.Items.Where(n => n.CompletedTime.HasValue).Sum(n => n.DiscountVoucherApplied ?? 0);
            result.AvgPerTransaction   = result.NumOfTransactions > 0 ? (int)(result.TotalProceeds / result.NumOfTransactions) : 0;
            result.NumbOfCoinsRefunded = ordersResult.Items.Where(n => n.CompletedTime.HasValue).Sum(n => n.EarnedCoins);

            if (startTime.Hour <= endTime.Hour)
            {
                for (int hour = startTime.Hour; hour <= endTime.Hour; hour++)
                {
                    var hourFilterData = ordersResult.Items.Where(n => n.CompletedTime.HasValue && n.CompletedTime?.Hour == hour);
                    result.AvgRevenuePerHour.Add(new ChartDataViewModel()
                    {
                        Key   = hour.ToString(),
                        Value = hourFilterData.Count() > 0 ? hourFilterData.Sum(n => n.Total) / hourFilterData.Count() : 0
                    });
                }
            }

            DateTime temp = startTime;

            while (temp < endTime || temp.EqualsUpToDay(endTime))
            {
                var dateFilterData = ordersResult.Items.Where(n => n.CompletedTime.HasValue && temp.EqualsUpToDay(n.CompletedTime.Value));
                result.RevenuePerDay.Add(new ChartDataViewModel()
                {
                    Key   = temp.Day.ToString() + '/' + temp.Month.ToString(),
                    Value = dateFilterData.Sum(n => n.Total)
                });

                temp = temp.AddDays(1);
            }

            return(result);
        }
예제 #8
0
        public async Task <TodayOrderViewModel> ExecuteAsync(int orderStatus, string storeIds)
        {
            try
            {
                DateTime now          = DateTime.Now;
                DateTime startDate    = now.ChangeTime(0, 0, 0, 0);
                int[]    listStoreIds = !string.IsNullOrEmpty(storeIds) ? storeIds.Split(',').Select(int.Parse).ToArray() : new int[0];

                var orders = await _getListOrderQuery.ExecuteAsync(0, 0, null, null, startDate, now, null, listStoreIds);

                TodayOrderViewModel result = new TodayOrderViewModel();
                result.TimeNow             = now;
                result.OrderStatusSelected = orderStatus;
                result.StoreIdsSelected    = listStoreIds;

                // Pending orders
                var temp = orders.Items.Where(x =>
                                              (x.Id[0] != 'T') &&
                                              (x.CookedTime == null) &&
                                              (x.ShippedTime == null) &&
                                              (x.CompletedTime == null) &&
                                              (x.CanceledTime == null));
                result.TotalPending = temp.Count();
                result.Items        = orderStatus == (int)OrderStatus.Pending ? temp.ToList() : result.Items;

                // Cooking orders
                temp = orders.Items.Where(x =>
                                          (x.Id[0] != 'T') &&
                                          (x.CookedTime.HasValue) &&
                                          (x.ShippedTime == null) &&
                                          (x.CompletedTime == null) &&
                                          (x.CanceledTime == null));
                result.TotalCooking = temp.Count();
                result.Items        = orderStatus == (int)OrderStatus.Cooking ? temp.ToList() : result.Items;

                // Shipping orders
                temp = orders.Items.Where(x =>
                                          (x.Id[0] != 'T') &&
                                          (x.CookedTime.HasValue) &&
                                          (x.ShippedTime.HasValue) &&
                                          (x.CompletedTime == null) &&
                                          (x.CanceledTime == null));
                result.TotalShipping = temp.Count();
                result.Items         = orderStatus == (int)OrderStatus.Shipping ? temp.ToList() : result.Items;

                // Canceled orders
                temp = orders.Items.Where(x => x.CanceledTime.HasValue);
                result.TotalCanceled = temp.Count();
                result.Items         = orderStatus == (int)OrderStatus.Canceled ? temp.ToList() : result.Items;

                // Completed orders
                temp = orders.Items.Where(x => x.CompletedTime.HasValue);
                result.TotalCompleted = temp.Count();
                result.Items          = orderStatus == (int)OrderStatus.Completed ? temp.ToList() : result.Items;

                if (orderStatus == (int)OrderStatus.Pending || orderStatus == (int)OrderStatus.Cooking || orderStatus == (int)OrderStatus.Shipping)
                {
                    result.Items.AddRange(orders.Items.Where(x => x.Id[0] == 'T').ToList());
                }

                return(result);
            }
            catch (Exception)
            {
                return(new TodayOrderViewModel());
            }
        }