public async Task <IEnumerable <AvailableBookingTermDto> > Handle(GetAvailableBookingTermsQuery request, CancellationToken cancellationToken) { var dateFrom = request.DateFrom > DateTime.Now ? request.DateFrom : DateTime.Now; var duration = await offerRepository.GetOfferDuration(request.FacilityId, request.OfferId); if (duration == 0) { throw new Exception("Offer not found."); } var availabilities = await scheduleRepository.GetAllAvailabilities(dateFrom, request.DateTo, request.FacilityId); var bookedTerms = await bookingRepository.GetBookedTerms(request.FacilityId, dateFrom, request.DateTo); var employeeIds = availabilities.Select(a => a.EmployeeId).Distinct().ToList(); // TODO: load employee ids from persisted storage after implementation of employee created event var employeeBookedTerms = bookedTerms.ToLookup(b => b.EmployeeId); var minutesChunk = 60 / request.BookingRules.HourChunkCount; var dateConst = dateFrom.Trim(TimeSpan.TicksPerHour); if (dateConst <= DateTime.Now) { dateConst = dateConst.AddMinutes(minutesChunk); } var dict = BuildTermDict(duration, availabilities, employeeBookedTerms, minutesChunk, dateConst); return(BuildResultList(employeeIds, dict).OrderBy(d => d.Date)); }