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(),