Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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);
                }
            }
        }