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); }
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); }
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)); }
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); }
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); }
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]); } }
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); }
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()); } }