public async Task CalculateStatistics() { // todo loop all users. var allUsersQuery = DocumentDbBase.DocumentStore.GetItems <ApplicationUser>(x => x.Type == DocumentDbType.User); var allUsers = allUsersQuery.ToList(); foreach (var applicationUser in allUsers) { //start with a clean slate for each user applicationUser.Statistics = new Statistics(); var userOrderHistoriesQuery = DocumentDbBase.DocumentStore.GetItems <UserOrderHistory>(x => x.UserId == applicationUser.UserId && x.Type == DocumentDbType.UserHistory); var userOrderHistories = userOrderHistoriesQuery.ToList(); foreach (var userOrderHistory in userOrderHistories) { var monthlyTotal = applicationUser.Statistics.MonthlyTotals.FirstOrDefault(x => x.MonthDate == x.ParseMonth(userOrderHistory.OrderTime)); if (monthlyTotal == null) { monthlyTotal = new MonthlyTotal(userOrderHistory.OrderTime); applicationUser.Statistics.MonthlyTotals.Add(monthlyTotal); } var yearlyTotal = applicationUser.Statistics.YearlyTotals.FirstOrDefault(x => x.YearDate == x.ParseYear(userOrderHistory.OrderTime)); if (yearlyTotal == null) { yearlyTotal = new YearlyTotal(userOrderHistory.OrderTime); applicationUser.Statistics.YearlyTotals.Add(yearlyTotal); } var weeklyTotal = applicationUser.Statistics.WeeklyTotals.FirstOrDefault(x => x.WeekDate == x.ParseWeek(userOrderHistory.OrderTime)); if (weeklyTotal == null) { weeklyTotal = new WeeklyTotal(userOrderHistory.OrderTime); applicationUser.Statistics.WeeklyTotals.Add(weeklyTotal); } var dailyTotal = applicationUser.Statistics.DayTotals.FirstOrDefault(x => x.DayDate == x.ParseDay(userOrderHistory.OrderTime)); if (dailyTotal == null) { dailyTotal = new DayTotal(userOrderHistory.OrderTime); applicationUser.Statistics.DayTotals.Add(dailyTotal); } foreach (var entry in userOrderHistory.Entries) { if (_pastaEntriesList.Contains(entry.Id)) { yearlyTotal.PastaOrderCount += 1; } if (_healtyEntriesList.Contains(entry.Id)) { weeklyTotal.HealthyOrderCount += 1; } yearlyTotal.OrderCount += 1; yearlyTotal.Amount += entry.Price; weeklyTotal.OrderCount += 1; weeklyTotal.Amount += entry.Price; monthlyTotal.OrderCount += 1; monthlyTotal.Amount += entry.Price; dailyTotal.Amount += entry.Price; dailyTotal.OrderCount += 1; // calculate badges DateTime orderTime = DateTime.Parse("01/01/2001 10:00:00"); if (userOrderHistory.OrderTime < DateTime.Parse("12/06/2017 10:00:00")) { orderTime = DateTime.Parse("01/01/2001 9:00:00"); } BadgeService.ExtractOrderBadges(applicationUser, userOrderHistory, orderTime); } applicationUser.Statistics.AppTotalSpend += userOrderHistory.FinalPrice; await DocumentDbBase.DocumentStore.UpsertDocument(userOrderHistory); } var userPrepaysQuery = DocumentDbBase.DocumentStore.GetItems <UserBalanceAudit>(x => x.UserId == applicationUser.UserId && x.Type == DocumentDbType.UserBalanceAudit); var userPrepays = userPrepaysQuery.ToList(); foreach (var prepay in userPrepays) { foreach (var audit in prepay.Audits) { // there might be a difference in prepayedTotal as in first versions this was not been audited. applicationUser.Statistics.PrepayedTotal += audit.Amount; } } // remove historical data var daysToDelete = applicationUser.Statistics.DayTotals.Where(x => x.DayDate != x.ParseDay(DateTime.UtcNow)).ToList(); foreach (var dayToDelete in daysToDelete) { applicationUser.Statistics.DayTotals.Remove(dayToDelete); } var weeksToDelete = applicationUser.Statistics.WeeklyTotals.Where(x => x.WeekDate != x.ParseWeek(DateTime.UtcNow)).ToList(); foreach (var weekToDelete in weeksToDelete) { applicationUser.Statistics.WeeklyTotals.Remove(weekToDelete); } var monthsToDelete = applicationUser.Statistics.MonthlyTotals.Where(x => x.MonthDate != x.ParseMonth(DateTime.UtcNow)).ToList(); foreach (var monthToDelete in monthsToDelete) { applicationUser.Statistics.MonthlyTotals.Remove(monthToDelete); } var yearsToDelete = applicationUser.Statistics.YearlyTotals.Where(x => x.YearDate != x.ParseYear(DateTime.UtcNow)).ToList(); foreach (var yearToDelete in yearsToDelete) { applicationUser.Statistics.YearlyTotals.Remove(yearToDelete); } // save document await DocumentDbBase.DocumentStore.UpsertDocument(applicationUser); } }
private void CalculateStatistics(ApplicationUser applicationUser, Domain.Entities.DocumentDb.UserOrderHistory userOrderHistory) { if (!userOrderHistory.StatisticsProcessed) { var monthlyTotal = applicationUser.Statistics.MonthlyTotals.FirstOrDefault(x => x.MonthDate == x.ParseMonth(userOrderHistory.OrderTime)); if (monthlyTotal == null) { monthlyTotal = new MonthlyTotal(userOrderHistory.OrderTime); applicationUser.Statistics.MonthlyTotals.Add(monthlyTotal); } var yearlyTotal = applicationUser.Statistics.YearlyTotals.FirstOrDefault(x => x.YearDate == x.ParseYear(userOrderHistory.OrderTime)); if (yearlyTotal == null) { yearlyTotal = new YearlyTotal(userOrderHistory.OrderTime); applicationUser.Statistics.YearlyTotals.Add(yearlyTotal); } var weeklyTotal = applicationUser.Statistics.WeeklyTotals.FirstOrDefault(x => x.WeekDate == x.ParseWeek(userOrderHistory.OrderTime)); if (weeklyTotal == null) { weeklyTotal = new WeeklyTotal(userOrderHistory.OrderTime); applicationUser.Statistics.WeeklyTotals.Add(weeklyTotal); } var dailyTotal = applicationUser.Statistics.DayTotals.FirstOrDefault(x => x.DayDate == x.ParseDay(userOrderHistory.OrderTime)); if (dailyTotal == null) { dailyTotal = new DayTotal(userOrderHistory.OrderTime); applicationUser.Statistics.DayTotals.Add(dailyTotal); } foreach (var entry in userOrderHistory.Entries) { if (entry.Pasta) { yearlyTotal.PastaOrderCount += 1; } if (entry.Healthy) { weeklyTotal.HealthyOrderCount += 1; } yearlyTotal.OrderCount += 1; yearlyTotal.Amount += entry.FinalPrice; weeklyTotal.OrderCount += 1; weeklyTotal.Amount += entry.FinalPrice; monthlyTotal.OrderCount += 1; monthlyTotal.Amount += entry.FinalPrice; dailyTotal.Amount += entry.FinalPrice; dailyTotal.OrderCount += 1; } applicationUser.Statistics.AppTotalSpend += userOrderHistory.FinalPrice; userOrderHistory.StatisticsProcessed = true; // cleanup old data var daysToDelete = applicationUser.Statistics.DayTotals.Where(x => x.DayDate != x.ParseDay(DateTime.UtcNow)).ToList(); foreach (var dayToDelete in daysToDelete) { applicationUser.Statistics.DayTotals.Remove(dayToDelete); } var weeksToDelete = applicationUser.Statistics.WeeklyTotals.Where(x => x.WeekDate != x.ParseWeek(DateTime.UtcNow)).ToList(); foreach (var weekToDelete in weeksToDelete) { applicationUser.Statistics.WeeklyTotals.Remove(weekToDelete); } var monthsToDelete = applicationUser.Statistics.MonthlyTotals.Where(x => x.MonthDate != x.ParseMonth(DateTime.UtcNow)).ToList(); foreach (var monthToDelete in monthsToDelete) { applicationUser.Statistics.MonthlyTotals.Remove(monthToDelete); } var yearsToDelete = applicationUser.Statistics.YearlyTotals.Where(x => x.YearDate != x.ParseYear(DateTime.UtcNow)).ToList(); foreach (var yearToDelete in yearsToDelete) { applicationUser.Statistics.YearlyTotals.Remove(yearToDelete); } } }