public static ShopCalendarRange <T> FillAllDays <T>(this ShopCalendarRange <T> source) where T : BaseCalendarRecord
        {
            var totalDays = (int)(source.EndDate - source.StartDate).TotalDays + 1;

            var result = new ShopCalendarRange <T>
            {
                ShopId           = source.ShopId,
                StartDate        = source.StartDate,
                EndDate          = source.EndDate,
                ShopCalendarDays = new ShopCalendarDay <T> [totalDays],
            };

            foreach (var shopCalendarDay in source.ShopCalendarDays.OrderBy(x => x.Date))
            {
                var ind = (int)(shopCalendarDay.Date - source.StartDate).TotalDays;
                result.ShopCalendarDays[ind] = shopCalendarDay;
            }

            for (var i = 0; i < result.ShopCalendarDays.Length; i++)
            {
                if (result.ShopCalendarDays[i] == null)
                {
                    result.ShopCalendarDays[i] = new ShopCalendarDay <T>
                    {
                        ShopId             = source.ShopId,
                        Date               = source.StartDate + TimeSpan.FromDays(i),
                        WorkerCalendarDays = new WorkerCalendarDay <T> [0],
                    };
                }
            }

            return(result);
        }
 private ShopCalendarRangeBuilder(Guid shopId, DateTime from, DateTime to)
 {
     shopCalendarRange = new ShopCalendarRange <T>
     {
         ShopId           = shopId,
         StartDate        = from,
         EndDate          = to,
         ShopCalendarDays = new ShopCalendarDay <T> [0],
     };
 }
        public Dictionary <Guid, WorkingCalendarDayInfoDto[]> Convert(ShopCalendarRange <WorkerScheduleRecord> range, HashSet <Guid> workerIdSet)
        {
            return(range.ShopCalendarDays
                   .SelectMany(x => x.WorkerCalendarDays)
                   .GroupBy(x => x.WorkerId)
                   .Where(x => workerIdSet.Contains(x.Key))
                   .ToDictionary(x => x.Key, x =>
            {
                var workerDaysMap = x.ToDictionary(day => day.Date);

                return DateHelper.CreateDatesRange(range.StartDate, range.EndDate)
                .Select(date => workerDaysMap.GetOrDefault(date) ?? GetDefaultDayNew(date))
                .Select(day => mapperWrapper.Map <WorkingCalendarDayInfoDto>(day))
                .ToArray();
            }));
        }
        public RecordingInfoDto CreateInfo(
            Shop shop,
            OnlineService[] onlineServices,
            Product[] products,
            Worker[] workers,
            ShopCalendarRange <WorkerScheduleRecord> workersSchedule,
            ShopCalendarRange <ServiceCalendarRecord> serviceCalendar,
            DateTime today)
        {
            var onlineServiceIds = onlineServices.Select(x => x.ProductId).ToHashSet();
            var workerDtos       = CreateWorkers(workers.Where(x => x.IsAvailableOnline && !x.IsDeleted).ToArray(), workersSchedule.FillAllDays(), serviceCalendar.FillAllDays());
            var workerIds        = workerDtos.Select(x => x.WorkerId).ToArray();

            return(new RecordingInfoDto
            {
                Workers = workerDtos,
                Services = products.Where(x => onlineServiceIds.Contains(x.Id.Value)).Select(x => new ServiceDto
                {
                    ServiceId = x.Id.Value,
                    GroupId = Guid.TryParse(x.GroupId, out var groupId) ? groupId : Guid.Empty,
                    Name = x.Name,
                    Price = x.PricesInfo?.SellPrice,
                    Workers = workerIds,
                }).ToArray(),