コード例 #1
0
        public async Task <UserDashboardModel> GetUserDashboard()
        {
            var user = DB.Users.Find(UserId);
            UserDashboardModel dashboard = new UserDashboardModel()
            {
                Money        = new UserDashboardModel.MoneySpec <double>(),
                Reservations = new UserDashboardModel.ReservationSpec <long>()
            };

            //
            var reservations = await DB.Reservations.AsNoDbSetFilter().Where(x => x.User.Id == UserId).Select(x => new
            {
                x.DateCreated,
                x.Route.DepartureTime,
                x.Route.ArrivalTime,
                x.Cancelled
            }).ToListAsync();

            dashboard.Reservations.Total = reservations.Count;
            foreach (var r in reservations)
            {
                if (DateHelper.IsToday(r.DateCreated))
                {
                    dashboard.Reservations.Today++;
                }

                if (DateHelper.IsYesterday(r.DateCreated))
                {
                    dashboard.Reservations.Yesterday++;
                }

                if (DateHelper.IsThisWeek(r.DateCreated))
                {
                    dashboard.Reservations.Week++;
                }

                if (DateHelper.IsThisMonth(r.DateCreated))
                {
                    dashboard.Reservations.Month++;
                }

                if (!r.Cancelled)
                {
                    switch (RouteHelpers.Categorize(r.DepartureTime, r.ArrivalTime))
                    {
                    case BusRouteState.Active:
                        dashboard.Reservations.Active++;
                        break;

                    case BusRouteState.Used:
                        dashboard.Reservations.Used++;
                        break;

                    case BusRouteState.Pending:
                        dashboard.Reservations.Pending++;
                        break;
                    }
                }
            }

            //
            var transactions = await DB.Transactions.Where(x => x.Wallet.User.Id == UserId).Select(x => new { x.DateCreated, x.IdealAmount, x.Type, x.Status }).AsNoTracking().ToListAsync();

            var successfulTxn = transactions.Where(x => x.Status == TransactionStatus.Successful &&
                                                   x.Type == TransactionType.Charge);

            dashboard.Money.Total = successfulTxn.Count() == 0 ? 0 : successfulTxn.Sum(x => x.IdealAmount);

            foreach (var t in successfulTxn)
            {
                if (DateHelper.IsToday(t.DateCreated))
                {
                    dashboard.Money.Today += t.IdealAmount;
                }

                if (DateHelper.IsYesterday(t.DateCreated))
                {
                    dashboard.Money.Yesterday += t.IdealAmount;
                }

                if (DateHelper.IsThisWeek(t.DateCreated))
                {
                    dashboard.Money.Week += t.IdealAmount;
                }

                if (DateHelper.IsThisMonth(t.DateCreated))
                {
                    dashboard.Money.Month += t.IdealAmount;
                }
            }

            var refundedTxn = transactions.Where(x => x.Type == TransactionType.Refund && x.Status == TransactionStatus.Successful);

            dashboard.Money.Refunded = refundedTxn.Count() == 0 ? 0 : refundedTxn.Sum(x => x.IdealAmount);

            return(dashboard);
        }
コード例 #2
0
        public async Task <AdminDashboardModel> GetAdminDashboard()
        {
            AdminDashboardModel dashboard = new AdminDashboardModel()
            {
                Buses        = new AdminDashboardModel.BusSpec(),
                Money        = new AdminDashboardModel.MoneySpec <double>(),
                Reservations = new AdminDashboardModel.ReservationSpec <long>(),
                Routes       = new AdminDashboardModel.RoutesSpec(),
                Users        = new AdminDashboardModel.UsersSpec()
            };

            //
            var reservations = DB.Reservations.Select(x => new
            {
                x.DateCreated,
                x.Cancelled,
                x.Route.DepartureTime,
                x.Route.ArrivalTime
            }).AsNoTracking().Future();

            var users = DB.Users.Where(x => x.Claims.FirstOrDefault(t => t.ClaimType == ClaimTypes.Role).Value == UserRoles.User).Select(x => new
            {
                x.DateCreated,
                x.EmailConfirmed,
                x.PhoneConfirmed,
                x.LockedOut,
            }).AsNoTracking().Future();

            var buses = DB.Buses.Select(x => new
            {
                x.DateCreated,
                Routes = x.Routes.Select(t => new { t.DateCreated, t.ArrivalTime, t.DepartureTime })
            }).AsNoTracking().Future();

            var transactions = DB.Transactions.Select(x => new { x.DateCreated, x.Status, x.Type, x.IdealAmount }).AsNoTracking().Future();

            var routes = DB.Routes.Select(x => new { x.DateCreated, x.ArrivalTime, x.DepartureTime }).AsNoTracking().Future();

            //
            var qReservations = await reservations.ToListAsync();

            dashboard.Reservations.Total = qReservations.Count;
            foreach (var r in qReservations)
            {
                if (DateHelper.IsToday(r.DateCreated))
                {
                    dashboard.Reservations.Today++;
                }
                if (DateHelper.IsYesterday(r.DateCreated))
                {
                    dashboard.Reservations.Yesterday++;
                }
                if (DateHelper.IsThisWeek(r.DateCreated))
                {
                    dashboard.Reservations.Week++;
                }
                if (DateHelper.IsThisMonth(r.DateCreated))
                {
                    dashboard.Reservations.Month++;
                }

                switch (RouteHelpers.Categorize(r.DepartureTime, r.ArrivalTime))
                {
                case BusRouteState.Active:
                    dashboard.Reservations.Active++;
                    break;

                case BusRouteState.Used:
                    dashboard.Reservations.Used++;
                    break;

                case BusRouteState.Pending:
                    dashboard.Reservations.Pending++;
                    break;
                }
            }

            var qUsers = await users.ToListAsync();

            dashboard.Users.TotalUsers = qUsers.Count;
            foreach (var u in qUsers)
            {
                if ((u.EmailConfirmed || u.PhoneConfirmed) && !u.LockedOut)
                {
                    if (DateHelper.IsToday(u.DateCreated))
                    {
                        dashboard.Users.RegisteredToday++;
                    }

                    if (DateHelper.IsYesterday(u.DateCreated))
                    {
                        dashboard.Users.RegisteredYesterday++;
                    }

                    if (DateHelper.IsThisWeek(u.DateCreated))
                    {
                        dashboard.Users.RegisteredWeek++;
                    }

                    if (DateHelper.IsThisMonth(u.DateCreated))
                    {
                        dashboard.Users.RegisteredMonth++;
                    }
                }

                if (!u.EmailConfirmed)
                {
                    dashboard.Users.PendingActivation++;
                }
            }

            var qBuses = await buses.ToListAsync();

            var activeBuses = qBuses.Where(x => x.Routes.Any(t => RouteHelpers.Categorize(t.DepartureTime, t.ArrivalTime) == BusRouteState.Active));

            dashboard.Buses.Total       = qBuses.Count;
            dashboard.Buses.TotalActive = activeBuses.Count();

            foreach (var bus in qBuses)
            {
                var bRoutes = bus.Routes;
                if (bRoutes.Any(x => DateHelper.IsToday(x.DepartureTime)))
                {
                    dashboard.Buses.ActiveToday++;
                }

                if (bRoutes.Any(x => DateHelper.IsYesterday(x.DepartureTime)))
                {
                    dashboard.Buses.ActiveYesterday++;
                }

                if (bRoutes.Any(x => DateHelper.IsThisWeek(x.DepartureTime)))
                {
                    dashboard.Buses.ActiveWeek++;
                }

                if (bRoutes.Any(x => DateHelper.IsToday(x.ArrivalTime)))
                {
                    dashboard.Buses.CompleteToday++;
                }

                if (bRoutes.Any(x => DateHelper.IsYesterday(x.ArrivalTime)))
                {
                    dashboard.Buses.CompleteYesterday++;
                }

                if (bRoutes.Any(x => DateHelper.IsThisWeek(x.ArrivalTime)))
                {
                    dashboard.Buses.CompleteWeek++;
                }
            }

            var qTransactions = await transactions.ToListAsync();

            var refundedTxn = qTransactions.Where(x => x.Type == TransactionType.Refund && x.Status == TransactionStatus.Successful);

            dashboard.Money.Refunded = refundedTxn.Count() == 0 ? 0 : refundedTxn.Sum(x => x.IdealAmount);

            foreach (var t in qTransactions.Where(x => x.Status == TransactionStatus.Successful && x.Type == TransactionType.Charge))
            {
                if (DateHelper.IsToday(t.DateCreated))
                {
                    dashboard.Money.Today += t.IdealAmount;
                }

                if (DateHelper.IsYesterday(t.DateCreated))
                {
                    dashboard.Money.Yesterday += t.IdealAmount;
                }

                if (DateHelper.IsThisWeek(t.DateCreated))
                {
                    dashboard.Money.Week += t.IdealAmount;
                }

                if (DateHelper.IsThisMonth(t.DateCreated))
                {
                    dashboard.Money.Month += t.IdealAmount;
                }

                dashboard.Money.Total += t.IdealAmount;
            }

            //
            var qRoutes = await routes.ToListAsync();

            dashboard.Routes.Total = qRoutes.Count;

            return(dashboard);
        }