protected override async Task <ItemList <ErrandDto> > Handle(RequestContext context, GetErrandListQuery request, CancellationToken cancellationToken)
            {
                if (context.CurrentUser.Role == UserRole.Employee)
                {
                    return(await mediator.Send(new GetEmployeeErrandListQuery(), cancellationToken));
                }

                var query = GetErrandsQuery();

                var totalCount = await query.CountAsync(cancellationToken);

                var errands = await query
                              .Skip(request.Skip ?? 0)
                              .Take(request.Take ?? 10)
                              .ToListAsync(cancellationToken: cancellationToken);

                var points = errands.SelectMany(e => e.Points).Select(p => p.Point.Id).Distinct().ToList();

                var values = await db.PointFieldValues
                             .Where(c => points.Contains(c.PointId))
                             .AsNoTracking()
                             .ToListAsync(cancellationToken: cancellationToken);

                var lastValueBucket = new LastValueBucket(values);

                var items = new List <ErrandDto>();

                foreach (var group in errands.GroupBy(e => new { e.FacilityId, e.EmployeeId }))
                {
                    var notExpired = group.Where(e => e.Expired(context.CurrentDateTime) == false);
                    items.AddRange(notExpired.OrderByDescending(e => e.DueDate).Select(e => ErrandDto.Map(e, context.CurrentUser, context.CurrentDateTime, lastValueBucket, false)));

                    var expired = group.Except(notExpired).OrderByDescending(e => e.DueDate);

                    var shift = notExpired.Any(e => e.DueDate.Date == context.CurrentDateTime.Date) ? 0 : 1;

                    items.AddRange(expired.OrderByDescending(e => e.DueDate).Take(shift).Select(e => ErrandDto.Map(e, context.CurrentUser, context.CurrentDateTime, lastValueBucket, false)));
                    items.AddRange(expired.OrderByDescending(e => e.DueDate).Skip(shift).Select(e => ErrandDto.Map(e, context.CurrentUser, context.CurrentDateTime, lastValueBucket, true)));
                }

                return(new ItemList <ErrandDto>
                {
                    Items = items,
                    TotalCount = totalCount
                });
            }
            protected override async Task <ItemList <ErrandDto> > Handle(RequestContext context, GetEmployeeErrandListQuery request, CancellationToken cancellationToken)
            {
                var query = GetErrandsQuery(context.CurrentUser);

                var errands = FilterExpired(await query.ToListAsync(cancellationToken: cancellationToken), context.CurrentDateTime)
                              .OrderByDescending(e => e.DueDate)
                              .ToList();

                var points = errands.SelectMany(e => e.Points).Select(p => p.Point.Id).Distinct().ToList();

                var values = await db.PointFieldValues
                             .Where(c => points.Contains(c.PointId))
                             .AsNoTracking()
                             .ToListAsync(cancellationToken: cancellationToken);

                var lastValueBucket = new LastValueBucket(values);

                return(new ItemList <ErrandDto>
                {
                    Items = errands.Select(e => ErrandDto.Map(e, context.CurrentUser, context.CurrentDateTime, lastValueBucket, false)),
                    TotalCount = errands.Count
                });
            }