public IActionResult AddWorkDaySpan(long serviceId, long chosenDateInTicks, string returnUrl = "/") { var context = _serviceProvider.GetRequiredService <AppointmentJournalContext>(); var userId = _userManager.GetUserId(User); var addresses = context.Addresses.Where(x => x.ProducerId == userId).Select(x => new SelectListItem { Value = x.Id.ToString(), Text = x.AddressValue }).ToList(); var chosenDate = new DateTime(chosenDateInTicks); var model = new AddWorkDaySpanViewModel() { ChosenDate = chosenDate, ServiceId = serviceId, Addresses = addresses, ReturnUrl = returnUrl }; return(View(model)); }
public IActionResult AddWorkDaySpan(AddWorkDaySpanViewModel model) { if (ModelState.IsValid) { if (model.BeginHour >= model.EndHour) { ModelState.AddModelError("", "Время конца периода должно быть не меньше времени начала"); return(View(model)); } var modelBeginTime = new DateTime(model.ChosenDate.Year, model.ChosenDate.Month, model.ChosenDate.Day, model.BeginHour, 0, 0); var modelEndTime = new DateTime(model.ChosenDate.Year, model.ChosenDate.Month, model.ChosenDate.Day, model.EndHour, 0, 0); var context = _serviceProvider.GetRequiredService <AppointmentJournalContext>(); var userId = _userManager.GetUserId(User); var service = context.Services .Include(x => x.WorkDaysTimeSpans) .ThenInclude(x => x.WorkDay).SingleOrDefault(s => s.Id == model.ServiceId & s.ProducerId == userId); // периоды времени для заданного сервиса и выбранного дня var timeSpansForChosenDay = service.WorkDaysTimeSpans.Where(ts => ts.WorkDay.Date.Date == model.ChosenDate.Date.Date).ToList(); WorkDay workDay = null; if (timeSpansForChosenDay.Count == 0) { workDay = new WorkDay() { Date = model.ChosenDate, IsEnabled = false, ProducerId = userId }; } else { workDay = timeSpansForChosenDay.GroupBy(x => x.WorkDay).SingleOrDefault()?.Key; if (workDay == null) { throw new Exception("workDay = null"); } // проверка периодов рабочего времени на перекрытие var overlapFlag = timeSpansForChosenDay.Any(x => (x.BeginTime.Hour <= modelBeginTime.Hour & x.EndTime.Hour >= modelBeginTime.Hour) || (x.BeginTime.Hour <= modelEndTime.Hour & x.EndTime.Hour >= modelEndTime.Hour)); if (overlapFlag) { ModelState.AddModelError("", "Заданный период перекрывает существующие периоды"); return(View(model)); } } var address = context.Addresses.Include(x => x.WorkDaysTimeSpans).SingleOrDefault(x => x.ProducerId == userId & x.Id == model.AddressId); var workDayTimeSpan = new WorkDaysTimeSpan() { BeginTime = modelBeginTime, EndTime = modelEndTime, WorkDay = workDay, Address = address }; service.WorkDaysTimeSpans.Add(workDayTimeSpan); context.SaveChanges(); } return(Redirect(model.ReturnUrl)); }