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));
        }